OpenCV_加载一张图片

很久没有更新博客了。
今天更新一个小Demo,使用opencv,从本地读取一张图片。【先代码->演示结果->分析代码】

OpenCV 版本: opencv-3.1.0

关于环境的配置略过,大家可以搜索一下其他的教程说明。

代码:



#include "highgui.h"
int main(int argc, char* argv[])
{
    IplImage* src = cvLoadImage("01.jpg",1);//加载一张图片
    cvNamedWindow("title",1);//创建一个窗体
    cvShowImage("title", src);//在上面的窗体中显示图片
    cvWaitKey(0);//等待用户按键
    cvReleaseImage(&src);//释放图片资源
    cvDestroyWindow("title");//释放窗体资源
    return 0;

}

请准备一张01.jpg图片放在该cpp文件目录下。

运行图:
OpenCV_加载一张图片_第1张图片

其中IplImage结构如下:

typedef struct _IplImage
{
    int  nSize;             /**< sizeof(IplImage) */
    int  ID;                /**< version (=0)*/
    int  nChannels;         /**< Most of OpenCV functions support 1,2,3 or 4 channels */
    int  alphaChannel;      /**< Ignored by OpenCV */
    int  depth;             /**< Pixel depth in bits: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16S,
                               IPL_DEPTH_32S, IPL_DEPTH_32F and IPL_DEPTH_64F are supported.  */
    char colorModel[4];     /**< Ignored by OpenCV */
    char channelSeq[4];     /**< ditto */
    int  dataOrder;         /**< 0 - interleaved color channels, 1 - separate color channels.
                               cvCreateImage can only create interleaved images */
    int  origin;            /**< 0 - top-left origin,
                               1 - bottom-left origin (Windows bitmaps style).  */
    int  align;             /**< Alignment of image rows (4 or 8).
                               OpenCV ignores it and uses widthStep instead.    */
    int  width;             /**< Image width in pixels.                           */
    int  height;            /**< Image height in pixels.                          */
    struct _IplROI *roi;    /**< Image ROI. If NULL, the whole image is selected. */
    struct _IplImage *maskROI;      /**< Must be NULL. */
    void  *imageId;                 /**< "           " */
    struct _IplTileInfo *tileInfo;  /**< "           " */
    int  imageSize;         /**< Image data size in bytes
                               (==image->height*image->widthStep
                               in case of interleaved data)*/
    char *imageData;        /**< Pointer to aligned image data.         */
    int  widthStep;         /**< Size of aligned image row in bytes.    */
    int  BorderMode[4];     /**< Ignored by OpenCV.                     */
    int  BorderConst[4];    /**< Ditto.                                 */
    char *imageDataOrigin;  /**< Pointer to very origin of image data
                               (not necessarily aligned) -
                               needed for correct deallocation */

} IplImage;

widthheight这两个变量很重要,其次是depth和nchannals。depth变量的值取自ipl.h中定义的一组数据,但与在矩阵中看到的对应变量不同。因为在图像中,我们往往将深度和通道数分开处理,深度值如下表

图像像素类型
IPL_DEPTH_8U 无符号8位整数(8u)
IPL_DEPTH_8S 有符号8位整数(8s)
IPL_DEPTH_16S 有符号16位整数(16s)
IPL_DEPTH_32S 有符号32位整数(32s)
IPL_DEPTH_32F 32位浮点数单精度(32f)
IPL_DEPTH_64F 64位浮点数双精度(64f)

下面转一段别人总结的深度显示范围。
测试double型:0.0–1.0之间 IPL_DEPTH_64F

测试float型:0.0–1.0之间 IPL_DEPTH_32F

测试long型:0–65535之间 IPL_DEPTH_32S

测试short int型:-32768–32767之间 IPL_DEPTH_16S

测试unsigned short int型:0–65535之间 IPL_DEPTH_16U

测试char型:-128–127之间 IPL_DEPTH_8S

测试unsigned char型:0–255之间 IPL_DEPTH_8U

这个时候如果需要保存图像,请记住要先转换到IPL_DEPTH_8U的深度。因为只有8位单通道或者3通道(通道顺序为’BGR’)才可以使用cvSaveImage保存。

通道数nChannels可取的值是1,2,3或4

origin: 2种值(IPL_ORIGIN_TL 或者 IPL_ORIGIN_BL)分别设置坐标原点的位置于图像的左上角(TL->top left)或者左下角(BL->bottom left)

**ROI感兴趣区域**COI感兴趣通道


关于加载图片格式
cvLoadImage()寒素可以读取大多数格式类型的图像文件,这列类型包括BMP,DIB,JPEG,PNG,PBM,PGM,SR,RAS和TIFF。该函数执行完后将返回一个指针,此指针指向一个块为描述该图像文件的数据结构(IplImage)而分配的内存块。
关于加载颜色深度

enum
{
/* 8bit, color or not */
    CV_LOAD_IMAGE_UNCHANGED  =-1,
/* 8bit, gray */
    CV_LOAD_IMAGE_GRAYSCALE  =0,
/* ?, color */
    CV_LOAD_IMAGE_COLOR      =1,
/* any depth, ? */
    CV_LOAD_IMAGE_ANYDEPTH   =2,
/* ?, any color */
    CV_LOAD_IMAGE_ANYCOLOR   =4
};

使用原始加载可以这样:

IplImage* src = cvLoadImage("01.jpg", CV_LOAD_IMAGE_ANYDEPTH || CV_LOAD_IMAGE_ANYCOLOR);

关于创建窗体
我们使用的是cvNamedWindow();函数它的定义如下:

/* create window */
cvNamedWindow( const char* name, int flags CV_DEFAULT(CV_WINDOW_AUTOSIZE) )

参数1,name:类似于窗体的ID,也是它的名称
参数2,flags :是窗体的加载属性,它有如下值的定义如下:

    //These 2 flags are used by cvNamedWindow and cvSet/GetWindowProperty
    CV_WINDOW_NORMAL       = 0x00000000, //the user can resize the window (no constraint)  / also use to switch a fullscreen window to a normal size
    CV_WINDOW_AUTOSIZE     = 0x00000001, //the user cannot resize the window, the size is constrainted by the image displayed
    CV_WINDOW_OPENGL       = 0x00001000, //window with opengl support

如何使用该函数?如下

cvNamedWindow("title",1);//创建一个窗体

其中数字值可以代替上面的flags定义好的宏值。

关于显示图片
我们使用的cvShowImage()函数,定义如下:

/* display image within window (highgui windows remember their content) */
CVAPI(void) cvShowImage( const char* name, const CvArr* image );

参数1 , name : 待显示的窗体name
参数2,image:是要显示的图片资源,一个图片数据结构,对应的需要一个IplImage*类型的指针

使用该函数,该窗口将被重新绘制。
如何使用?如下

cvShowImage("title", src);//在窗体中显示图片

关于释放资源
该程序窗口所占用的一切资源都会由操作系统自动释放,对应简单的程序,可不必调用函数显示释放资源,但是,养成习惯每次都调用这些函数显示释放资源总是有好处的。

你可能感兴趣的:(【编程语言】,【机器视觉】)