Mat ,IplImage, CvMat 之间的转换的总结
在新版本与旧版本之间纠结,到底是用Mat,还是Iplimage?
Mat 侧重于数据计算,而Iplimage注重于图像的处理。
因此,应根据具体需要灵活使用,那个好用用哪个,只要在两者之间进行转换即可。
一、派生关系:CvArr -> CvMat -> IplImage
IplImage由CvMat派生,而CvMat由CvArr派生
CvArr用作函数的参数,无论传入的是CvMat或IplImage,内部都是按CvMat处理。
二、转换方式:
1. IplImage,CvMat 向Mat 转换:
主要利用Mat的构造函数
Mat::Mat(const CvMat* m, bool copyData=false);
因为IplImage是从CvMat派生而来,所以,两者的转换都采用该函数。其中,copyData表示是否复制数据。
例:
CvMat mI ;
Mat I=Mat(mI);
2. Mat 向 IplImage,CvMat 转换:
(1)文件头的复制,只创建文件头,不复制数据
Mat I;
IplImage pI = I;或 IplImage pI = IplImage (I);
CvMat mI = I;
(2)指针转换,需要调用IplImage和CvMat运算符得到指针,为了得到指针需要使用&符号:
Mat I;
IplImage* pI = &I.operator IplImage(); 或 IplImage* pI = &(IplImage(I));
CvMat* mI = &I.operator CvMat();
3.CvMat 与 IplImage的转换
(1)CvMat 转向 IplImage
CvMat* mat_origin;//可以 IplImage img_buffer ;
cvGetImage(mat_origin,&img_buffer);
(2) IplImage转向CvMat
法1:只生成一个新的矩阵头,而数据都指向原来的地址
CvMat mathdr,
*mat = cvGetMat( img, &mathdr );
其中, cvGetMatconst CvArr* arr, CvMat* header)
法2:CvMat *mat = cvCreateMat( img->height, img->width, CV_64FC3 );
cvConvert( img, mat );