OpenCV学习(八)之OpenCV中IplImage和CvMat图像数据结构

首先看一下IplImage的数据结构:

IplImage---Image Processing Library_Image

<span style="font-family:Microsoft YaHei;">typedef struct _IplImage
{
    int  nSize;             /* IplImage大小 */
    int  ID;                /* 版本 (=0)*/
    int  nChannels;         /* 大多数OpenCV支持1、2、3或4个通道*/
    int  alphaChannel;      /* 被OpenCV忽略*/
    int  depth;             /* 像素的位深度,支持如下格式: IPL_DEPTH_8U、IPL_DEPTH_8S, IPL_DEPTH_16S、IPL_DEPTH_32S、IPL_DEPTH_32F、IPL_DEPTH_64F*/
    charcolorModel[4];     /* 被OpenCV忽略*/
    charchannelSeq[4];     /* 被OpenCV忽略*/
    int  dataOrder;         /* 0表示交叉存取颜色通道, 1表示分开的颜色通道,只有cvCreateImage可以创建交叉存取图像*/
    int  origin;            /*图像原点位置,0表示顶-左结构(左上角),1表示底-左结构(右下角) */
    int  align;             /* 图像行排列方式(4或者8),被OpenCV忽略,使用widthStep代替*/
    int  width;             /* 图像宽相位数*/
    int  height;            /* 图像高相位数*/
    struct_IplROI*roi;    /* 图像感兴趣区域,当该值非空时,只对该区域处理*/
    struct_IplImage*maskROI;      /* 在OpenCV中必须为NULL */
    void  *imageId;                 /* 在OpenCV中必须为NULL */
    struct_IplTileInfo*tileInfo;  /* 在OpenCV中必须为空 */
    int  imageSize;         /* 图像数据大小(在交叉存取格式下imageSize = image->height*image->widthStep) 单位字节)*/
    char*imageData;        /* 指向排列的图像数据*/
    int  widthStep;         /* 排列的图像行大小,单位字节 */
    int  BorderMode[4];     /* 被OpenCV忽略*/
    int  BorderConst[4];    /* 被OpenCV忽略*/
    char*imageDataOrigin;  /* 指针指向一个不同的图像数据结构(不是必须排列的) 是为了纠正图像内存分配准备的 */
}IplImage;
</span>


下面是CvMat的数据结构:
</pre><pre name="code" class="cpp"><span style="font-family:Microsoft YaHei;">typedef struct CvMat
{
	int type;	/*创建的图像元素类型(uchar,short,int,float,double)*/
	int step;	/*每一行长度,以byte记算*/
	int* refcount;	/*指针的引用计数器; 阵列指向用户分配的数据时,指针为 NULL*/
	union{
		uchar* ptr;	/*Data pointer for an unsigned char matrices*/
		short* s;	/* Data pointer for a short matrices*/
		int* i;		/* Data pointer for an integer matrices */
		float* f;	/* Data pointer for a float matrices */
		double* db;	/* Data pointer for a double matrices */
	}data;	/*Data pointer*/

	union{
		int rows;
		int height;
	     };
	union{
		int cols;
		int width;
	     };
}CvMat;</span>

 
  解释一下OpenCV中图像通道数的问题: 
 
1通道: 灰度图;
3通道: 比如常见彩色图像RGB,各占一个通道;
4通道:在OpenCV中,有时采用四通道,主要是RGB+A(Alpha) ,表示透明度(Transparency);
2通道:2通道图像不常见,通常在程序处理中会用到,如傅里叶变换,可能会用到,一个通道为实数,一个通道为虚数,主要是编程方便。 还有一种情况就是16位图像,本来是3通道,但是为了减少数据量,压缩为16位,刚好两个通道,常见格式有RGB555或RGB565,也就是说R占5位,G占5或6位,B占5位,也有RGBA5551格式。还有就是目前常见的一些摄像头喜欢采用YUV2等格式,格式如下YUYV,在处理的时候可以用4通道或者2通道来处理。 如原格式为:Y1UY2V,插值成为Y1UV,Y2UV 就成两个彩色点了。
YCrCb也有类似压缩情况。


你可能感兴趣的:(opencv,IplImage基本数据结构,CvMat基本数据结构,图像通道数)