c#机器学习之opencv(2)-Mat基础
创始人
2024-04-15 03:05:35
0

目录

    • Mat基础
    • Mat本质
    • copyTo与clone

Mat基础

opencv将图像数据存在一个二维矩阵里。
在这里插入图片描述
下面代码复制了一个图像矩阵。

Mat srcPic = new Mat("test1.png", ImreadModes.Color);
Mat aPic = new Mat(srcPic,new OpenCvSharp.Rect(100,120, srcPic.Width-100, srcPic.Height-120));
Mat bPic = aPic;
using (new OpenCvSharp.Window("src image", srcPic))
using (new OpenCvSharp.Window("copy image", aPic))
{Cv2.WaitKey();
}

上述所有对象都指向同一个数据矩阵,使用其中任何一个对象进行修改都会影响所有其他对象。实际上,不同的对象只是为相同的底层数据提供不同的访问方法。然而,它们的头部部分是不同的。
上面代码使用区域new OpenCvSharp.Rect(100,120, srcPic.Width-100, srcPic.Height-120)来创建一个不同的矩阵,注意复制操作符只复制头文件和指向大矩阵的指针,而不复制数据本身。

Mat本质

真正有趣的部分是,您可以创建只引用完整数据的一部分的标题。例如,要在图像中创建一个感兴趣的区域(ROI),只需创建一个具有新边界的新标题。
关于Mat您需要知道的第一件事是,您不再需要手动分配它的内存并在不需要它的时候释放它。虽然这样做仍然是有可能的,但大多数OpenCV函数将自动分配其输出数据。如果传递一个已经存在的Mat对象,它已经为矩阵分配了所需的空间,那么这个对象将被重用。换句话说,我们在任何时候都只使用执行任务所需的内存。

Mat基本上是一个包含两个数据部分的类:矩阵头(包含诸如矩阵的大小、用于存储的方法、存储矩阵的地址等信息)和一个指向包含像素值的矩阵的指针(根据所选择的存储方法获取任何维度)。矩阵标题的大小是恒定的,但是矩阵本身的大小可能因图像而异,通常会大几个数量级。

我们不应该忘记我们正在讨论的是图像处理算法,这往往是计算量很大的。
我们最不想做的就是通过对可能较大的图像进行不必要的复制来进一步降低程序的速度。为了解决这个问题,OpenCV使用了一个引用计数系统。
其思想是,每个Mat对象都有自己的头,但是,通过使两个Mat对象的矩阵指针指向相同的地址,可以在两个Mat对象之间共享一个矩阵。
此外,复制操作符只复制头文件和指向大矩阵的指针,而不复制数据本身。

现在你可能会问——如果矩阵本身可能属于多个Mat对象,当它不再需要时,谁负责清理它呢?
简短的回答是:最后一个使用它的对象。这是通过引用计数机制来处理的。每当有人复制Mat对象的头文件时,矩阵的计数器就会增加。每当清理标头时,此计数器将减少。当计数器达到零时,矩阵被释放。

如果要复制数据本本身,需要使用cv::Mat::clone() and cv::Mat::copyTo()

copyTo与clone

copyTo
下面是第一种方式,好理解,直接复制。

void cv::Mat::copyTo 	( 	OutputArray  	m	) 	const

下面是copyTo的第二种重载方式
void cv::Mat::copyTo ( OutputArray m,
InputArray mask
) const
mask mask与源Mat相同大小,是操作掩码,其非零元素指示需要复制哪些矩阵元素。掩码必须是CV_8U类型,可以有一个或多个通道。

clone和copyTo差不多,都是复制数据。

            Mat srcPic = new Mat("test1.png", ImreadModes.Color);Mat aPic=new Mat();srcPic.CopyTo(aPic);Mat bPic = srcPic.Clone();bPic[110, 180, 10, 100] = srcPic[30, 100, 10, 100];using (new OpenCvSharp.Window("a image", aPic))using (new OpenCvSharp.Window("b image", bPic))using (new OpenCvSharp.Window("src image", srcPic)){Cv2.WaitKey();}

下面这一行修改了bPic图像数据。但并没有影响srcPic。
bPic[110, 180, 10, 100] = srcPic[30, 100, 10, 100];

在这里插入图片描述 下面是没有深度复制的情况

            Mat srcPic = new Mat("test1.png", ImreadModes.Color);Mat aPic=new Mat();srcPic.CopyTo(aPic);Mat bPic = new Mat(srcPic, new OpenCvSharp.Rect(0, 0, srcPic.Width, srcPic.Height));bPic[110, 180, 10, 100] = srcPic[30, 100, 10, 100];using (new OpenCvSharp.Window("a image", aPic))using (new OpenCvSharp.Window("b image", bPic))using (new OpenCvSharp.Window("src image", srcPic)){Cv2.WaitKey();}

在这里插入图片描述

相关内容

热门资讯

喜闻乐见,2026年“国补”政... 12月30日,国家发展改革委、财政部印发的《关于2026年实施大规模设备更新和消费品以旧换新政策的通...
女子与表姐夫婚外情获赠三百余万... 一桩发生在海南的民间借贷纠纷,将一段持续二十余年的婚外情推到台前。相关材料显示,男子林森(化名)在婚...
诉讼纠纷频发!中央商场子公司又... 继控股子公司新亚百货面临补缴税款及滞纳金7392万元后,百货零售巨头中央商场(600280.SH)另...
从明天起,楼市迎来两大利好政策... 作者:暴哥 来源:暴财经pro 同志们,2025年要过去了! 今年,各位在股市里应该收获不少,把过去...
国台办回应台湾网红“馆长”大陆... 12月31日,国台办举行例行新闻发布会,国台办发言人张晗就近期两岸热点问题回答记者提问。 有记者提问...
中钢天源:股东中钢热能院907... 雷达财经 文|冯秀语 编|李亦辉 12月30日,中钢天源(证券代码:002057)发布公告称,其控股...
宇树科技因侵权责任纠纷案件被起... 天眼查法律诉讼信息显示,近日,杭州宇树科技股份有限公司及邵某新增1条开庭公告,原告为孙某,涉及侵权责...
今日视点:“制度创新+科技突破... 2025年,A股市场交易活跃度持续提升。截至12月30日,全年累计成交金额达417.8万亿元,同比增...
专业文章丨第二顺位抵押权人实现... 【珠海律师、珠海法律咨询、珠海律师事务所、京师律所、京师珠海律所】 (本文转载自北京市京师郑州律师事...
企业就网络谣言报案并追究法律责... 2025-12-31 09:41:29 作者:狼叫兽 声明指出,目前相关网络平台已对上述不实信息进...