最近开始opencv的学习,首先就要从opencv的矩阵开始学起了。opencv的矩阵是用Mat这个对象来存储的,并且提供了一些访问矩阵属性的函数,比如获取行数、列数、获取步长等等。
矩阵的内存分布
Mat的在内存中是线性存储的,矩阵是多维的,因此在存储矩阵数据的时候,需要将矩阵的分布变成线性的才行。例如二维数组,那么在内存中就是先存第一行,再存第二行,依此类推。相应的三维矩阵可以看成是多个二维矩阵,先存第一个二维矩阵,再存第二个二维矩阵,依次类推。Mat矩阵的数据在内存中的首地址为data
uchar* data;
矩阵大小
矩阵大小信息由MatSize这个类来管理,记录的是矩阵每个维度的大小,为什么这么简单的信息还要一个类来专门的记录呢?原因是Mat的维度是可变的,因此在变化的过程中需要销毁创建相应的数组,而且在这个类中重载了[]运算符,可以更加方便的获取每个维度的大小
struct CV_EXPORTS MatSize
{
explicit MatSize(int* _p);
int dims() const;
Size operator()() const;
const int& operator[](int i) const;
int& operator[](int i);
operator const int*() const; // TODO OpenCV 4.0: drop this
bool operator == (const MatSize& sz) const;
bool operator != (const MatSize& sz) const;