历史版本的opencv中使用cvmat储存数据,使用iplimage存储图像,是基于C的数据存储结构
之后的opencv2.x出现mat类型,不用手动管理内存,相比cvmat和iplimage更加方便,这里主要介绍mat和其二者的转换关系
cvmat 和 iplimage派生于同一个基类cvarr,所以其二者到mat有相同的转换方式
iplimage->mat
IplImage* frame = cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); //浅拷贝 cv::Mat
m = cv::cvarrToMat(frame) //深拷贝 copydata设置为true cv::Mat m =
cv::cvarrToMat(frame, true);
或直接用构造函数
IplImage* src = cvLoadImage("xx.jpg"); //浅拷贝 Mat M(src); Mat M(src, false);
Mat M = src; //深拷贝 Mat M(src, true);
cvmat->mat
CvMat* frame = cvCreateMat(3, 3, CV_32FC1); //浅拷贝 cv::Mat m =
cv::cvarrToMat(frame) //深拷贝 copydata设置为true cv::Mat m = cv::cvarrToMat(frame,
true);
反过来,由mat到iplimage和cvmat的转换
mat->iplimage
Mat src = imread("x.jpg"); IplImage* m = &IplImage(src); //深拷贝使用clone复制数据
IplImage *m = cvCloneImage(m);
mat->cvmat
opencv 2.x 可以直接赋值使用
Mat src = ...; CvMat dst = img;
而在更高版本3.x 使用cvmat的构造函数即可
Mat src = ...; CvMat dst(img);