OpenCV 中的三大数据类型:IplImage 类型

前言

  本文将介绍 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 入门示例之一,之四,之五,以及相关资料都提供了很多基本的图像处理函数。

  这些基本的函数处理不再介绍也没有必要,查阅相关资料即可,接下来将学习一些更高级的图像处理,分析技术。

原文地址:https://www.cnblogs.com/scut-fm/p/3734190.html