当前位置: 首页 > news >正文

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<float>():直接引用原始数据指针
  1. 内存管理机制

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

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

cv::Mat a = imread("image.jpg");
cv::Mat b = a;          // 浅拷贝(共享数据)
cv::Mat c = a.clone();  // 深拷贝(独立内存)
http://www.dtcms.com/a/308553.html

相关文章:

  • 亚马逊自然流量增长密码:从算法逻辑到运营体系的全维度解析
  • WSL配置网络说明
  • 太阳光模拟器测试包装材料的耐候性
  • SUID/SGID是啥?如何让普通用户拥有root的能力?
  • WinForm之CheckBox 控件
  • Conda环境下配置的基本命令
  • 【Android】PopupWindow实现长按菜单
  • 难以逾越的夏天
  • 小架构step系列31:处理异常
  • documentPictureInPicture API 教程
  • IK 字段级别词典的升级之路
  • 14day-ai入门-人工智能基础学习-OpenCV-图像预处理4
  • 2683. 相邻值的按位异或
  • GXHT30温湿度传感器可兼容SHT30
  • NMOS防反接电路分析
  • [特殊字符] 数字孪生 + 数据可视化:实战经验分享,让物理世界数据 “会说话”
  • ubuntu18.04 部署nfs服务
  • 第15届蓝桥杯C++青少组中级组选拔赛(STEMA)2024年3月10日真题
  • Java与MySQL AES加密解密实战指南
  • pytest vs unittest: 区别与优缺点比较
  • #C语言——学习攻略:深挖指针路线(五)--回调函数,qsort函数,qsort函数的模拟实现
  • ACOSRAR改进连续蚁群算法用于优化复杂环境下无人机路径规划,Matlab代码实现
  • 中烟创新参编的《软件和信息技术服务行业企业环境社会治理信息披露指南》标准正式发布
  • 树形DP-核心基础
  • 《质光相济:Three.js中3D视觉的底层交互逻辑》
  • 直击WAIC | 百度袁佛玉:加速具身智能技术及产品研发,助力场景应用多样化落地
  • 虚幻基础:模型穿模
  • 产品型号:PCD231B101产品类型:信号隔离转换模块
  • Redis学习14-认识哨兵机制
  • cesium视锥体