在opencv2.4.9有一些函数仍然是没有C++接口,因此在opencv2中有时需要用到CvMat或者IplImage,那么这些数据结构之间怎么彼此进行转换是需要考虑的一个问题。我们可以从需要的一种数据结构中读取并赋值到新的数据结构中去,这是一种深复制。通常我们需要的的是数据本身,而不是需要对数据进行更改,因此选择opencv自带的函数是比较合适的,因为大多数的函数都是浅复制。
1、Mat –> IplImage
Mat mt; // Mat重载了“=”操作符
IplImage img1 = mt; // 浅复制
IplImage img2 = &(IplImage)mt; // 浅复制
2、Mat –> CvMat
Mat mt; // Mat重载了“=”操作符
CvMat cmt1 = mt; // 浅复制
CvMat cmt2(mt); // 浅复制
3、IplImage –> Mat
IplImage *img = cvLoadImage("lena.bmp", 0);
Mat mt1(img); //浅复制
Mat mt1 = img; //同上
Mat mt2 = cvarrToMat(img,flase); //第二个参数默认为flase,不复制数据,浅复制;true时深复制
4、IplImage –> CvMat
IplImage *img = cvLoadImage("lena.bmp", 0); // CV_8UC3
CvMat cmt1;
cvGetMat(img,&cmt1); //浅复制
CvMat *cmt2 = cvCreateMat(img->height, img->width, CV_64FC3);
cvConvert(img,cmt2) // 或cvConvetScale, cmt2必须分配空间
5、CvMat –> IplImage
CvMat cmt
IplImage img;
cvGetImage(&oldmat, &img); // img的类型同cmt一样,不管img原来是什么类型
6、CvMat –> Mat
CvMat = cmt;
Mat mt1 = cmt; // 浅复制
Mat mt2(cmt); // 同上
Mat mt3 = cvarrToMat(&cmt,false);//第二个参数默认为flase,不复制数据,浅复制;true时深复制