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::add
、cv::subtract
、cv::multiply
和 cv::divide
函数执行 cv::Mat
对象之间的四则运算。
位运算符
在 OpenCV 中,可以使用位运算符对 cv::Mat
对象进行位操作。主要的位运算符包括按位与(&)、按位或(|)、按位异或(^)和按位取反(~)。
也可以使用一下函数:bitwise_and、bitwise_or、bitwise_xor、bitwise_not