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

本文详细解析了OpenCV中Mat与IplImage两种图像数据结构的特性及转换方法,包括Mat与CvMat的区别,以及如何在不同场景下进行高效转换,帮助开发者更好地理解和使用OpenCV进行图像处理。

一、说明

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);    //深拷贝
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

视觉闫小亘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值