2014-02-09 84 views
1

我新的图像处理,在我的应用我使用模板匹配检测眼睛虹膜,所以我字符串标准光圈和执行模板匹配,代码如下获取使用模板匹配时,匹配百分比值

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)); 
给出

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

1)那么emgucv/opencv中有没有函数来获得匹配的百分比值? 例如 - 50%,80%等

2)是否有其他方法可以消除误报?

请帮我弄清楚这一点。

在此先感谢

回答

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

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

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

的建议机器学习教程

高级图像匹配,请参阅matchine学习,例如你的答案神经网络

+0

比你多,这是非常有价值的,可以请你解释一下,为什么我们使用此代码CV ::点(-1,-1)? – gouthaman93

+0

ok!也许新版本更容易理解。它意味着模板对象是在“matchLoc!= cv :: Point(-1,-1)”成立时从测试图像中找到的,为什么使用cv :: Point(-1,-1),因为我将所有matchLoc(minLoc,maxLoc)初始化为非真实点(-1,-1)以确定对象是否存在或不存在! – RyanLiu

+0

非常清楚的解释,我也想知道为什么我们使用这个代码'normalize(result,result,0,1,NORM_MINMAX,-1,Mat());' ,我搜查了一些文件,但不明白... 请不要误解我的要求更多的解释。 – gouthaman93