(11)最重要的结构体Mat

Mat是什么?

cv::Mat 是 OpenCV 里统一的数据容器------图像、矩阵、向量全用它装。本质上它是「一个指向像素内存的指针 + 一个描述矩阵信息的头」:

  • 头(header) :行、列、通道、类型、步长等元信息;
  • 数据块(data) :真正存像素值的连续内存。

你 imread 读出来的图、imshow 显示的图、算法里算的中间结果,全是 Mat。Python 里它对应 numpy.ndarray,底层还是同一套。

Mat有什么好处?

  • 统一接口:图像和矩阵一个类型搞定,函数签名干净。
  • 自动内存管理 :内部用引用计数 ,像智能指针,离开作用域自动释放,不用手写 delete,基本告别内存泄漏。
  • 浅拷贝共享数据:取 ROI、复制头部零成本,处理高效。
  • 连续内存 + 直接指针访问 :既能用 at<>() 安全访问,也能拿 data 指针裸跑,性能拉满。
  • 多类型支持:8 位、浮点、任意通道统一表达。

Mat的深拷贝和浅拷贝

浅拷贝 :只复制「头」,两个 Mat 的 data 指向同一块内存,引用计数 +1。改一个,另一个跟着变。

cpp

ini 复制代码
cv::Mat B = A;             // 浅拷贝,共享数据
cv::Mat roi = A(cv::Rect(10,10,50,50));  // ROI 也是浅拷贝,改 roi 改的是 A 那块区域

深拷贝 :分配新内存,数据完全独立,互不干扰。

cpp

css 复制代码
cv::Mat B = A.clone();     // 深拷贝,彻底独立
A.copyTo(B);               // 深拷贝当前内容(B 尺寸/类型不符时自动重新分配)

一句话区分 := 和 ROI 是浅拷贝(共享),clone() 和 copyTo() 是深拷贝(独立)。

参考下面代码理解深拷贝与浅拷贝:

访问图像(Mat)的属性

  • shape
  • size
  • dtype
相关推荐
可爱系程序猿2 小时前
OpenCV 项目启动时报 opencv_world480.dll:先核对构建与架构
人工智能·opencv·程序人生·架构·电脑
FOAF-lambda3 小时前
Python实战:基于OpenCV与单调栈,精准定位PDF中最大的空白区域
python·opencv·pdf
小豆庄20 小时前
处理含车牌/人脸的隐私视频,如何做到数据不离机?
opencv·ai·云计算·视频
小徐不徐说1 天前
C++ 机器视觉入门:从零搭建 AOI 开发环境(OpenCV + CMake)
开发语言·c++·opencv
晨间晓4 天前
图片里的高频和低频是什么?用华为云码道开发 OpenCV 傅里叶频谱分析工具
opencv·计算机视觉·华为云
晨间晓4 天前
图片里的阴影能不能减弱?用华为云码道开发 OpenCV 光照校正工具
人工智能·opencv·华为云
晨间晓5 天前
图片里的细小噪点怎么平滑?用华为云码道开发 OpenCV 图像滤波对比工具
人工智能·opencv·华为云
偷吃米饭5 天前
图片特征怎么描述?用华为云码道开发 OpenCV ORB 特征提取工具
人工智能·opencv·华为云
晨间晓5 天前
图片里的关键点怎么找?用华为云码道开发 OpenCV FAST 特征点检测工具
人工智能·opencv·华为云