• 测试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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

      最后是测试程序运行效果,如下图所示:
    在这里插入图片描述在这里插入图片描述
    参考文献:
    [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

  • 相关阅读:
    SQL 的 AND、OR 和 NOT 运算符:条件筛选的高级用法
    黑鲨给电脑重装系统的详细步骤
    pytest的内置插件盘点8:terminal
    VS2010编译支持openssl的Libcurl
    Vuex数据持久化存储
    科技的成就(三十一)
    react 高价组件HOC实现组件复用
    JS最新的关键字和保留字
    Java基础之final(最简单最详细)
    java计算机毕业设计ssm汽车租赁管理系统n5s69(附源码、数据库)
  • 原文地址:https://blog.csdn.net/gc_2299/article/details/133409064