当前位置: 首页 > news >正文

测试OpenCvSharp库的模板匹配功能

  微信公众号“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

http://www.lryc.cn/news/178403.html

相关文章:

  • 网络编程day04(网络属性函数、广播、组播、TCP并发)
  • HALCON支持GPU加速的算子有哪些?
  • MacBook Pro 电池电量限制充电怎么设置AlDente Pro for Mac最大充电限制工具
  • 毕业设计选题之Java+springboot线上蔬菜销售与配送系统(源码+调试+开题+lw)
  • 【Leetcode】162.寻找峰值
  • SpringBoot集成MinIO8.0
  • 蓝桥等考Python组别五级007
  • 【装机】通过快捷键设置BIOS从U盘启动
  • 关于操作系统与内核科普
  • 算法练习3——删除有序数组中的重复项
  • 《YOLOv5:从入门到实战》报错解决 专栏答疑
  • [2023.09.25]:Rust编写基于web_sys的编辑器:输入光标再次定位的小结
  • 估计、偏差和方差
  • 正态分布的概率密度函数|正态分布检验|Q-Q图
  • 【接口测试】HTTP协议
  • 【重新定义matlab强大系列十四】基于问题求解有/无约束非线性优化
  • MySQL 索引介绍和最佳实践
  • 区块链(7):p2p去中心化之初始化websoket服务端
  • 原型、原型链、判断数据类型
  • pycharm中配置torch
  • 什么是Times New Roman 字体
  • 企业会议新闻稿怎么写?会议类新闻稿如何撰写?
  • 算法 滑动窗口最大值-(双指针+队列)
  • Java 并发编程面试题——BlockingQueue
  • Ubuntu Nacos开机自启动服务
  • C++核心编程--继承篇
  • 小程序 解决自定义弹窗滚动穿透问题,解决弹窗背景内容滚动问题
  • win10搭建Selenium环境+java+IDEA(2)
  • 抢先一步感受未来:Raspberry Pi 5正式发布!
  • 【教程】Ubuntu自动查看有哪些用户名与密码相同的账户,并统一修改密码