前言
本文将介绍 OpenCV 中的图像结构 IplImage 并提供一些很实用的技巧。
更多的矩阵处理函数还请参阅相关资料。
IplImage 的类型定义
1 typedef struct _IplImage 2 { 3 int nSize; /* IplImage大小 */ 4 int ID; /* 版本 (=0)*/ 5 int nChannels; /* 大多数OPENCV函数支持1,2,3 或 4 个通道 */ 6 int alphaChannel; /* 被OpenCV忽略 */ 7 int depth; /* 像素的位深度,主要有以下支持格式: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16U,IPL_DEPTH_16S, IPL_DEPTH_32S, 8 IPL_DEPTH_32F 和IPL_DEPTH_64F */ 9 char colorModel[4]; /* 被OpenCV忽略 */ 10 char channelSeq[4]; /* 同上 */ 11 int dataOrder; /* 0 - 交叉存取颜色通道, 1 - 分开的颜色通道. 12 只有cvCreateImage可以创建交叉存取图像 */ 13 int origin; /*图像原点位置: 0表示顶-左结构,1表示底-左结构 */ 14 int align; /* 图像行排列方式 (4 or 8),在 OpenCV 被忽略,使用 widthStep 代替 */ 15 int width; /* 图像宽像素数 */ 16 int height; /* 图像高像素数*/ 17 struct _IplROI *roi; /* 图像感兴趣区域,当该值非空时, 18 只对该区域进行处理 */ 19 struct _IplImage *maskROI; /* 在 OpenCV中必须为NULL */ 20 void *imageId; /* 同上*/ 21 struct _IplTileInfo *tileInfo; /*同上*/ 22 int imageSize; /* 图像数据大小(在交叉存取格式下ImageSize=image->height*image->widthStep),单位字节*/ 23 char *imageData; /* 指向排列的图像数据 */ 24 int widthStep; /* 排列的图像行大小,以字节为单位 */ 25 int BorderMode[4]; /* 边际结束模式, 在 OpenCV 被忽略*/ 26 int BorderConst[4]; /* 同上 */ 27 char *imageDataOrigin; /* 指针指向一个不同的图像数据结构(不是必须排列的),是为了纠正图像内存分配准备的 */ 28 } IplImage;
IplImage 的创建方法
创建图像函数:
1 IplImage* cvCreateImage( CvSize size, int depth, int channels );
size:图像大小
depth:图像深度,其格式一般为 IPL_DEPTH_<比特数>(S|U|F),比如 IPL_DEPTH_32F 就表示 32 位浮点数。
channels:图像通道数
使用 ROI 参数控制图像的处理操作
这个参数可以翻译为 "对图像感兴趣的区域" ,也就是说,当你给 IplImage 设定了这个参数以后,那么以后的图像处理函数将都只针对这个区域进行,直到撤销此参数。下面的代码设定 ROI 并将此区域的蓝色通道增加一定灰度值:
1 // 此头文件包含图像IO函数的声明 2 #include "highgui.h" 3 // 此头文件包含基本的图像处理函数和高级计算机视觉算法 4 #include "cv.h" 5 6 int main (void) { 7 8 IplImage *img = cvLoadImage("d:\1.jpg"); 9 10 // ROI 位置描述参数 11 int x = 230; 12 int y = 60; 13 int width = 260; 14 int heigh = 230; 15 16 // 需要增加的蓝色灰度值 17 int add = 1500; 18 19 // 设定 ROI 20 cvSetImageROI ( 21 img, // 处理的图像 22 cvRect (x, y, width, heigh) // ROI 位置描述 23 ); 24 // 给图像增加蓝色通道的灰度值 25 cvAddS ( 26 img,// 处理的图像( 仅仅处理ROI ) 27 cvScalar (add),// 要增加的标量 28 img // 输出的图像 29 ); 30 31 // 撤销 ROI 32 cvResetImageROI (img); 33 34 // 显示处理后的图像 35 cvNamedWindow ("示例", CV_WINDOW_AUTOSIZE); 36 cvShowImage ("示例", img); 37 38 // 用户键入任何按键后程序退出 39 cvWaitKey (0); 40 41 // 清理内存空间 42 cvReleaseImage (&img); 43 cvDestroyWindow ("示例"); 44 45 return 0; 46 }
运行测试
1. 将如下测试图片另存到 D 盘,命名为 "1.jpg":
2. 运行结果:
IplImage 的其他操作
请参考前面的文章 OpenCV 入门示例之一,之四,之五,以及相关资料都提供了很多基本的图像处理函数。
这些基本的函数处理不再介绍也没有必要,查阅相关资料即可,接下来将学习一些更高级的图像处理,分析技术。