Bootstrap

关于Mat类型data、step、depth、elemsize等属性的解读

关于Mat类型data、step、depth、elemsize等属性的解读

假如我们有一块地皮,我们要在这个地皮上盖房子,用来做宾馆。首先我们要设计好关于这块地皮的所有属性,比如:
//假设宾馆只有一种房型//
盖几层
房子类型
每层的房间有几行几列
房间号
每行有多少间房
每列有多少间房
每个房间几张床
每张床的成本价
每个房间一晚多少钱
折合一张床每晚多少钱
每行所有的房间一晚一共多少钱
每行所有的房间一共有多少张床

这样我们就大体上了解宾馆的基本情况,对比Mat类型的图片,2维的Mat就是一个平面,相当于宾馆就盖1层;高维的Mat相当于宾馆盖了多层,这里我们以1层的宾馆对比一张图片(图片是2维),那么宾馆的属性可以和Mat类型的图片属性一 一对应起来,一个像素点即是一间房:

dim:图片的维数,类比宾馆盖了几层

type:图片的类型,对于宾馆,表示建筑风格,是洋房啊还是别墅啊还是小高层什么的,这里就当是单层别墅吧。对于图片,有着标准规定,type的输出是0-30的整数,分别对应不同的类型见图:

size() :返回的是(行,列)对比宾馆,表示宾馆的占地面积。

data :对于图片,data是一个uchar类型的指针,指向Mat数据矩阵的首地址,让我们轻易的找到任何一个像素位置,访问像素的任何属性。对比宾馆,对应房间号,我们进去某个房间,可以方便的看看这个房间的位置是不是靠边呐,几张床呀之类,访问房间的属性。

cols 对于图片,指有多少列,对比宾馆,每行有多少间房

rows 对于图片,指有多少行,对比宾馆,每列有多少间房

channel 对于图片,指有几个通道,比如灰度图有1个通道,RGB图有3个通道。对比宾馆,每个房间有几张床。

depth 对于图片,用来衡量像素中每一个通道的精度,depth数值越大,精度越高,图片内容越丰富。Opencv中,Mat.depth()得到的是一个0~6的数字,分别代表不同的位数,对应关系如下:
enum{CV_8U=0,CV_8S=1,CV_16U=2,CV_16S=3,CV_32S=4,CV_32F=5,CV_64F=6} 。对比宾馆,指每张床的成本价级别,成本价分6个级别,级别越高,价格越高,宾馆逼格越高。

elemsize 对于图片,指每一个元素的数据大小,如果Mat中的数据类型是CV_8UC1,那么 elemSize=1;如果是CV_8UC3 、CV_8SC3,那么elemSize=3;如果是CV_16UC3或者CV_16SC3,那么elemSize=6;即elemSize是以8位(一个字节)为一个单位,乘以通道数和8位的整数倍。对比宾馆,表示每间房一晚价格的级别,有1、3 、6等价位级别,级别越高,一晚上的价格越贵。

elemsize1 加上一个“1”构成了elemSize1这个属性,1可以认为是元素内1个通道的意思,即表示Mat矩阵中每一个元素单个通道的数据大小,以字节为一个单位。所以与elemsize1的关系可以表达为:
eleSize1==elemSize/channels
对于宾馆,表示一张床每晚价格的级别(房间里可能有好几张床)

step 可以理解为Mat矩阵中每一行的“步长”,以字节为基本单位,每一行中所有元素的字节总量。对于宾馆,表示每行所有的房间一晚一共花费多少级的钱

step1 与step的关系是:step1==step/elemSize1;对比宾馆,每行所有的床一晚花费多少级的钱

为了更好的理解,下面附上代码:

#include"iostream"
#include"opencv2/opencv.hpp"
using namespace std;
using namespace cv;

int main()
{
	Mat src = imread("1.jpg");
	//namedWindow("原图", CV_WINDOW_NORMAL);
	//imshow("原图", src);
	uchar *Data = src.data;

	cout << "原图尺寸为: " << src.size() << endl << endl;
	cout << "channel: " << src.channels() << endl << endl;
	cout << "rows: " << src.rows << endl << endl;
	cout << "cols: " << src.cols << endl << endl;
	cout << "dims: " << src.dims << endl << endl;
	cout << "depth: " << src.depth() << endl << endl;
	cout << "elemSize: " << src.elemSize() << endl << endl;
	cout << "elemSize1: " << src.elemSize1() << endl << endl;
	cout << "step: " << src.step << endl << endl;
	cout << "step1: " << src.step1() << endl << endl;
	cout << "channel总数:" << (src.cols)*(src.channels()) << endl << endl;
	cout << "type: " << src.type() << endl << endl;
	cout << "step/elemSize: " << src.step / src.elemSize() << endl << endl;

	if ((src.cols)*(src.channels())== src.step1())
	{
		cout << "通道总数与step1相等,即step1也表示每行的通道总数" << endl ;
	}
	else
	{
		cout << "通道总数与step1不相等,即step1不表示每行的通道总数" << endl ;
	}
	if (src.cols == (src.step / src.elemSize()))
	{
		cout << "列数与step/ src.elemSize的值相等,即step/ src.elemSize表示图像的列数" << endl ;
	}
	else
	{
		cout << "step / src.elemSize不表示图像的列数" << endl;
	}

	waitKey(0);
	system("pause");
	return 0;

}在这里插入代码片

输出的结果如下图所示:

那么我们的宾馆就设计完成了,按照程序结果从上往下总结一下:宾馆总面积为19201080,每间房有3张床,一共盖了1080行,1920列,经费有限,宾馆就盖了一层(长宽,只有两维,没有高),每张床的成本价不咋地,是0级别的床,每间房每晚的价位级别是3级(床不咋滴,价格还挺贵,可能因为每间房的床多吧),折合一张床的价位级别是1级,宾馆每行所有的房间一晚上共花了5760级的钱,折合每行所有的床一晚花费5760级的钱(因为每张床的价格是1即),宾馆的建筑风格是单层别墅类型。

;