Mat常用构造函数及IplImage 与Mat 之间的相互转换

Mat对象构造函数与常用方法

常用的构造函数有:

//无参数构造方法;
Mat::Mat()//创建行数为 rows,列数为 col,类型为 type 的图像;
Mat::Mat(int rows,  int cols,  int type)//创建大小为 size,类型为 type 的图像;
Mat::Mat(Size size,  int type)//创建行数为 rows,列数为 col,类型为 type 的图像,并将所有元素初始化为值 s;
Mat::Mat(int rows,  int cols,  int type,  const Scalar& s)//创建大小为 size,类型为 type 的图像,并将所有元素初始化为值 s;
Mat::Mat(Size size,  int type, const Scalar& s)//将 m 赋值给新创建的对象,此处不会对图像数据进行复制,m 和新对象共用图像数据;
Mat::Mat(const Mat& m)//创建行数为 rows,列数为 col,类型为 type 的图像,此构造函数不创建图像数据所需内存,而是直接使用data 所指内存,图像的行步长由 step指定。
Mat::Mat(int rows,  int cols,  int type,  void* data,  size_t step=AUTO_STEP)//创建大小为 size,类型为 type 的图像,此构造函数不创建图像数据所需内存,而是直接使用 data 所指内存,图像的行步长由 step 指定。
Mat::Mat(Size size,  int type,  void* data,  size_t step=AUTO_STEP)//创建的新图像为 m 的一部分,具体的范围由 rowRange 和 colRange 指定,此构造函数也不进行图像数据的复制操作,新图像与 m 共用图像数据;
Mat::Mat(const Mat& m,  const Range& rowRange,  const Range& colRange)//创建的新图像为 m 的一部分,具体的范围 roi 指定,此构造函数也不进行图像数据的复制操作,新图像与 m 共用图像数据。
Mat::Mat(const Mat& m,  const Rect& roi)

这些构造函数中,很多都涉及到类型 type。type 可以是 CV_8UC1,CV_16SC1,...,CV_64FC4 等。里面的 8U 表示 8 位无符号整数,16S 表示 16 位有符号整数,64F表示 64 位浮点数(即 double 类型);C 后面的数表示通道数,例如 C1 表示一个通道的图像,C4 表示 4 个通道的图像,以此类推。
如果你需要更多的通道数,需要用宏 CV_8UC(n),例如:

Mat M(3,2, CV_8UC(5));//创建行数为3,列数为2,通道数为5的图像

有些 type 参数如 CV_32F未注明通道数目,这种情况下它表示单通道。

常用方法
void copyTo(); //拷贝
Mat clone(); //拷贝
int channels(); //通道,矩阵中的每一个矩阵元素拥有的值的个数
int depth(); //深度,即每一个像素的位数(bits)
bool empty() const; //判断是否为空
uchar* ptr(int i0=0); //指针取第0行数据
void convertTo(oclMat& m, int rtype, double alpha=1, double beta=0);
//m:转为目标数据类型的矩阵;
//rtype: 指定目标数据类型,或者是depth(通道数),如果rtype:是负值,那么目标矩阵的数据类型和源矩形的数据类型是一致的;
//alpha:基于尺度的变化值;
//beta:在尺度上的加和;

四个要点:

  • 输出图像的内存是自动分配的
  • 使用OpenCV的C++接口,不需要考虑内存分配的问题
  • 赋值操作和拷贝构造函数只会复制头部分
  • 使用clone()与copyTo()两个函数实现数据完全复制

create()函数创建对象

除了在构造函数中可以创建图像,也可以使用 Mat 类的 create()函数创建图像。如果 create()函数指定的参数与图像之前的参数相同,则不进行实质的内存申请操作;如果参数不同,则减少原始数据内存的索引,并重新申请内存。使用方法如下面例程所示:

Mat M(2,2, CV_8UC3);//构造函数创建图像

M.create(3,2, CV_8UC2);//释放内存重新创建图像

需要注意的时,使用 create()函数无法设置图像像素的初始值。

Mat 与 IplImage间相互转换

