(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
相关推荐
ahccqw20 小时前
OpenCV 车辆数量统计
人工智能·opencv·计算机视觉
架构师伯子明1 天前
ffmpeg学习4:opencv在音视频领域常用指令
opencv·学习·ffmpeg
LongRunning3 天前
【Linux】RK3568-OpenCV+YOLO(八)
linux·opencv·yolo
会飞锦鲤5 天前
基于 SVM + HOG 的铸造缺陷检测系统
python·opencv·机器学习·计算机视觉·缺陷检测·图像分类·svm
小豆庄9 天前
本地视频打码:多模型检测、帧间追踪与18种模糊的选型
opencv·目标检测·ai·自然语言处理·音视频·视频
爱吃火鸡面呀9 天前
OpenCV 颜色识别实战:从 HSV 原理到摄像头实时检测
人工智能·opencv·计算机视觉
ahccqw9 天前
OpenCV 缩放 与 位移
人工智能·opencv·计算机视觉
AI的探索之旅10 天前
OpenCV Day40 —— K-means 聚类与 EM 高斯混合
opencv·kmeans·聚类
AI的探索之旅10 天前
OpenCV Day39 —— 无缝克隆 seamless cloning(cloning_demo / cloning_gui)
人工智能·opencv
小豆庄10 天前
会议录屏忘打码后的技术复盘:本地自动化隐私脱敏方案
运维·opencv·目标检测·自动化·视频·纹理贴图