opencv--Mat类解析

补充:http://www.cnblogs.com/wangguchangqing/p/4016179.html 这篇博客写的很不错,查缺补漏

在计算机内存中,数字图像是以矩阵的形式保存的。OpenCV2中,数据结构Mat是保存图像像素信息的矩阵,它主要包含两部分:矩阵头和一个指向像素数据的矩阵指针。
矩阵头主要包含,矩阵尺寸、存储方法、存储地址和引用次数等。
矩阵头的大小是一个常数,不会随着图像的大小而改变,但是保存图像像素数据的矩阵则会随着图像的大小而改变,通常数据量会很大,比矩阵头大几个数量级。这样,在图像复制和传递过程中,主要的开销是由存放图像像素的矩阵而引起的。因此,OpenCV使用了引用次数,当进行图像复制和传递时,不再复制整个Mat数据,而只是复制矩阵头和指向像素矩阵的指针。例如:

cv::Mat a ;//创建矩阵头
a = cv::imread("f:\\psb.jpg");//读入图像
cv::Mat b = a ;//复制 

上面的a,b有各自的矩阵头,但是其矩阵指针指向同一个矩阵,也就是其中任何一个改变了矩阵数据都会影响另外一个。
那么,多个Mat共用一个矩阵数据,最后谁来释放矩阵数据呢?
这就是引用计数的作用,当Mat对象每被复制一次时,就会将引用计数加1,而每销毁一个Mat对象(共用同一个矩阵数据)时引用计数会被减1,当引用计数为0时,矩阵数据会被清理。

1.存储类型
矩阵数据类型:

  CV_<bit_depth>(S|U|F)C <number_of_channels>

S = 符号整型 U = 无符号整型 F = 浮点型

Eg:

CV_8UC1 是指一个8位无符号整型单通道矩阵,

CV_32FC2是指一个32位浮点型双通道矩阵

CV_8UC1 CV_8SC1 CV_16U C1 CV_16SC1
CV_8UC2 CV_8SC2 CV_16UC2 CV_16SC2
CV_8UC3 CV_8SC3 CV_16UC3 CV_16SC3
CV_8UC4 CV_8SC4 CV_16UC4 CV_16SC4
CV_32SC1 CV_32FC1 CV_64FC1
CV_32SC2 CV_32FC2 CV_64FC2
CV_32SC3 CV_32FC3 CV_64FC3
CV_32SC4 CV_32FC4 CV_64FC4

其中,通道表示每个点能存放多少个数,类似于RGB彩色图中的每个像素点有三个值,即三通道的。

图片中的深度表示每个值由多少位来存储,是一个精度问题,一般图片是8bit(位)的,则深度是8。

2.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个通道的矩阵

3.使用imwrite函数,将Mat对象保存到指定的文件中。

bool imwrite(const string& filename,InputArray img,constvector<int>& params=vector<int>())

filename,指定的文件
img ,要保存的Mat对象
params, 用来指定图像的保存编码方式。
使用filename的扩展名来指定图像的保存格式(.jpg .png .bmp),对于不同的图像保存类型,params是不同的值

  • JPEG,params用来指定图像的质量(0到100),默认的是95. CV_IMWRITE_JPEG_QUALITY
  • PNG,params用来指定图像的压缩级别(0到9),压缩级别越高图像占用的空间越小,保存图像所用的时间越久。默认值是3.
    CV_IMWRITE_PNG_COMPRESSION
  • PPM,PGM,PBM,params是一个标记(0或者1),默认的是1.CV_IMWRITE_PXM_BINARY

imwrite只能保存8位(或者是16位无符号(CV_16UC)的PNG,JPEG200或者TIFF图像)单通道或者三通道的图像,如果要保存的不是这样的图片,可以使用convertTo或者cvtColor来进行转变。
4.at读取Mat中的数据
Mat的成员函数at()是一个模板函数,矩阵元素使用at<>()函数来索引

for (int r = 0; r < im.rows; r++)  
{  
  for (int c = 0; c < im.cols; c++)  
  {     
    pix = im.at<Vec3b>(r,c);  
    pix = pix*scale;  
    om.at<Vec3b>(r,c) = pix;  
  }     
}  

注意:使用at函数时,应该知道矩阵元素的类型和通道数,根据矩阵元素类型和通道数来确定at函数传递的类型,代码段4中使用的是Vec3b这个元素类型,他是一个包含3个unsigned char类型向量。之所以采用这个类型来接受at的返回值,是因为,我们的矩阵im是3通道,类型为unsigned char类型的。
4.使用Mat的成员函数ptr<>()

Vec3b *ppix_im(NULL);  
Vec3b *ppix_om(NULL);  
for (int r = 0; r < im.rows; r++)  
{  
  ppix_im = im.ptr<Vec3b>(r);  
  ppix_om = om.ptr<Vec3b>(r);  
  for (int c = 0; c < im.cols; c++)  
  {  
     ppix_om[c] = ppix_im[c]*scale;  
  }  
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是OpenCV库的所有(按字母顺序排序): - cv::Algorithm:OpenCV算法的基 - cv::BFMatcher:基于暴力匹配的特征匹配算法 - cv::BackgroundSubtractor:背景减法算法的基 - cv::CalibrateCRF:相机响应函数校准算法 - cv::CalibrateDebevec:Debevec反演算法 - cv::CalibrateRobertson:Robertson反演算法 - cv::CascadeClassifier:级联分器 - cv::CommandLineParser:命令行参数解析器 - cv::DescriptorMatcher:特征描述子匹配器的基 - cv::FastFeatureDetector:FAST特征检测器 - cv::FileNode:文件节点,用于读取和写入XML/YAML文件 - cv::FileStorage:文件存储,用于读取和写入XML/YAML文件 - cv::FlannBasedMatcher:基于FLANN的特征匹配算法 - cv::GFTTDetector:GFTT特征检测器 - cv::HOGDescriptor:HOG特征描述子 - cv::KAZE:KAZE特征检测器和描述子提取器 - cv::KeyPoint:关键点 - cv::MSER:MSER特征检测器 - cv::Mat:矩阵 - cv::MatOfByte:字节型矩阵 - cv::MatOfDMatch:特征匹配结果矩阵 - cv::MatOfFloat:单精度浮点型矩阵 - cv::MatOfFloat4:四元组单精度浮点型矩阵 - cv::MatOfInt:整型矩阵 - cv::MatOfKeyPoint:关键点矩阵 - cv::MatOfPoint:点矩阵 - cv::MatOfPoint2f:二维点矩阵 - cv::MatOfPoint3f:三维点矩阵 - cv::MatOfRect:矩形矩阵 - cv::MatOfRotatedRect:旋转矩形矩阵 - cv::MatOfUChar:无符号字符型矩阵 - cv::Mat_<T>:模板矩阵,用于存储T型的数据 - cv::ORB:ORB特征检测器和描述子提取器 - cv::PCA:主成分分析算法 - cv::RQDecomp3x3:QR分解算法 - cv::Rect:矩形 - cv::RotatedRect:旋转矩形 - cv::SimpleBlobDetector:简单的Blob检测器 - cv::StereoBM:基于块匹配的立体视觉算法 - cv::StereoSGBM:基于半全局匹配的立体视觉算法 - cv::TermCriteria:停止准则 - cv::Tracker:目标跟踪器的基 - cv::UMat:统一内存矩阵,用于在CPU和GPU之间共享数据 - cv::VideoCapture:视频捕获 - cv::VideoWriter:视频写入 - cv::VoronoiDiagramGenerator:Voronoi图生成器

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值