微信公众号“Dotnet讲堂”的文章《c#实现模板匹配,并输出匹配坐标》(参考文献1)中介绍了采用OpenCVSharp库实现模板匹配功能,也即在目标图片中定位指定图片内容的示例,本文参照参考文献1-4,学习并测试OpenCVSharp库的模板匹配功能.
新建Winform项目,在NuGet管理器中添加OpenCVSharp包引用,由于参考文献1中并未说明OpenCVSharp库,最开始安装的下图中第一个包,但测试时并没有找到Cv2类,于是又重新安装了包OpenCvSharp4,此时NuGet包才安装正确。
根据参考文献2中的介绍,不同的操作系统需安装的包不同,主要分为以下几种情形。如果是引用程序集方式,则需在参考文献6中下载相应的dll文件。除此之外,OpenCvSharp不支持Unity和Xamarin平台,也不支持CUDA,详细说明见参考文献2。
1)Windows (UWP除外,UWP的介绍见参考文献5):需安装包OpenCvSharp4和OpenCvSharp4.runtime.win,也可以单独安装包OpenCvSharp4.Windows,本文选择了前者;
2)UWP:需安装包OpenCvSharp4和OpenCvSharp4.runtime.uwp;
3)Ubuntu 20.04:需安装包OpenCvSharp4和OpenCvSharp4.runtime.ubuntu.20.04.x64。
模板匹配功能主要使用以下类及方法:
1)采用Mat类保存图片内容、匹配结果等信息;
2)调用Cv2中的MatchTemplate函数计算源图形和目标图形的proximity map(Bing给出的翻译为临近图,但是百度搜索临近图没有找到多少有用内容),函数原型如下所示:
3)调用Cv2中的MinMaxLoc函数返回MatchTemplate函数计算结果中的最大/最小值及对应位置,参考文献1中使用返回的最大值判断是否匹配成功,搞不懂原理,但感觉类似相似度的用法。函数原型如下:
参考文献2中还提到,Mat等类中使用了非托管资源,需要手工调用Dispose函数释放资源,使用+,、-、*等操作符创建的对象也需要手工释放。对此有两种方式解决:
1)创建对象时使用using标识对象需释放,即采用using var a =new Object类似的形式;
2)OpenCvSharp库提供ResourcesTracker类,使用该类提供的创建函数新建的对象,在ResourcesTracker类对象实例释放时,会一起释放资源。特此将参考文献1中的示例代码修改为使用ResourcesTracker类的形式,代码如下所示:
using (var t = new ResourcesTracker())
{
Mat srcImage = t.T(new Mat(picSrcImage.Tag.ToString(), ImreadModes.Color));
Mat templateImage = t.T(new Mat(picDest.Tag.ToString(), ImreadModes.Color));
Mat result = t.NewMat();
Cv2.MatchTemplate(srcImage, templateImage, result, TemplateMatchModes.CCoeffNormed);
double minVal = 0;
double maxVal = 0;
OpenCvSharp.Point minLoc = new OpenCvSharp.Point();
OpenCvSharp.Point maxLoc = new OpenCvSharp.Point();
Cv2.MinMaxLoc(result, out minVal, out maxVal, out minLoc, out maxLoc);
if (maxVal > 0.8)
{
Cv2.Rectangle(srcImage, maxLoc, new OpenCvSharp.Point(maxLoc.X + templateImage.Width, maxLoc.Y + templateImage.Height), Scalar.Red, 2);
t.T(new Window("匹配结果", srcImage));
Cv2.WaitKey();
}
}
最后是测试程序运行效果,如下图所示:
参考文献:
[1]https://blog.csdn.net/sD7O95O/article/details/132725989
[2]https://github.com/shimat/opencvsharp
[3]https://github.com/shimat/opencvsharp_samples/
[4]http://shimat.github.io/opencvsharp/api/OpenCvSharp.html
[5]https://baike.baidu.com/item/Universal%20Windows%20Platform/23796796?fromtitle=uwp&fromid=4236943&fr=aladdin
[6]https://github.com/shimat/opencvsharp/releases