OpenCV 的 Mat 类详解
OpenCV 的 Mat 类详解
Mat 是 OpenCV 中最核心的 多维数组类,用于存储图像、矩阵、张量等数据。它比原生数组更强大,支持自动内存管理、多种数据类型和多维操作。
-
Mat 的本质
不是简单的数组,而是一个 智能矩阵容器,包含:
数据头(尺寸、数据类型、通道数等元信息)指向实际数据的指针(支持引用计数,自动释放内存)
支持多维数据:1D(向量)、2D(矩阵)、3D(体积数据)等
-
关键构造函数解析
构造函数原型:
Mat(int rows, int cols, int type, void* data, size_t step = AUTO_STEP);
参数含义
参数 | 类型 | 说明 |
---|---|---|
rows | int | 行数(二维矩阵的高度) |
cols | int | 列数(二维矩阵的宽度) |
type | int | 数据类型 + 通道数(如 CV_8UC3 表示 8位无符号3通道) |
data | void* | 可选的外部数据指针(不传则自动分配内存) |
step | size_t | 每一行的字节步长(默认 AUTO_STEP 自动计算) |
- 数据类型 (type) 详解
通过 CV_<位数><数据类型>C<通道数> 格式指定:
// 单通道示例
CV_8UC1 // 8位无符号单通道 (灰度图像)
CV_32FC1 // 32位浮点单通道// 多通道示例
CV_8UC3 // 8位无符号3通道 (BGR彩色图像)
CV_32FC4 // 32位浮点4通道 (RGBA带透明度)常见类型对照表
OpenCV 类型 等效C类型 典型用途
CV_8U uint8_t 灰度图像(0-255)
CV_32F float 深度学习浮点数据
CV_64F double 高精度计算
- 构造示例
示例1:创建空矩阵
// 创建一个 480x640 的3通道彩色图像(初始值为0)
cv::Mat img(480, 640, CV_8UC3, Scalar(0, 0, 0));
示例2:包装外部数据
float externalData[10] = {1.1, 2.2, ..., 10.0};
cv::Mat mat(2, 5, CV_32FC1, externalData); // 2行5列的浮点矩阵
⚠️ 注意:此时 mat 不拥有数据所有权,需确保 externalData 生命周期长于 mat
示例3:深度学习输出解析
// 将4D网络输出blob转换为2D矩阵
cv::Mat detectionMat(detection.size[2], detection.size[3], CV_32F, detection.ptr<float>());
detection.size[2]:检测到的物体数量(行数)detection.size[3]:每个物体的参数数量(列数,SSD模型为7)CV_32F:32位浮点数据detection.ptr<float>():直接引用原始数据指针
-
内存管理机制
引用计数:多个 Mat 对象可共享同一数据内存,最后一个引用释放时自动销毁数据
深拷贝:调用 clone() 时复制独立副本
cv::Mat a = imread("image.jpg");
cv::Mat b = a; // 浅拷贝(共享数据)
cv::Mat c = a.clone(); // 深拷贝(独立内存)