Opencv2:Mat矩阵详解(转载)
2017-06-29 10:21
260 查看
1.Mat基础
在计算机内存中,数字图像是已矩阵的形式保存的。OpenCV2中,数据结构Mat是保存图像像素信息的矩阵,它主要包含两部分:矩阵头和一个指向像素数据的矩阵指针。
矩阵头主要包含,矩阵尺寸、存储方法、存储地址和引用次数等。
矩阵头的大小是一个常数,不会随着图像的大小而改变,但是保存图像像素数据的矩阵则会随着图像的大小而改变,常
量会很大,比矩阵头大几个数量级。这样,在图像复制和传递过程中,主要的开销是由存放图像像素的矩阵而引起的。
因此,OpenCV使用了引用次数,当进行图像复制和传递时,不再复制整个Mat数据,而只是复制矩阵头和指向像素矩阵
的指针。例如:
1 2 3 | cv::Mat a ; //创建矩阵头 a = cv::imread( "f:\\psb.jpg" ); //读入图像 cv::Mat b = a ; //复制 |
上面的a,b有各自的矩阵头,但是其矩阵指针指向同一个矩阵,也就是其中任何一个改变了矩阵数据都会影响另外个。
那么,多个Mat共用一个矩阵数据,最后谁来释放矩阵数据呢?
这就是引用计数的作用,当Mat对象每被复制一次时,就会将引用计数加1,而每销毁一个Mat对象(共用同一个矩阵数据)
时引用计数会被减1,当引用计数为0时,矩阵数据会被清理。
上图是Mat对象a,b共用一个矩阵,故其引用计数refcount为2.
但是有些时候仍然会需要复制矩阵数据本身(不只是矩阵头和矩阵指针),这时候可以使用clone 和copyTo方法。
cv::Mat c = a.clone(); cv::Mat d ; a.copyTo(d);
上面代码中的c,d各自拥有自己的矩阵,改变自己的矩阵数据不会相互影响。
2.Mat存储方法
Mat中矩阵的每个元素可以使用不同的数据类型,最小的数据类型是char,占用一个字节或者8位,可以是有符号的(0
到255)或者是无符号的(-127到127)。在RGB颜色空间中,使用三个char类型可以表示1600万中颜色,但在图像处
理的程中有可能会使用到float或者double来表示图像的像素。
Mat的创建
构造函数cv::Mat img(2,2,CV_8UC3,cv::Scalar(0,0,255));
上述代码创建了一个2行2列的矩阵,矩阵元素使用8位无符号char类型保存,具有3通道,每个像素的初始
值是(0,0,255)构造函数的前两个参数指定了矩阵的行和列
第三个参数指定矩阵元素的数据类型以及通道数,其指定规则如下:
CV_[The number of bits per item][Signed or Unsigned][TypePrefix]C[The channel number]
四部分分别指定:元素的大小,是有符号还是无符号,数据类型以及通道数最后一个参数,Scalar是short型的vector,提供矩阵的初始化。
Create方法
该方法不能为矩阵设置初始值,只是在改变尺寸时为矩阵数据重新分配内存。使用方法:
img.create(4,4,CV_8UC(2));
创建了一个4行4列有2个通道的矩阵
4.Mat的显示
OpenCV提供了用以窗口的形式显示图片的方法,代码如下:
Mat img = imread("f:\psb.jpg"); const string name ="Hu"; namedWindow(name); imshow(name,img); waitKey();
相关文章推荐
- QT - OpenCV的安装与配置(转载)
- [转载]OpenCV如何扫描图像、利用查找表和计时
- Win7 64bit+Anaconda(3-5.0.1,Python3.6)+Pycharm(community-2017.3.3)+OpenCV(python‑3.4.0‑cp36‑cp36m)(转载)
- [转载]OpenCV2.3使用摄像头和视频
- OpenCv 安装 配置 VC6.0---转载
- C# OPenCV(Emgu) (转载加编辑)
- 【转载】Ubuntu下安装配置OpenNI, OpenCV(来自韶子空间)
- 转载 opencv Grabcut border matting
- [转载]用opencv实现svm
- 转载: OpenCV中HOG人检测以及Part Model latent SVM目标识别 | 丕子 http://www.zhizhihu.com/html/y2011/3436.html
- (转载)用OPENCV写的求旋转矩阵R和平移向量t的代码
- MAC平台下Xcode配置使用OpenCV的具体方法(转载)
- 利用OpenCV计算并绘制灰度直方图 (转载)
- opencv中的画图函数转载学习
- opencv 直方图 这篇文章是转载的
- opencv x64 vs2010 下打开摄像头录制视频写成avi(代码为转载)
- [转载]ubuntu 11.04安装OpenCV2.3方法总结
- (转载)opencv源码解析之CommandLin…
- 转载:树莓派安装Python-OpenCV
- Opencv中CvSeq的理解 [转载]