OpenCV中的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; 该结构定义于types_c.h头文件中(opencv2\core\types_c.h)。
width、height分别表示图像的宽度像素数、高度像素数,是这个结构中最重要的两个成员。
其次是depth、nchannals这两个变量:
depth变量的值取自于types_c.h
#define IPL_DEPTH_SIGN 0x80000000 #define IPL_DEPTH_1U 1 //无符号1位整数 #define IPL_DEPTH_8U 8 //无符号8位整数 #define IPL_DEPTH_16U 16 //无符号16位整数 #define IPL_DEPTH_32F 32 //32位浮点数单精度 #define IPL_DEPTH_8S (IPL_DEPTH_SIGN| 8) //有符号8位整数 #define IPL_DEPTH_16S (IPL_DEPTH_SIGN|16) //有符号16位整数 #define IPL_DEPTH_32S (IPL_DEPTH_SIGN|32) //有符号32位整数
通道数nChannels可取值为1、2、3或4.
随后两个重要成员是origin和dataOrder:
origin变量可以有两种取值IPL_ORIGIN_TL或者IPL_ORIGIN_BL,分别设置坐标原点的位置于图像左上角或者左下角,一般而言,图像来源、操作系统、编解码器、存储格式都可以影响图像的原点选取,开始操作图像前先检查系统,在所操作图像块的地方画点东西试试是一个好的方法;
dataOrder的取值可以是IPL_DATA_ORDER_PIXEL或IPL_DATA_ORDER_PLANE,前者指明数据是将像素点不同通道的值交错排在一起(这是常用的交错排列方式),后者是把所有像素同通道值排列在一起,形成通道平面,再把平面排列起来。
dataOrder==IPL_DATA_ORDER_PLANE,则总行数为height*nChannels.
为了更为高效处理图像,每行都会用固定字节来对齐,因此width并不能作为相邻行的同列点之间的字节数,widthStep变量正是为此而设定的。
参数imageData包含一个指向图像数据区首地址的指针。
roi参数,最感兴趣的区域,实际上是IplROI的一个实例:
typedef struct _IplROI { int coi; /* 0 - no COI (all channels are selected), 1 - 0th channel is selected ...*/ int xOffset; int yOffset; int width; int height; } IplROI;
ROI的思想是一旦设定了ROI,通常作用于整幅图像的函数便只会对ROI所表示的子图像进行操作。
如果IplImage变量中设置了ROI,则所有的OpenCV函数就会使用该ROI变量。
如果coi被设置为非0,则对该图像的操作就只作用于被指定的通道上,coi可能取值有1、2、3、4通道,并且为了使coi无效保留了0取值。在OpenCV中,许多函数都忽略coi。
设置、取消ROI分别使用cvSetImageROI(IplImage* image,CvRect rect)、cvResetImageROI()函数。
以上全文来自《学习opencv》,稍作修改,其实可以看作完全未做修改。