OpenCV里定义了几种关于图像的数据类型,特别是常见的CvArr, CvMat, IplImage,他们的基本关系如下:
这三者就是派生与继承的关系。
1.CvArr
关于CvArr,OpenCVArr里有这样的定义和说明(清晰明了)
CvArr:
/* CvArr* is used to pass arbitrary
* array-like data structures
* into functions where the particular
* array type is recognized at runtime:
*/
typedef void CvArr;
就是 void类型!(⊙﹏⊙|| && O__O"…)
2 CvMat
typedef struct CvMat
{
int type;
int step;
int * refcount; //for internal use only
union { char * ptr;
short * s;
int * i;
float * fl;
double *db;
} data;
union { int rows;
int height;
};
union { int cols;
int width;
};
} CvMat
CvMat 由宽度(width)、高度(height)、类型(type)、行数据长度(step 用字节数来度量)和一个指向数据的指针构成。
创建方式:CvMat * cvCreateMat( int row, int cols,int type)及其类似的函数可以创建。type可以是任意数据类型或结构体(类)。
3 IplImage
这个最常用,特别是处理图形图像时。本质上是一个CvMat对象,还带有自身关于图像的成员变量。定义如下:
typedef struct _IplImage
{
int nsize;
int ID;
int nChannels; //通道数1,2,3或4
int alphaChannel; //α通道
int depth;
char ColorMode[4];
char channelSeq[4];
int dataOrder; //图像数据存放的方式,按通道还是交错存放
int Orgin; //取IPL_ORGIN_TL时远点在左上,IPL_ORGIN_BL时左下
int align;
int width;
int height;
struct _IplROI *roi; //ROI 模式来操作图像
struct _IplImage* maskROI;
void * ImageId;
struct _IplTileInfo * tileInfo;
int ImageSize;
char * ImageData; //指向图像第一行数据存放的指针
int WidthStep; //每一列宽度,就是每个元素的大小,用byte度量
int BorderModel[4];
int BorderConst[4];
char * imageDoctaOrign;
} IplImage;
可以看出,IplImage除了包含CvMat的基本矩阵成员变量之外,还自己增加了许多关于图像的信息变量。也为图像处理操作带来了便利。
CvMat, Mat, IplImage,cvArr*之间的转换
(1)IplImage *转为cv::Mat
IplImage *vel;
cv::Mat Mat(vel);
(2)cv::Mat转换成IplImage*
cv::Mat mat;
IplImage *vel = &(IpLimage)mat;
(3)IplImage *转为Mat
IplImage *vel;
Mat mat(vel);
最后,搞定这三行代码你就完全理解OpenCv/C++的精髓了:
Mat IMG_Mat;
CvMat *IPL=((CvMat*)(&IMG_Mat));
cvReleaseMat(&IPL);