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
