cv::Mat 初识

  Opencv种的Mat类,使得Opencv的编程更加的简单,程序员不用过多的去关注内存管理,并且发现Opencv的编程有点像不需要太多编程技术的Matlab一样,甚至有些函数名字都是一样的。所以对Mat的了解是很有必要的。
  首先我们在处理一块数据的时候,如果使用Mat类,我们得到的好处是:

  1. 不需要手动申请一块内存;
  2. 在不需要时不用再手动释放内存;
  3. 可以通过类的封装,方便的获取到数据的相关信息。

  显然的,它利用了类的特性,将内存管理和数据信息封装在类的内部,用户只需要对Mat类对象进行数据或面向对象操作即可。
Mat类分为两个部分:矩阵头和矩阵数据。如果我们在操作一副图像的数据量时,矩阵数据的大小很大(一般约有1M的数据量),那么拷贝和赋值函数所作的操作如果的深拷贝的话,效率会大大的降低。所以,Opencv的做法是只复制其矩阵头信息,而矩阵数据采用引用的方式,即多个Mat对象共享同一个矩阵数据,这里使用的原理类似c++11中的共享指针。
  如下示例:

 cv::Mat A = cv::imread("erode.jpg");cv::Mat B(A);cv::Mat C = A;printf("A.data = %p\nB.data = %p\nC.data = %p\n", A.data, B.data, C.data);

  输出结果如下:

A.data = 000001F0A0BF00C0
B.data = 000001F0A0BF00C0
C.data = 000001F0A0BF00C0

  如上我们可以看到,三个Mat类对象的矩阵数据的地址是一样的。那么释放内存的原则是怎样的呢。这个也是内部使用了引用计数的方法,类似共享指针,当引用计数变为0的时候才会真正的释放内存。

cv::Mat 类对象的创建方法

  通过学习本人也总结了一些创建Mat类对象常用的几种方法,在这里也记录一下。

1. 使用构造函数

 cv::Mat M1(3, 3, CV_8UC4, cv::Scalar(0, 0, 0, 255));std::cout << "M1 = " << std::endl << M1 << std::endl;

  这里指定矩阵的行和列,并表示为4通道的矩阵,每个点的颜色值为(0, 0, 0, 255)。输出结果如下:

M1 =
[ 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255;
0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255;
0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255]

2. 通过数组初始化矩阵维数

 int sz[2] = { 3, 3 };cv::Mat M2(2, sz, CV_8UC1, cv::Scalar::all(0));std::cout << "M2 = " << std::endl << M2 << std::endl;

  如上,构造函数的第一个参数指定的是矩阵的维数,那么sz数组表示的是每一维数的数量,即这里表示的是3行3列。如果第一个参数是3的话,数组的大小也应该是3,表示的就是x,y,z三个维度,每个维度有3个。输出如下:

M2 =
[ 0, 0, 0;
0, 0, 0;
0, 0, 0]

3. 通过create函数来初始化

 cv::Mat M3;M3.create(4, 4, CV_8UC(1));std::cout << "M3 = " << std::endl << M3 << std::endl;

  这里是4*4的二维单通道矩阵,矩阵中的数据为随机值。如下:

[205, 205, 205, 205;
205, 205, 205, 205;
205, 205, 205, 205;
205, 205, 205, 205]

4. 通过opencv提供的类matlab的函数创建

 cv::Mat Me = cv::Mat::eye(4, 4, CV_64F);std::cout << "Me = " << std::endl << Me << std::endl;cv::Mat Mo = cv::Mat::ones(4, 4, CV_64F);std::cout << "Mo = " << std::endl << Mo << std::endl;cv::Mat Mz = cv::Mat::zeros(4, 4, CV_64F);std::cout << "Mz = " << std::endl << Mz << std::endl;

  eye函数表示的是单位矩阵,ones顾名思义是全是1的矩阵,zeros表示全是0的矩阵。输出如下:

Me =
[1, 0, 0, 0;
0, 1, 0, 0;
0, 0, 1, 0;
0, 0, 0, 1]
Mo =
[1, 1, 1, 1;
1, 1, 1, 1;
1, 1, 1, 1;
1, 1, 1, 1]
Mz =
[0, 0, 0, 0;
0, 0, 0, 0;
0, 0, 0, 0;
0, 0, 0, 0]

5. 数据自定义矩阵Mat创建

 cv::Mat M4 = (cv::Mat_<double>(3, 3) << 0, -1, 0, -1, 0, 0, 0, 0, 1);std::cout << "M4 = " << std::endl << M4 << std::endl;

  我们可以自己定义自己需要的数据量比较小的矩阵,然后通过如上的方式将其封装到cv::Mat中。如下:

M4 =
[0, -1, 0;
-1, 0, 0;
0, 0, 1]

6. 通过clone函数创建不同的Mat

 cv::Mat M5 = M4.row(1).clone();std::cout << "M5 = " << std::endl << M5 << std::endl;

  通过克隆函数clone获取我们需要的某一行或列的数据,这里构建出来的矩阵是深拷贝出来的Mat类对象。输出如下:

