【OpenCV】获取图像宽度、高度、通道数、深度、类型

avatar
作者
筋斗云
阅读量: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 结束语

        主要介绍了图像的几个基本属性,图像深度这些要搞懂。

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!