赞
踩
本文将介绍如何通过一个Mat对象,获取图像个各种信息(cols,rows,channels,depth,type),以及图像深度、类型问题。
- #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;
- }
上述代码会显示一张图片,并将图片的相关信息打印出来。
后两个需要注意一下,它们是枚举值,打印时会打印其对应的数字。下面说下这些枚举值,附图:
图中,上部分是图像深度对应的枚举值,下部分是图像类型对应的枚举值。
图像深度值是多少(注意深度值和深度不一样,这里图像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):
主要介绍了图像的几个基本属性,图像深度这些要搞懂。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。