M5 =
[-1, 0, 0]

  以上,是对cv::Mat的简单总结。

cv::Mat初识和它的六种创建方法相关推荐

  1. OpenCV【零】—————cv::Mat——Mat对象创建方法

    OpenCV (一)--Mat对象创建方法 目录 OpenCV (一)--Mat对象创建方法 1. cv::Mat优点及原理(本质类) 2. Mat类拷贝及对象的创建方法 3. Mat 对象元素的高效 ...

  2. OpenCV序列中创建矩阵cv :: Mat的实例(附完整代码)

    OpenCV序列中创建矩阵cv :: Mat的实例 OpenCV序列中创建矩阵cv :: Mat的实例 OpenCV序列中创建矩阵cv :: Mat的实例 #include "opencv2 ...

  3. VS+openCV之深入了解 cv::Mat

    测试 cv::Mat 数据结构的不同属性 1. 头文件 #include<opencv2/core.hpp> #include<opencv2/highgui.hpp> #in ...

  4. OpenCv中的cv::Mat::create()函数,cvRound(),cvFloor(),cvCeil()函数的详解l

    文件说明: cv::create()函数的详解 函数原型: inline void Mat::create(int _rows, int _cols, int _type) inline void M ...

  5. 【OpenCV】正确创建用于保存YUV420P格式的cv::Mat

    1.问题描述 cv::Mat保存RGB24或BRG24格式时,传入宽.高和格式类型CV_8UC3就行了:今天在创建cv::Mat用来保存YUV420P时,有点懵圈了,因为类型是CV_8UC1,直接传宽 ...

  6. cv::Mat使用笔记

    1. 构造 无参数构造方法 Mat::Mat() 创建行数为 rows,列数为 col,类型为 type 的图像 Mat::Mat(int rows, int cols, int type) 创建大小 ...

  7. 【OpenCV3】cv::Mat的定义与初始化

    cv::Mat是OpenCV2和OpenCV3中基本的数据类型,在cv::Mat类中,关于cv::Mat的定义和初始化有多种不同的形式,这里,将对其进行详尽的总结和介绍. 一.无数据拷贝的cv::Ma ...

  8. 在OpenCV中将cv::Mat绘制到MFC的视图中

    毕设时遇到了一个问题,不能在MFC中显示由GrabCut抠出来的图.经一番折腾发现: 在OpenCV中如果图像最初是Mat类型的话,就不能通过转换为IplImage,再转换为CvvImage来显示到V ...

  9. OpenCv学习笔记(二)—cv Mat学习

    由于在写上一篇图像的数据结构时,发现自己只知道CvMat,竟然还有Mat数据结构,真是无知了,看了这么多程序,貌似没有看到这个结构.有可能那些程序都是些老版本的例子,这是在2.0以后加上的,所以我也得 ...

最新文章

  1. 旷视发布《人工智能应用准则》,倡导AI技术健康可持续发展
  2. keygen基本流程
  3. 【python学习】模块random
  4. kiss原则包括什么_和女孩牵手与kiss的具体方法
  5. ASP.NET 打包多CSS或JS文件以加快页面加载速度的Handler
  6. Caused by: java.lang.IllegalArgumentException: No enum constant org.apache.ibatis.type.JdbcType.INT
  7. IE请求json数据时出现下载文件的现象。
  8. 产生复选框的html,html根据复选框勾选顺序生成字符串
  9. python中线程同步_Python线程同步在实际应用中功能体现
  10. shell脚本执行冲突事件-sshwhile
  11. Homebrew太慢,如何挂代理加速
  12. 什么是大数据与智能数据?什么是惯性测量单元与GNSS?
  13. 文献标识码、文献载体类型标识
  14. HDwiki+discuz在启用https下的整合问题
  15. 赵小楼《天道》《遥远的救世主》深度解析(77)叶、冯、刘三人用了丁元英,就用了他的一切,没有能力的时候还谈什么缘,攀缘没有对错,起码得先活着
  16. 搞笑的chitgpt
  17. 云产研见客户的行为分析
  18. 模拟赛20200228(yyq)【右链+dfs序,子树管辖,聚集水流问题】
  19. leetcode第58题 最后一个单词的长度
  20. Win7中计算机管理窗口如何打开

热门文章

  1. 上传文件到GitHub上的两种方法(纯新手可以看看)
  2. Js中NaN不等于NaN
  3. phpstorm调试远程服务器代码(超详细版本)
  4. 盗心贼歌曲用计算机多少数字,盗心贼歌词 黑龙盗心贼LRC歌词
  5. 中断絮说(二)——陈莉君老师经典
  6. 过去一年最惊人的30个机器学习项目
  7. mfc-7360扫描时无法检查连接计算机,mfc7360怎么扫描 mfc7360扫描键无反映解决办法...
  8. BZOJ 3758 数数 分段打表
  9. Node.appendChild
  10. 转载-游戏数值对答录