学习OpenCV系列博客 上一章: 了解OpenCV的数据类型 下一章:
1. 动态可变的存储
cv::Mat 是OpenCV所有C++实现的核心Mat 用于表示任意维度的 稠密数组 。稠密表示该数组的所有部分都有一个值存储,即使这个值是0。图像就是由稠密数组存储的。稀疏数组 在spare array中被实现,稀疏数组中只有非0点的数值会被存储。理论上,如果数组很多地方都是0,那么稀疏数组会非常节约内存。但是在数组比较稠密的时候,稀疏数组反而会浪费大量内存。 使用稀疏数组最常见的例子是统计直方图 。
2. Mat类N维稠密数组
所有的矩阵都包括:
一个表示他所包含数组类型的元素flag ; 一个表示其维度的元素dims ; 分别表示行和列的树木的元素rows 和cols (当dims大于2时无效); 一个指示数据真正存储位置的data指针 ; 一个表示该内存区域有多少个引用的refcount 元素。 Mat 中的数据不要求必须是简单基元,可以是一个简单的数字,也可以是多个数字。包含多个数字的时候,它就被称为多通道数组
3. 创建一个数组
3.1 本书最重要的一段
理解数组中的数据与数组对象的解耦时,需要以辩证的观点来考虑。对象 Mat 是数据实体的头,它和数据实体完全是不同的东西。例如将一个矩阵 n 赋值给矩阵 m (m=n)。m内部的数据指针 之前所指向的 数据实体m 将会被释放。与此同时,m 和 n 所共享的内存区域的引用指针会增加一个引用计数。然后 m 与数据实体相关的成员依据新数据进行更新(比如行列与数据类型)。这将引导出一个非常方便的结果,数组可以被赋值给另一个数组,并且这个工作能够在后台运行,以确保获得正确的结果。
3.2 Mat的默认构造函数
可以通过实例化变量 cv::Mat 来创建一个数组,通过这种方式创建的数组没有大小和数据类型; 之后可以再次使用成员函数 create() 来申请一个内存区域。 下表是一个完整的关于 cv::Mat 构造函数的列表,实际上大多数时候只需使用其中几个,但我还是把它们全部列在下面,方便查看。
构造函数 说明 Mat 构造函数 Mat(int rows, int cols, int type) 指定类型的二维数组 Mat(int rows, int cols, int type, const Scalar& s) 指定类型的二维数组,并指定初始化值 Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP) 指定类型的二维数组,并指定预先存储的数据 Mat(Size sz, int type, const Scalar& s) 指定类型的二维数组,并指定初始化值(大小由sz指定) Mat(Size sz, int type, void* data, size_t step=AUTO_STEP) 指定类型的二维数组,并指定预先存储的数据(大小由sz指定) Mat(int ndims, const int* sizes, int type) 指定类型的多维数组 Mat(int ndims, const int* sizes, int type, const Scalar& s) 指定类型的多维数组,并指定初始化值 Mat(int ndims, const int* sizes, int type, void* data, size_t step=AUTO_STEP) 指定类型的多维数组,并指定预先存储的数据
3.3 Mat的复制构造函数
构造函数 说明 Mat(const Mat& mat) 复制构造函数 Mat(const Mat& mat, const Range& rows, const Range& cols) 只从指定的行列中复制数据 Mat(const Mat& mat, const Rect& roi) 只从感兴趣的区域中复制数据 Mat(const Mat& mat, const Range& ranges) 服务于n维数组,从泛化的感兴趣区域中复制数据 Mat(const MatExpr& expr) 从其他矩阵的线性代数表述中生成新矩阵
3.4 Mat的模板构造函数
构造函数 说明 Mat(const Vec<T, n>& vec, bool copyData = true) 构造一个如同Vec所指定的数据类型为T、大小为n的一维数组 Mat(const Matx<T, m, n>& vec, bool copyData=true)) 构造一个如同Matx所指定的数据类型为T、大小为m×n的二维数组 Mat(const std::vector< T>& vec, bool copyData=true) 构造STL的vector所指定的数据类型为T、大小为vector元素数的一维数组
3.5 Mat的静态方法(全0矩阵,全1矩阵,单位矩阵)
构造函数 说明 Mat::zeros(rows, cols, type) 构造一个大小为rows×cols、数据类型为type指定类型的、值全为0的矩阵 Mat::ones(rows, cols, type) 构造一个大小为rows×cols、数据类型为type指定类型的、值全为1的矩阵 Mat::eye(rows, cols, type) 构造一个大小为rows×cols、数据类型为type指定类型的单位矩阵
4. 独立获取数组元素