opencv基础篇 ——(四)cv::Mat 常用功能介绍

31 篇文章 1 订阅

cv::Mat 功能介绍

cv::Mat 是 OpenCV 库中用于表示图像和多维数组的核心数据结构。它是 OpenCV 中进行图像处理、计算机视觉算法操作的基础。以下是对 cv::Mat 类的功能介绍:

1. 数据容器: cv::Mat 作为多维数组容器,能够存储各种类型的像素数据,包括但不限于:

  • 灰度图像(单通道)
  • 彩色图像(常见的有 BGR、RGB 等多通道表示)
  • 深度图像(如深度图、距离图)
  • 矩阵数据(一般意义上的数学矩阵)

支持的数据类型涵盖 OpenCV 定义的各种基本类型,如 CV_8U(无符号 8 位整型)、CV_16S(带符号 16 位整型)、CV_32F(32 位浮点型)等,以及它们的多通道组合(如 CV_8UC3 表示 3 个 8 位无符号整型通道)。

2. 图像访问与操作: cv::Mat 提供了丰富的接口,使得用户能够方便地访问和操作其中的像素数据:

  • 索引访问: 使用 mat.at<T>(row, col) 或 mat.at<T>(point) 语法,按行、列坐标或点坐标直接访问指定像素值,其中 T 是数据类型。
  • 迭代器: 提供 cv::MatIterator_<T> 和 cv::MatConstIterator_<T> 迭代器,用于遍历整个图像或部分区域的像素。
  • 切片与区域: 支持通过 cv::Rect 或 cv::Range 对象来选取图像的子区域(ROI,Region of Interest),返回一个新的 cv::Mat 对象,指向原数据的同一块内存。

3. 图像属性与信息获取: cv::Mat 提供了一系列方法来查询其内部状态和图像属性:

  • 尺寸: 通过 .rows 和 .cols 获取图像的高度和宽度,.size() 返回包含这两者的 cv::Size 结构。
  • 通道数: 使用 .channels() 查询图像的通道数。
  • 数据类型: .type() 返回图像数据类型的整数编码,.depth() 提供仅深度部分的编码,.channels() 提供通道数。
  • 总像素数与步长: .total() 返回图像中像素总数,.step 或 .step1() 返回每一行(或相应维度)的字节长度。
  • 数据指针与内存布局: .data 返回指向图像首像素的指针,.isContinuous() 判断图像数据是否连续存放,有助于优化内存访问。

4. 图像分配与释放: cv::Mat 负责管理其所包含的图像数据的内存:

  • 构造函数: 通过多种构造函数创建 cv::Mat 实例,包括从现有数据、大小和类型创建,从其他 cv::Mat 复制,或直接加载文件等。
  • 自动内存管理: 当 cv::Mat 对象超出作用域时,其内部会自动释放所占用的内存,无需手动管理。
  • 拷贝与引用计数: cv::Mat 实现了深拷贝和浅拷贝(引用计数)。通过赋值操作符 = 或 clone() 方法进行深拷贝,创建数据的独立副本;通过复制构造函数或 copyTo() 方法进行浅拷贝,共享同一份数据并增加引用计数。

5. 图像转换与操作: cv::Mat 提供了众多成员函数和全局函数,用于对图像进行各种转换和操作:

  • 类型转换: 使用 .convertTo() 将图像数据转换为不同数据类型。
  • 图像复制与拼接: 提供 copyTo()clone()copyMakeBorder()hconcat()vconcat() 等方法复制图像、添加边框或拼接多个图像。
  • 像素操作: 支持像素级运算,如设置所有像素值为常数(.setTo()),比较两个图像(.compare()),以及逐元素的算术和逻辑运算等。
  • 滤波与卷积: 与 cv::filter2D()cv::sepFilter2D()cv::boxFilter() 等函数配合,进行图像滤波和卷积操作。

6. 与 OpenCV API 集成: 几乎所有的 OpenCV 图像处理函数和计算机视觉算法都接受 cv::Mat 作为输入和/或输出参数,这使得 cv::Mat 成为连接各种算法的通用接口。

综上所述,cv::Mat 类在 OpenCV 中扮演着至关重要的角色,它不仅是一个高效的多维数组容器,还提供了丰富的图像操作功能和与其他 OpenCV API 的无缝集成,极大地简化了图像处理和计算机视觉编程任务。

运算

重载运算符

        在 OpenCV 中,定义了许多运算符,用于简化矩阵的操作,包括+、-、*、/、<、<=、==、!=、>=、>、&、|、^、~、

CV_EXPORTS MatExpr operator + (const Mat& a, const Mat& b);
CV_EXPORTS MatExpr operator + (const Mat& a, const Scalar& s);
CV_EXPORTS MatExpr operator + (const Scalar& s, const Mat& a);
CV_EXPORTS MatExpr operator + (const MatExpr& e, const Mat& m);
CV_EXPORTS MatExpr operator + (const Mat& m, const MatExpr& e);
CV_EXPORTS MatExpr operator + (const MatExpr& e, const Scalar& s);
CV_EXPORTS MatExpr operator + (const Scalar& s, const MatExpr& e);
CV_EXPORTS MatExpr operator + (const MatExpr& e1, const MatExpr& e2);
template<typename _Tp, int m, int n> static inline
MatExpr operator + (const Mat& a, const Matx<_Tp, m, n>& b) { return a + Mat(b); }
template<typename _Tp, int m, int n> static inline
MatExpr operator + (const Matx<_Tp, m, n>& a, const Mat& b) { return Mat(a) + b; }

运算函数

        也可以使用 cv::addcv::subtractcv::multiplycv::divide 函数执行 cv::Mat 对象之间的四则运算。

位运算符

        在 OpenCV 中,可以使用位运算符对 cv::Mat 对象进行位操作。主要的位运算符包括按位与(&)、按位或(|)、按位异或(^)和按位取反(~)。

        也可以使用一下函数:bitwise_and、bitwise_or、bitwise_xor、bitwise_not

  • 22
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值