Mat 是OpenCV和C++的接口矩阵类,ImlImage是OpenCV和C语言的接口的结构体,但是C++程序有时候时候还是要用到ImlImage,例如在MFC中的Picture Control显示图片。
下面总结了针对OpenCV3.0以上版本的Mat和IplImage相互转换方法:
[cpp] view plain copy
- //IplImage—>Mat
- //EXAMPLE:
- //浅拷贝:
- IplImage* pBinary=cvLoadImage("c://temp.jpg",0);
- Mat Img;
- Img=cvarrToMat(pBinary);
- //深拷贝只需要再在Mat里创建一个新的Mat对象,然后进行数据的复制,再用上述的函数进行数据头的复制(浅拷贝):
- IplImage* pBinary=cvLoadImage("c://temp.jpg", 0);
- Mat ImgTemp;
- Img=cvarrToMat(pBinary);
- Mat Img = ImgTemp.clone();
- //Mat—>IplImage
- //EXAMPLE:
- //浅拷贝:
- Mat Img=imread("1.jpg");
- IplImage* pBinary = &IplImage(Img);
- //深拷贝只要再加一次复制数据:
- IplImage *input = cvCloneImage(pBinary);
bu- 将Mat转换为IplImage
//! converts header to IplImage; no data is copied operator IplImage() const;
例如:
Mat img;
IplImage *src;
src=&IplImage(img);
- 1
- 2
- 3
- 4
注意:根据注释,Mat转为Iplimage 是不会拷贝制数据的,相当于一个指针赋值,所以最后不可以用cvReleaseImage
释放src空间,会报错
- 将IplImage转换为Mat
//! converts old-style IplImage to the new matrix; the data is not copied by default
Mat(const IplImage* img, bool copyData=false);
例如:
IplImage *src;
Mat img;
img = Mat(src);//默认补拷贝数据
img = Mat(src,true);//拷贝数据