Opencv2:Mat矩阵详解(转载)

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();
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值