/**/-----以下方法在opencv3及以下版本中可行,opencv4中没有IplImage结构------////IplImage—>Mat
//使用Mat的构造函数:
Mat::Mat(const IplImage* img, bool copyData=false);//默认情况下copyData为falseIplImage* srcImg = cvLoadImage("Lena.jpg");//注意:以下三种效果一致,均为浅拷贝.
Mat M(srcImg);
Mat M(srcImg, false);
Mat M = srcImg;//注意:当将参数copyData设为true后,则为深拷贝(复制整个图像数据).
Mat M(srcImg, true);//converting IplImage to cv::Mat  Mat image=cvarrToMat(srcImg,true); //Mat—>IplImage
//注意:浅拷贝 --- 同样只是创建图像头,而没有复制数据.
Mat M;IplImage img = M;
IplImage img = IplImage(M);//深拷贝
cv::Mat img2;IplImage imgTmp = img2;
IplImage *input = cvCloneImage(&imgTmp);
//----------------------------------------------/*/

/*/-----以下方法在opencv3及以下版本中可行,opencv4中没有IplImage结构----//

//IplImage—>Mat

//使用Mat的构造函数:

Mat::Mat(const IplImage* img, bool copyData=false); 默认情况下copyData为false

IplImage* srcImg = cvLoadImage("Lena.jpg");

//注意:以下三种效果一致,均为浅拷贝.

Mat M(srcImg);

Mat M(srcImg, false);

Mat M = srcImg;

//注意:当将参数copyData设为true后,则为深拷贝(复制整个图像数据).

Mat M(srcImg, true);

//converting IplImage to cv::Mat

Mat image=cvarrToMat(srcImg);

//Mat—>IplImage

//注意:浅拷贝 --- 同样只是创建图像头,而没有复制数据.

Mat M;

IplImage img = M;

IplImage img = IplImage(M);

//深拷贝

cv::Mat img2;

IplImage imgTmp = img2;

IplImage *input = cvCloneImage(&imgTmp);

//-----------------------------------------------------------/*/

3、数据备份/拷贝

1“ = ” 浅拷贝

浅拷贝 - 不复制数据只创建矩阵头,数据共享(更改a, b, c的任意一个都会对另外2个产生同样的作用)

Mat a = imread("1.jpg");

Mat b = a; //a "copy" to b

Mat c(a); //a "copy" to c

a.col(10) = 0;//把a的第十列全置0,b和c也相应发生变化

2“clone()” 完全深拷贝

clone 是完全的深拷贝,在内存中申请新的空间

Mat A = Mat::ones(4, 5, CV_32F);

Mat B = A.clone()    //clone 是完全的深拷贝,在内存中申请新的空间,与A独立

3“copyTo()” 也是深拷贝

copyTo 也是深拷贝,但是否申请新的内存空间,取决于dst矩阵头中的大小信息是否与src一至,若一致则只深拷贝并不申请新的空间,否则先申请空间后再进行拷贝.

Mat A = Mat::ones(4, 5, CV_32F);

Mat C;

A.copyTo(C) //此处的C矩阵大小与A大小不一致,则申请新的内存空间,并完成拷 贝,等同于clone()

Mat D = A.col(1);

A.col(0).copyTo(D) //此处D矩阵大小与A.col(0)大小一致,因此不会申请空间,而是直接进行拷贝,相当于把A的第1列赋值给第二列

【25、你可以很有个性,但某些时候请收敛。】

