OpenCV(四) Opencv中 core 核心模块详解—— Mat类(二)之常见函数及操作
2017-08-04 16:55
513 查看
本次,介绍 Mat 类的常见操作。
1、Mat::rows()、Mat::cols() : 获取输出图像的行和列
显示了这个图像。这幅图片是2015年9月16日我和我(前)女朋友拍的,拍的还不错,就拿出来用用。
那么,如果是单独对某一行或者某一列操作呢?可以这样。
2、Mat:: rowRange()、Mat::colRange() :获取制定行或者指定列的区间元素
但是有一点要说,copyTo()不仅复制某一张图,还可以将某一行复制给另外一个矩阵B。但是,B 矩阵只会变成一行了。
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是一种在感知上均匀的颜色空间,它适合度量两个颜色之间的距离。这一部分在以后的文章中也会详细谈谈
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是一种在感知上均匀的颜色空间,它适合度量两个颜色之间的距离。这一部分在以后的文章中也会详细谈谈
相关文章推荐
- OpenCV(三) Opencv中 core 核心模块详解—— Mat类(一)
- OpenCV(五) Opencv中 core 核心模块详解—— 常见的数据结构
- OpenCV(七) Opencv中 core 核心模块详解—提取感兴趣区域Roi
- OpenCV(六) Opencv中 core 核心模块详解——访问图像像素的几种方法
- OpenCV之core 模块. 核心功能(1)Mat - 基本图像容器 OpenCV如何扫描图像、利用查找表和计时 矩阵的掩码操作 使用OpenCV对两幅图像求和(求混合(blending))
- Python的shutil模块中文件的复制操作函数详解
- Python的shutil模块中文件的复制操作函数详解
- OpenCV学习笔记4 OpenCV核心模块与核心功能Core Module & Core Functionality(三)
- OpenCV学习笔记6 OpenCV核心模块与核心功能Core Module & Core Functionality(五)
- OpenCV学习笔记5 OpenCV核心模块与核心功能Core Module & Core Functionality(四)
- OpenCV学习笔记7 OpenCV核心模块与核心功能Core Module & Core Functionality(六)
- 【OpenCV3】cv::Mat类成员函数详解
- core核心模块--矩阵的掩码操作
- core核心模块--使用OpenCV对两幅图像求和(求混合(blending))
- OpenCV从入门到放弃系列之——core模块.核心功能(一)
- OpenCV之core 模块. 核心功能(2)基本绘图 随机数发生器&绘制文字 离散傅立叶变换 输入输出XML和YAML文件 与 OpenCV 1 同时使用
- OpenCV学习笔记2 OpenCV核心模块与核心功能Core Module & Core Functionality(一)
- OpenCV学习笔记3 OpenCV核心模块与核心功能Core Module & Core Functionality(二)
- opencv的Mat类详解以及mannal翻译
- opencv中Mat的一些常见操作