网址: https://www.cnblogs.com/Key-Ky/p/4150531.html
https://blog.csdn.net/lijiayu2015/article/details/52438160#
https://blog.csdn.net/holybin/article/details/17711013#
Opencv中常见的与图像操作有关的数据容器有Mat,cvMat和IplImage,他们都可以显示图像,但是,Mat类型侧重于计算,数学性较高。而CvMat和IplImage类型更侧重于“图像”。在Opencv2.0之前,Opencv的库函数是完全用C实现的。其中Mat是OpenCV和C++的接口矩阵类,IplImage是OpenCV和C语言的接口的结构体。
1、IplImage与Mat之间转换
1.1、 IplImage—>Mat
//浅拷贝:
IplImage* pBinary=cvLoadImage("c://temp.jpg",0);
Mat Img;
Img=cvarrToMat(pBinary);
//深拷贝:
IplImage* pBinary=cvLoadImage("c://temp.jpg", 0);
Mat ImgTemp;
Img=cvarrToMat(pBinary);
Mat Img = ImgTemp.clone();
1.2、 Mat—>IplImage
//浅拷贝:
Mat Img=imread("1.jpg");
IplImage* pBinary = &IplImage(Img);
//深拷贝:
Mat Img=imread("1.jpg");
IplImage* pBinary = &IplImage(Img);
IplImage *input = cvCloneImage(pBinary);
2、IplImage与cvMat之间转换
1.1、 IplImage—>CvMat
//法一:cvGetMat函数
IplImage* img;
CvMat temp;
CvMat* mat = cvGetMat(img, &temp); //深拷贝
//法二:cvConvert函数
CvMat *mat = cvCreateMat(img->height, img->width, CV_64FC3); //注意height和width的顺序
cvConvert(img, mat); //深拷贝
2.2、 CvMat—>IplImage
//法一:cvGetImage函数
CvMat M;
IplImage* img = cvCreateImageHeader(M.size(), M.depth(), M.channels());
cvGetImage(&M, img); //深拷贝:函数返回img
//法二:cvGetImage函数
CvMat M;
IplImage* img = cvGetImage(&M, cvCreateImageHeader(M.size(), M.depth(), M.channels()));
//法三:cvConvert函数
CvMat M;
IplImage* img = cvCreateImage(M.size(), M.depth(), M.channels());
cvConvert(&M, img); //深拷贝
3、Mat 与cvMat之间转换
3.1 CvMat—>Mat
//使用Mat的构造函数:Mat::Mat(const CvMat* m, bool copyData=false); 默认情况下copyData为false
CvMat* a;
//均为浅拷贝
Mat b(a); //a "copy" to b
Mat b(a, false); //a "copy" to b
Mat b = a; //a "copy" to b
/深拷贝:当将参数copyData设为true后,则为深拷贝(复制整个图像数据)
Mat b = Mat(a, true); //a copy to b
3.2 Mat—>CvMat
//注意:浅拷贝
Mat a;
CvMat b = a; //a "copy" to b
//注意: 深拷贝
Mat a;
CvMat *b;
CvMat temp = a; //转化为CvMat类型,而不是复制数据
cvCopy(&temp, b); //真正复制数据 cvCopy使用前要先开辟内存空间