Opencv学习笔记:Mat类详解(一)
来源:互联网 发布:安全优化版和官方原版 编辑:程序博客网 时间:2024/05/01 16:30
原创:http://blog.csdn.net/CV_Jason/article/details/54928920
1. 前言:Mat类起源
OpenCV作为强大的计算机视觉开源库,很大程度上参考了MatLab的实现细节和风格,比如说,在OpenCV2.x 版本以后,越来越多的函数实现了MatLab具有的功能,甚至干脆连函数名都一模一样(如 imread, imshow,imwriter等)。这一做法,不仅拉近了产品开发与学术研究的距离,并极大程度的提高了开发人员的研发效率,不得不说,Intel公司真的是一个伟大的公司。
在计算机内存中,数字图像以矩阵的形式存储和运算,比如,在MatLab中,图像读取之后对应一个矩阵,在opencv中,同样也是如此。
在早期的OpenCV1.x版本中,图像的处理是通过IplImage(该名称源于Intel的另一个开源库Intel Image Processing Library ,缩写成IplImage)结构来实现的。早期的OpenCV是用C语言编写,因此提供的借口也是c语言接口,其源代码完全是C的编程风格。IplImage结构是OpenCV矩阵运算的基本数据结构。
到OpenCV2.x版本,OpenCV开源库引入了面向对象编程思想,大量源代码用C++重写,Mat类 (Matrix的缩写) 是OpenCV用于处理图像而引入的一个封装类。从功能上讲,Mat类在IplImage结构的基础上进一步增强,并且,由于引入C++高级编程特性,Mat类的扩展性大大提高,Mat类的内容在后期的版本中不断丰富,如果你查看Mat类的定义的话(OpenCV3.1\sources\modules\core\include\opencv2\core\mat.hpp),会发现其设计实现十分全面而具体,基本覆盖计算机视觉对于图像处理的基本要求。
因此,在当前的OpenCV开发中,Mat可以说是最最最常见的数据单元,深入了解Mat类对于OpenCV深入开发有着重大意义。
2. Mat类常用成员函数和成员变量
Mat类十分庞大,其所涉及的成员函数和变量难以一一细数,在这里,仅学习记录其最最最常见的部分,以便日常使用。
2.1 构造函数
0.默认构造函数
- 1
- 1
默认构造函数,生成一个矩阵并由OpenCV提供的函数(一般是Mat::create() 和 cv::imread() )来分配储存空间。
Mat类可以分为两个部分:矩阵头和指向像素数据的矩阵指针
矩阵头 包括数字图像的矩阵尺寸、存储方法、存储地址和引用次数等,矩阵头的大小是一个常数,不会随着图像的大小而改变,但是保存图像像素数据的矩阵则会随着图像的大小而改变,通常数据量会很大,比矩阵头大几个数量级。这样,在图像复制和传递过程中,主要的开销是由存放图像像素的矩阵而引起的。因此,OpenCV使用了引用次数,当进行图像复制和传递时,不再复制整个Mat数据,而只是复制矩阵头和指向像素矩阵的指针,例如:
- 1
- 2
- 3
- 1
- 2
- 3
上面的a,b有各自的矩阵头,但是其矩阵指针指向同一个矩阵,也就是其中任何一个改变了矩阵数据都会影响另外一个。
那么,多个Mat共用一个矩阵数据,最后谁来释放矩阵数据呢?
这就是引用计数的作用,当Mat对象每被复制一次时,就会将引用计数加1,而每销毁一个Mat对象(共用同一个矩阵数据)时引用计数会被减1,当引用计数为0时,矩阵数据会被清理。
1.常用构造函数(1)
- 1
- 2
- 1
- 2
重载的构造函数,这也是常用构造函数之一,在创建对象同时,提供矩阵的大小(rows,行数;cols ,列数),以及存储类型(type)
该类型表示矩阵中每一个元素在计算机内存的存储类型,如CV_8UC3,具体含义为“3通道8位无符号数”。
使用举例:
- 1
- 1
表示src是一个10*10的矩阵,且矩阵元素以32位float型存储
类似,OpenCV还提供了一种Size() 数据结构来构造Mat对象
2.常用构造函数(2)
- 1
- 2
- 1
- 2
Size类等效于一个成对数据,size::Size(cols,rows),特别注意 cols和rows的位置
举个例子
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
输出结果
不得不说,这个Size类的数据结构有点“反人类”,但这样做的好处是方便了计算机内部的运算(比如OpenCV很多函数计算Size相关的数据也是按这个顺序来的,具体为什么这样,我也不太清楚,个人理解为行业标准)。
还有,我们平时所说分辨率,也是Size的类型,比如屏幕分别率 1440*900,其中cols=1440,rows=900。
3.常用构造函数(3)
- 1
- 1
该构造函数与使用了Scalar参数,作用是能够通过Scalar数据类来初始化元素值,例如,我们要生成一张白色背景的图片:
- 1
- 2
- 1
- 2
运行结果
其中,(255,255,255)对应以8位无符号数存储,RGB色域的白色值。
4.常用构造函数(4)
- 1
- 1
引用m矩阵,注意,这里是引用值
2.2 成员函数
1.at函数
at函数的功能是访问矩阵元素,根据不同的使用场景,有多个重载函数可供选择。
如,访问一个二维的矩阵,可用at函数原型为:
- 1
- 1
使用方法举例:
- 1
- 2
- 1
- 2
访问test.jpg图像的(0 , 0)元素
2.channels函数
- 1
- 1
返回图像的通道数
3.clone函数
- 1
- 1
矩阵复制
4.convertTo函数
- 1
- 2
- 1
- 2
转换矩阵存储类型,具体计算公式如下: m(x,y)=saturate_cast<rType>(α(∗this)(x,y)+β)
m是输入矩阵,rtype是目标类型,alpha是放缩系数,beta是增减标量
5.copyTo函数
- 1
- 1
从m矩阵复制data数据单元,与clone函数的作用类似
6.create函数
- 1
- 1
分配矩阵的存储单元,一般和默认构造函数配合使用
7**.depth函数**
- 1
- 1
返回图像深度,即矩阵元素的存储方式
8.diag函数
- 1
- 1
提取矩阵的对角元素
9.mul函数
- 1
- 1
矩阵的乘法
10.inv函数
- 1
- 1
求逆矩阵
11.t函数
- 1
- 1
求转置矩阵
12.total函数
- 1
- 1
返回矩阵的元素总个数,如30*40的图像,存在1200个像素点
2.3 成员变量
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
3. 后记
OpenCV博大精深,我不过刚刚接触,要学的东西还有很多很多很多…,继续努力!
- OpenCV学习笔记(04):Mat类详解(一)
- Opencv学习笔记:Mat类详解(一)
- OpenCV学习笔记一(Mat)
- OpenCV学习笔记(05):Mat类详解(二)
- OpenCV学习笔记(05):Mat类详解(二)
- openCV学习笔记(6):Mat类/数据结构详解(1)
- OpenCV学习笔记(一)——OpenCV数据结构Mat详解
- OpenCV学习笔记----------OpenCV数据结构Mat详解
- opencv学习(一)之Mat类
- 【OpenCV学习笔记】Mat类
- OpenCv笔记一:Mat
- OpenCV参考手册之Mat类详解(一)
- OpenCV参考手册之Mat类详解(一)
- OpenCV参考手册之Mat类详解(一)
- OpenCV参考手册之Mat类详解(一)
- OpenCV参考手册之Mat类详解(一)
- OpenCV参考手册之Mat类详解(一)
- OpenCV参考手册之Mat类详解(一)
- 手机待机一直被唤醒,NlpCollectorWakeLock NlpWakeLock
- 刚刚开通博客
- C/C++中break和continue的区别
- POJ 2159 (Ancient Cipher)
- 收藏几个模型融合的网址
- Opencv学习笔记:Mat类详解(一)
- Django21-地图
- 51Nod-1230-幸运数
- Java Web基础之文件上传
- 【补充】s3c2440启动过程详细分析
- 第三方网站QQ登录
- myeclipse和eclipse中svn插件的汉化中文和英文
- 使用forever运行nodejs应用
- 3.1Java基础语法(switch语句、循环结构)