Mat常用构造函数及IplImage 与Mat 之间的相互转换相关推荐

  1. opencv常用函数,QT中Mat与QImage的转换

    一.opencv简介 opencv是一个跨平台计算机视觉和机器学习软件库,可以运行在Linux.Windows.Android和Mac OS操作系统上,实现了图像处理和计算机视觉方面的很多通用算法. ...

  2. opencv中Mat与IplImage,CVMat类型之间转换

    opencv中对图像的处理是最基本的操作,一般的图像类型为IplImage类型,但是当我们对图像进行处理的时候,多数都是对像素矩阵进行处理,所以这三个类型之间的转换会对我们的工作带来便利. Mat类型 ...

  3. IplImage、IplImage、Mat之间的转换

    IplImage是OpenCV中C语言的图像类型; cv::Mat是OpenCV中C++语言的图像类型; 一.Mat->IplImage Mat image: if(!image.data) { ...

  4. OpenCV中IplImage/CvMat/Mat转化关系

    原文链接:http://www.cnblogs.com/summerRQ/articles/2406109.html 如对内容和版权有何疑问,请拜访原作者或者通知本人. opencv中常见的与图像操作 ...

  5. IplImage, CvMat, Mat 的关系和相互转换 再次理解 /(ㄒoㄒ)/~~

    opencv中常见的与图像操作有关的数据容器有Mat,cvMat和IplImage,这三种类型都可以代表和显示图像,但是,Mat类型侧重于计算,数学性较高,openCV对Mat类型的计算也进行了优化. ...

  6. IplImage, CvMat, Mat 的关系和相互转换(转)

    opencv中常见的与图像操作有关的数据容器有Mat,cvMat和IplImage,这三种类型都可以代表和显示图像,但是,Mat类型侧重于计算,数学性较高,openCV对Mat类型的计算也进行了优化. ...

  7. OpenCV中 IplImage 与 Mat的区别

    IplImage: 在OpenCV中IplImage是表示一个图像的结构体,也是从OpenCV1.0到目前最为重要的一个结构: 在之前的图像表示用IplImage,而且之前的OpenCV是用C语言编写 ...

  8. 【OpenCV】cv::Mat和std::vector之间的相互转换

    Mat转换成Vector 以vector 为例,其它模型类似 vector getVector(const Mat & a) { Mat b; a.convertTo(b, CV_64F); ...

  9. IplImage和Mat间的相互转换

    转自:http://www.opencv.org.cn/forum/viewtopic.php?f=1&t=8279   5楼回复 ---------------- opencv2.0中的数据 ...

  10. QImage与Mat之间的相互转换

    Mat转QImage Mat mat=imread("c:/dev/test.jpg"); cvtColor(mat, mat, CV_BGR2RGB); QImage image ...

最新文章

  1. MySQL重温笔记-索引
  2. mysql 优惠卷表设计_这些年MySQL表设计踩过的坑!
  3. 前端学习(1606):数据请求与json-server
  4. 手机音视频应用开发(专注于Symbian、iPhone、Android等跨平台音视频应用开发方案)
  5. Method for Discovering Network Topology中文翻译【Z-Stack Home 1.2.0开发文档】
  6. linux防火墙--iptables(三)
  7. poj 2392 Space Elevator 二进制拆包多重背包
  8. thinkphp 一个文件怎么调用另一个文件中的define()_ThinkPHP 简易开发思路 amp;amp; MVC和URL跳转...
  9. linux如何监控网络流量,linux 下网络流量监控
  10. Unity笔记—常用小功能整合
  11. C语言time.h中srand(),rand()等等函数产生随机数的用法。
  12. C++ 泛型编程 map(统计人数)
  13. 用python实现简单画画
  14. 结构体+联合体 详解
  15. 在使用pyrcc5编译二进制文件出现错误Cannot find file:和pyrcc5: No resources in resource description.
  16. 算法13_10种海量数据处理方法
  17. java sdk7.0下载_jdk7.0下载(Java SE Development Kit 7) 7u80官方版 win32
  18. 计算机自适应的应用领域,计算机自适应题库的建立
  19. 判断网页是否在微信浏览器中打开
  20. 直接扩频通信(下)仿真

热门文章

  1. 如何生成serialVersionUID
  2. python里随机生成属性_Python随机生成信用卡卡号的实现方法
  3. Cloud Solution Architect Certification 认证备考指南
  4. ApacheCN 翻译活动进度公告 2019.6.15
  5. 【教程】无需下载任何软件,使win10任务栏完全透明!
  6. CMMI认证适用的企业
  7. android 静默安装实现,Android 中静默安装实现详解
  8. 2021-6-26 激光的工业应用
  9. ios 监测网页按钮_关于iOS加载WebView监控网页上的点击事件
  10. Mac通讯录管理软件BusyContacts安装教程