opencv中CvMat,CvArr,Mat之间的关系

Opencv中可以代表和显示图像的类有三个:(1)CvMat;(2)plImage;(3)Mat;

其中,类之间的继承关系:CvArr -> CvMat -> IplImage ,Mat是C++版本的矩阵类型

(CvArr用作函数的参数,无论传入的是CvMat或IplImage,内部都是按CvMat处理)

 

其中,CvMat和Mat之间的相互转换如下:

(1)CvMat和CvMat之间的转换

//注意:深拷贝 - 单独分配空间,两者相互独立
CvMat* a;
CvMat* b = cvCloneMat(a);	//copy a to b

(2)Mat之间的复制

//注意:浅拷贝 -  不复制数据只创建矩阵头,数据共享(更改a,b,c的任意一个都会对另外2个产生同样的作用)
Mat a;
Mat b = a; //a "copy" to b
Mat c(a); //a "copy" to c
 
//注意:深拷贝
Mat a;
Mat b = a.clone(); //a copy to b
Mat c;
a.copyTo(c); //a copy to c

(3)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

(4)Mat转CvMat

//注意:浅拷贝
Mat a;
CvMat b = a; //a "copy" to b
 
//注意:深拷贝
Mat a;
CvMat *b;
CvMat temp = a; //转化为CvMat类型,而不是复制数据
cvCopy(&temp, b); //真正复制数据

 

你可能感兴趣的:(Opencv)