阅读量:0
1 前言
本文将介绍如何通过一个Mat对象,获取图像个各种信息(cols,rows,channels,depth,type),以及图像深度、类型问题。
2 代码及相关知识
#include "iostream" #include "opencv2/opencv.hpp" using namespace std; using namespace cv; int main(int argc,char *argv) { Mat src = imread("C:/Users/Administrator/Desktop/Zooey.png",IMREAD_COLOR); if (src.empty()) { cout << "could not find image file" << endl; return -1; } namedWindow("input", WINDOW_AUTOSIZE); imshow("input", src); //获取图像宽度、高度、以及通道数。 int width = src.cols; int height = src.rows; int dim = src.channels(); //获取图像深度与类型。 int d = src.depth(); int t = src.type(); //注意:下面d和t的输出都是枚举值对应的数字。深度为:CV_8U(0),类型为:CV_8UC3(16) printf("宽度:%d,高度:%d,通道数:%d,深度:%d,类型:%d\n", width, height, dim, d, t); waitKey(0); destroyAllWindows(); return 0; }
上述代码会显示一张图片,并将图片的相关信息打印出来。
- src.cols; 获取图像宽度,即图像列数。
- src.rows; 获取图像高度,即图像行数。
- src.channels(); 获取图像通道数。
- src.depth(); 获取图像深度。
- src.type(); 获取图像类型。
后两个需要注意一下,它们是枚举值,打印时会打印其对应的数字。下面说下这些枚举值,附图:
图中,上部分是图像深度对应的枚举值,下部分是图像类型对应的枚举值。
图像深度值是多少(注意深度值和深度不一样,这里图像24表示8位三通道,共24位。后面对深度有解释) ,我们可以右击图片属性,在详细信息中查看。如下:
我们可以看到图像类型实际上就是图像深度枚举值+Cx的格式,而C代表通道channel,C1即单通道,C2即双通道,这样来看就很好理解其含义了。比如CV_8UC3,即8位无符号3通道类型。
关于这些枚举值对应的数字,我只找到了图像深度的,图像类型本人没有找到,但靠cout<<CV_8UC1;这种方式可以将其对应的数值打印出来。图像深度对应的数值只需要用键盘随便敲出任意一个,然后右键点击转到定义即可。如图:
PS:图像深度是指存储每个像素所用的位数,它也是用来度量图像的色彩分辨率的。因此,图像深度值跟通道数也有关系,3通道一般是彩色图像,单通道则是灰度图像,CV_8UC3的彩色图像(一个像素有8x3位),图像深度是24,CV_8UC1的灰色图像(一个像素有8x1位),图像深度便是8。因为这里一个通道有8位,所以只有一个通道的灰度图像是8,而有三个通道的彩色图像便是24。
PS(2021-5-23):
- Mat<uchar>---------CV_8U
- Mat<char>-----------CV_8S
- Mat<short>---------CV_16S
- Mat<ushort>--------CV_16U
- Mat<int>-----------CV_32S
- Mat<float>----------CV_32F
- Mat<double>--------CV_64F
3 结束语
主要介绍了图像的几个基本属性,图像深度这些要搞懂。