1、Mat类型
为解决原C语言中IplImage内存管理问题,引入C++类Mat自动管理内存
Mat类由两个部分组成:
1)矩阵头matrix header(包含矩阵尺寸、存储方法、存储地址等等),矩阵头的尺寸是常数
2)一个指向存储所有像素值的矩阵(所选存储方法的不同可以是不同的维数)的指针matrix pointer,
引用计数制管理Mat对象的内存
每个Mat对象有自己的矩阵头(matrix header),但可能共享的相同图像矩阵(矩阵指针指向相同地址)
copy构造函数,只拷贝矩阵头和矩阵指针,不拷贝图像矩阵
如果要拷贝矩阵用clone或copyTo方法
//读取图像
using var lenaA = Cv2.ImRead(ImagePath.LenaColor, ImreadModes.Color);
if (lenaA.Empty()) return;
//共享图像矩阵
var lenaB = new Mat(lenaA, Range.All, Range.All);
using var lenaC = lenaA;
//获取指定区域图像
using var lenaD = new Mat(lenaA, new Rect(100, 250,370, 180));
using var lenaE = lenaA[new Range(100, 200), Range.All];
//复制图像矩阵
using var lenaF = lenaA.Clone();
using Mat lenaG = new Mat();
lenaA.CopyTo(lenaG);
//修改某个区域为绿
lenaA[new Rect(50, 100, 150, 200)] = new Mat(new Size(150, 200), MatType.CV_8UC3,Scalar.Green);
//显示所有图像
using (new Window("lenaA", lenaA))
using (new Window("lenaB", lenaB))
using (new Window("lenaC", lenaC))
using (new Window("lenaD", lenaD))
using (new Window("lenaE", lenaE))
using (new Window("lenaF", lenaF))
using (new Window("lenaG", lenaG))
{
Cv2.WaitKey();
}
显示结

本文介绍了OpenCV中Mat类的作用,它用于自动管理内存,解决了C语言中IplImage的内存问题。Mat由矩阵头和指向像素值的指针组成,使用引用计数机制管理内存。文章讨论了Mat的复制(如clone和copyTo方法)、共享以及如何通过不同方法创建和初始化Mat对象,包括设置特定颜色空间和数据类型。此外,还展示了如何格式化输出Mat对象的内容。

1128

被折叠的 条评论
为什么被折叠?



