IplImage数据结构
Typedef struct _IplImage {
int nSize; int ID; int nChannels;//取值可以是1、2、3、4
int alphaChannels; int depth;//深度值参看下表
char colorModel[4];
char channelSeq[4];
int dataOrder;//IPL_DATA_ORDER_PIXEL(指明数据是将像素点不同通道的值交错排在一起(这是常用的交错排列
式)),IPL_DATA_ORDER_PLANE(把所有像素同通道值排在一起,形成通道平面,再把平面排列起来)
int origin;//IPL_ORIGIN_TL,IPL_ORIGIN_BL分别表示原点位置在图像左上角或左下角
int align;
int width;
int height;
struct _IplROI* roi;
struct _IplImage* maskROI;
void* imageId;
struct _IplTileInfo* tileInfo;
int imageSize;
char* imageData;//包含一个指向第一行图像数据的指针
int widthStep;//同CvMat中Step,包括相邻行的同列点之间的字节数
int BorderMode[4];
int BorderConst[4];
char* imageDataOrigin; }
注意: depth取值:
dataOrder取值:实际上OpenCV只支持IPL_DATA_ORDER_PIXEL struct _IplROI* roi;
访问图像数据例:
//最大化HSV图像中的“s”“v”部分
void saturate_sv(IplImage* img)
{
for(int y=0;yheight;y++)
uchar* ptr = (uchar*)(img->imageData+y*img->widthStep);
for(int x=0;xwidth;x++)
{ ptr[x*3+1]=255; ptr[x*3+2]=255;}
}
注意:参照代码//累加一个三通道矩阵中的所有元素。
IplImage和CvMat的重要区别在于imageData。
IplImage中的imageData是uchar*,即字节类型指针。
在图像上进行指针运算时可以简单的增加widthStep(也是以字节为单位),不用关心实际的数据类型。
但是CvMat的data是联合类型,使用时必须说明指针类型data.ptr。