【问题标题】:Get matching percentage value when using Template matching使用模板匹配时获取匹配百分比值
【发布时间】:2014-03-07 01:34:16
【问题描述】:

我是图像处理的新手,在我的应用程序中,我使用模板匹配检测眼睛虹膜,所以我将标准虹膜串起来并执行模板匹配,代码如下

CvInvoke.cvMatchTemplate(grayframeright_1.Ptr, templateimagegray.Ptr, templateimagesults.Ptr, TM_TYPE.CV_TM_CCORR_NORMED);

templateimagesults.MinMax(out min, out max, out Min_Loc, out MAX_Loc);

                            Location = new Point((MAX_Loc[0].X), (MAX_Loc[0].Y));

问题是有时我得到误报,为了消除误报,我计划计算/获取匹配百分比值并使用适当的 if 条件。

1)那么emgucv/opencv中有没有函数可以获取匹配的百分比值呢? 例如 - 50%、80% 等

2)还有其他方法可以消除误报吗?

请帮我解决这个问题。

提前致谢

【问题讨论】:

    标签: c# c++ opencv image-processing emgucv


    【解决方案1】:
    1. 它认为templateimagesults.Ptr中的值在尊重位置的位置是你想要的匹配百分比,它是模板与特定位置的窗口图像的相似度值。参考:http://docs.opencv.org/modules/imgproc/doc/object_detection.html

    2. 在这些工作中,减少误报和提高召回率始终是平衡的,您不应只专注于减少误报。也许您可以尝试使用标准机器学习框架进行对象检测

    【讨论】:

      【解决方案2】:

      “opencv模板匹配”实际上并没有提供文档来确定匹配百分比值,但是,如果你真的想从匹配中获得准确性,也许你可以使用以下方法:

        double maxThd = 0.7;
        double minThd = 0.3;
      
        matchTemplate( img, templ, result, match_method );
        normalize( result, result, 0, 1, NORM_MINMAX, -1, Mat() );
      
        /// Localizing the best match with minMaxLoc
        double minVal; double maxVal; Point minLoc(-1,-1); Point maxLoc(-1,-1);
        Point matchLoc;
      
        minMaxLoc( result, &minVal, &maxVal, &minLoc, &maxLoc, Mat() );
      
        /// For SQDIFF and SQDIFF_NORMED, the best matches are lower values. For all the other methods, the higher the better
        if( match_method == CV_TM_SQDIFF_NORMED && minVal < minThd)
          { matchLoc = minLoc; }
        else if(match_method == CV_TM_CCORR_NORMED && maxVal > maxThd)
          { matchLoc = maxLoc; }
      
        bool isMatch = matchLoc != cv::Point(-1,-1);
        if(isMatch) {
        // Show the result here!
        }
      

      还有更多信息,可以参考

      Opencv 模板匹配

      推荐的机器学习教程

      高级图像匹配,请参考matchine learning,e.g.神经网络

      【讨论】:

      • 谢谢你的回答,非常有价值,你能解释一下为什么我们使用这个代码 cv::Point(-1,-1) 吗?
      • ok!也许新版本更容易理解。这意味着当“matchLoc!= cv::Point(-1,-1)”成立时,从测试图像中找到模板对象,以及为什么使用cv::Point(-1,-1),因为我将所有的matchLoc(minLoc, maxLoc)初始化为虚幻点(-1,-1)来判断对象是否存在!跨度>
      • 解释得很清楚,我也想知道为什么我们使用这段代码'normalize(result, result, 0, 1, NORM_MINMAX, -1, Mat());' ,我搜索了一些文档,但没有理解......请不要误以为我要求更多解释。
      • 'normalize(result, result, 0, 1, NORM_MINMAX, -1, Mat() );',这段代码我只是参考opencv上的文档,我觉得可以去掉没有任何影响。
      猜你喜欢
      • 1970-01-01
      • 2019-07-07
      • 2012-05-11
      • 2019-07-11
      • 1970-01-01
      • 2021-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多