您的位置:首页 > 运维架构

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();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: