使用模板匹配时获取匹配的百分比值

时间:2014-02-09 21:05:23

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

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

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)还有其他方法可以消除误报吗?

请帮我解决这个问题。

提前致谢

2 个答案:

答案 0 :(得分:0)

  1. 它认为templateimagesults.Ptr中值的位置是您想要的匹配百分比,它是模板与特定位置的窗口图像的相似度值。请参阅:http://docs.opencv.org/modules/imgproc/doc/object_detection.html

  2. 减少误报并改善回忆在这些工作中始终是平衡的,你不应该只关注减少误报。也许您可以尝试使用标准机器学习框架进行对象检测

答案 1 :(得分:0)

“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模板匹配

推荐的机器学习教程

高级图像匹配,请参考匹配学习,例如神经网络