OpenCV学习笔记:Mat、CvMat、CvArr、IplImage 数据类型的相互转换(总结版)

一、说明

Mat 是OpenCV和C++的接口矩阵类,ImlImage是OpenCV和C语言的接口的结构体,但是C++程序有时候还是要用到ImlImage,例如在MFC中的Picture Control显示图片。
Mat类型与CvMat和IplImage类型都可以表示图像,Mat类型侧重于计算,数学性较高; CvMatIplImage类型更侧重于“图像”。
IplImage类型对图像的一种优化体现在变量 origin ---- 原点。在计算机视觉处理上,一个重要的不便是对原点的定义不清楚,图像来源、编码格式、操作系统等都会对原点的选取产生影响。为了弥补这一点,openCV允许用户定义自己的原点设置。取值0表示原点位于图片左上角,1表示左下角
CvArr 作函数参数时,意味着可以传类型为CvMatIplImage的数据类型进去。
存在如下派生关系:CvArr -> CvMat -> Ipllmage
Mat是一个类(Class),而CvMat是一个结构体(Struct)。

二、转换

IplImage 转为 Mat

IplImage* img = cvLoadImage("1.jpg");
Mat img = cvarrToMat(img);//把二值化后的src转换为Mat类型

Mat 转为 IplImage*

Mat mat = imread("1.jpg");
IplImage* img1 = &(IplImage)mat; //浅拷贝
IplImage *img2 = cvCloneImage(img1);//深拷贝,即在浅拷贝的基础上再加一次复制数据

MatcvArr*

Mat img = imread("1.jpg");
IplImage tmp = IplImage(img);
CvArr* s=(CvArr*)&tmp ;

cvArr* 转为 Mat

CvArr* img;
Mat img = cv::cvarrToMat(img);

Mat转为CvMat

Mat a; 
CvMat b = a; //浅拷贝
CvMat temp = a; //转化为CvMat类型(不是复制数据)
CvMat *b;  
cvCopy(&temp, b); //复制数据  

CvMat转为Mat

CvMat* a;  
Mat b(a);                //浅拷贝方式一 
Mat b(a, false);         //浅拷贝方式二 
Mat b = a;               //浅拷贝方式三
Mat b = Mat(a, true);    //深拷贝

你可能感兴趣的:(OpenCV学习笔记)