完整教程:OpenCV 的 Mat 类详解

OpenCV 的 Mat 类详解

Mat 是 OpenCV 中最核心的 多维数组类,用于存储图像、矩阵、张量等数据。它比原生数组更强大,支持自动内存管理、多种数据类型和多维操作。

  1. Mat 的本质

    不是简单的数组,而是一个 智能矩阵容器,包含:

    数据头(尺寸、数据类型、通道数等元信息)
    指向实际数据的指针(支持引用计数,自动释放内存)

    支持多维数据:1D(向量)、2D(矩阵)、3D(体积数据)等

  2. 关键构造函数解析

构造函数原型:

Mat(int rows, int cols, int type, void* data, size_t step = AUTO_STEP);

参数含义

参数类型说明
rowsint行数(二维矩阵的高度)
colsint列数(二维矩阵的宽度)
typeint数据类型 + 通道数(如 CV_8UC3 表示 8位无符号3通道)
datavoid*可选的外部数据指针(不传则自动分配内存)
stepsize_t每一行的字节步长(默认 AUTO_STEP 自动计算)
  1. 数据类型 (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. 构造示例
    示例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():直接引用原始数据指针
  1. 内存管理机制

    引用计数:多个 Mat 对象可共享同一数据内存,最后一个引用释放时自动销毁数据

    深拷贝:调用 clone() 时复制独立副本

cv::Mat a = imread("image.jpg");
cv::Mat b = a;
// 浅拷贝(共享数据)
cv::Mat c = a.clone();
// 深拷贝(独立内存)
posted @ 2025-08-13 18:40  yjbjingcha  阅读(105)  评论(0)    收藏  举报