step1 openCV Mat各属性简介

在中Mat类无疑使占据着核心地位的,前段时间初学时对Mat类有了个初步的了解,见:Mat初学 。这几天试着用实现了图像缩小的两种算法:基于等间隔采样和基于局部均值的图像缩小,发现对Mat中的数据布局和一些属性的认知还是懵懵懂懂,本文对Mat的一些重要属性和数据布局做一个总结 。
Mat的作用
Thean n- dense- or multi- array. It can be used to store real or -and ,or color , voxel ,, point , ,(, very high-may bein ).
上面的一段话引用自官方的文档,Mat类用于表示一个多维的单通道或者多通道的稠密数组 。能够用来保存实数或复数的向量、矩阵,灰度或彩色图像,立体元素,点云,张量以及直方图(高维的直方图使用保存比较好) 。简而言之,Mat就是用来保存多维的矩阵的 。
Mat的常见属性
下面的几个属性是和Mat中元素的数据类型相关的 。
下面是一个示例程序,具体说明Mat的各个属性:
Mat img(3, 4, CV_16UC4, Scalar_(1, 2, 3, 4));cout << img << endl;cout << "dims:" << img.dims << endl;cout << "rows:" << img.rows << endl;cout << "cols:" << img.cols << endl;cout << "channels:" << img.channels() << endl;cout << "type:" << img.type() << endl;cout << "depth:" << img.depth() << endl;cout << "elemSize:" << img.elemSize() << endl;cout << "elemSize1:" << img.elemSize1() << endl;
首先创建了一个3*4的具有4个通道的矩阵,其元素类型是 。是一个模板向量,用来初始化矩阵的每个像素,因为矩阵具有4个通道,有四个值 。其运行结果:
运行结果首先打印了Mat中的矩阵,接着是Mat的各个属性 。注意其type = 26,而depth = 2 。这是由于上面所说的各种预定义类型
例如,,CV_8U是一些预定义的常量 。
step
Mat中的step是一个MStep的一个实例 。其声明如下:
struct CV_EXPORTS MStep{MStep();MStep(size_t s);const size_t& operator[](int i) const;size_t& operator[](int i);operator size_t() const;MStep& operator = (size_t s);size_t* p;size_t buf[2];protected:MStep& operator = (const MStep&);};
从其声明中可以看出,MStep和有比较深的关系 。用作为参数的构造函数和重载的赋值运算符
【step1openCV Mat各属性简介】

step1  openCV Mat各属性简介

文章插图
MStep(size_t s);MStep& operator = (size_t s);
向的类型转换以及重载的[ ]运算符返回
const size_t& operator[](int i) const;size_t& operator[](int i);
的数组以及指针
size_t* p;size_t buf[2];
那么又是什么呢,看代码
typedefunsigned intsize_t;
就是无符号整数 。
再看一下MStep的构造函数,就可以知道其究竟保存的是什么了 。
inline Mat::MStep::MStep(size_t s) { p = buf; p[0] = s; p[1] = 0; }
从MStep的定义可以知道,buff是一个[2],而p是 *,也就是可以把MStep看做一个[2] 。那么step中保存的这个[2]和Mat中的数据有何种关系呢 。
step[0]是矩阵中一行元素的字节数 。
step[1]是矩阵中一个元素的自己数,也就是和上面所说的相等 。
上面说到,Mat中一个uchar* data指向矩阵数据的首地址,而现在又知道了每一行和每一个元素的数据大小,就可以快速的访问Mat中的任意元素了 。下面公式:
step1
规整化的step,值为step /。定义如下:
inline size_t Mat::step1(int i) const { return step.p[i]/elemSize1(); }
仍以上例代码中定义的img为例,来看下step,step1具体的值:
img(3*4)的type是,step[0]是其一行所占的数据字节数4 *4 * 16 / 8 = 32.
step[1] 是一个元素所占的字节数,img的一个元素具有4个通道,故:4 * 16 / 8 = 2
step1 = step /,是元素的每个通道所占的字节数 。