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

OpenCV(四) Opencv中 core 核心模块详解—— Mat类(二)之常见函数及操作

2017-08-04 16:55 513 查看
      本次,介绍 Mat 类的常见操作。

      1、Mat::rows()、Mat::cols() : 获取输出图像的行和列

Mat img = imread("test.jpg", 1);
imshow("src img", img);
cout << "行: " << img.rows << "\t列: " << img.cols << endl;   //输出的是 1080  1080


      显示了这个图像。这幅图片是2015年9月16日我和我(前)女朋友拍的,拍的还不错,就拿出来用用。

  

 

      那么,如果是单独对某一行或者某一列操作呢?可以这样。

Mat A(6,6,CV_8UC1,Scalar(1));
A.row(1) = A.row(2) * 2 + 5;    // 注意:行列也都是从下标为 0 开始的
cout << A << endl;
      输出结果是这样的:



      2、Mat:: rowRange()、Mat::colRange() :获取制定行或者指定列的区间元素

cout << img.rowRange(1,3);   //输出的是第一行到第三行的数据,有1080 ×3 个数据,就不截图了
      3、Mat :: clone() 和Mat::copyTo()函数,在上一篇写过了,就不赘述了。

      但是有一点要说,copyTo()不仅复制某一张图,还可以将某一行复制给另外一个矩阵B。但是,B 矩阵只会变成一行了。

Mat A(6,6,CV_8UC1,Scalar(1));
// A.row(1) = A.row(2) * 2 + 5;
// cout << A << endl;
Mat B(6,6,CV_8UC1,Scalar(2));
A.row(1).copyTo(B);
cout << A << endl;
cout << B << endl;
      输出结果 A是 6行6列,每个元素都是1。而 B 矩阵是1行6列,每行元素都是1。

      4、Mat :: convertTo()  : 在缩放或者不缩放的情况下转换为另外一种数据结构。可以借助于 Mat :: channels()函数输出通道

Mat img = imread("test.jpg", 1);
cout << img.channels() << endl; // 输出 3
Mat A1(6,6,CV_8UC1,Scalar(1));
cout << A1 << endl; // 6行6列全是1
cout << A1.channels() << endl; //输出1
A1.convertTo(A1,CV_8UC3); //也是6行6列全是1
cout << A1 << endl; //输出1
cout << A1.channels() << endl;      上面程序好像说明了,convertTo函数好像不管用。请高人指点

      关于通道,
下面解释一下。比较通俗易懂的解释是:灰度图的通道数为1,彩色图的通道为3。基本上,描述一个像素点,如果是灰度,那么只需要一个数值来描述它,就是单通道。如果一个像素点,有RGB(red、green、blue)三种颜色来描述它,需要3个数值去描述它,就是三通道。
      4通道通常为RGBA,在某些处理中可能会用到,A表示透明颜色。2通道图像不常见,通常在程序处理中会用到,如傅里叶变换,可能会用到,一个通道为实数,一个通道为虚数,主要是编程方便。还有一种情况就是16位图像,本来是3通道,但是为了减少数据量,压缩为16位,刚好两个通道,常见格式有RGB555或RGB565,也就是说R占5位,G占5或6位,B占5位,也有RGBA5551格式。古老的格式,不用也罢。

      RGB 是最常见的,它和人眼采用相似的工作机制,因此,也被显示设备采用。HSV 和 HLS把颜色分解成色调、饱和度和亮度/透明度,这是描述颜色更自然的一种方式。比如,我们可以通过抛弃最后一个元素,使算法对输入图像的光照条件不敏感。 YCrCb 在 JPRG 图像格式中被广泛使用。 CIE L*A *B是一种在感知上均匀的颜色空间,它适合度量两个颜色之间的距离。这一部分在以后的文章中也会详细谈谈
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