《学习OpenCV3》第4章 图像和大型数组类型(持续更新)

本文深入介绍了OpenCV中的核心类cv::Mat,讲解了其作为多维稠密数组的特性,包括动态可变存储、Mat类的结构以及如何创建和初始化数组。重点讨论了Mat的构造函数,包括默认构造、指定大小和数据类型、复制构造等,并提到了静态方法如创建全0、全1和单位矩阵。此外,还阐述了独立获取数组元素的方法。
摘要由CSDN通过智能技术生成

学习OpenCV系列博客
上一章: 了解OpenCV的数据类型
下一章:

1. 动态可变的存储

  • cv::Mat 是OpenCV所有C++实现的核心
  • Mat 用于表示任意维度的 稠密数组 。稠密表示该数组的所有部分都有一个值存储,即使这个值是0。图像就是由稠密数组存储的。
  • 稀疏数组 在spare array中被实现,稀疏数组中只有非0点的数值会被存储。
  • 理论上,如果数组很多地方都是0,那么稀疏数组会非常节约内存。但是在数组比较稠密的时候,稀疏数组反而会浪费大量内存。
  • 使用稀疏数组最常见的例子是统计直方图

2. Mat类N维稠密数组

  • 所有的矩阵都包括:
    • 一个表示他所包含数组类型的元素flag
    • 一个表示其维度的元素dims
    • 分别表示行和列的树木的元素rowscols (当dims大于2时无效);
    • 一个指示数据真正存储位置的data指针
    • 一个表示该内存区域有多少个引用的refcount元素。
  • Mat 中的数据不要求必须是简单基元,可以是一个简单的数字,也可以是多个数字。包含多个数字的时候,它就被称为多通道数组

3. 创建一个数组

3.1 本书最重要的一段

  • 理解数组中的数据与数组对象的解耦时,需要以辩证的观点来考虑。对象 Mat 是数据实体的头,它和数据实体完全是不同的东西。例如将一个矩阵 n 赋值给矩阵 m (m=n)。m内部的数据指针 之前所指向的 数据实体m 将会被释放。与此同时,mn 所共享的内存区域的引用指针会增加一个引用计数。然后 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. 独立获取数组元素

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MechMaster

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值