我是图像处理的新手,在我的应用程序中,我使用模板匹配检测眼睛虹膜,所以我用标准虹膜串并执行模板匹配,代码如下:
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)还有其他方法可以消除误报吗?
请帮我解决这个问题。
提前致谢
答案 0 :(得分:0)
它认为templateimagesults.Ptr中值的位置是您想要的匹配百分比,它是模板与特定位置的窗口图像的相似度值。请参阅:http://docs.opencv.org/modules/imgproc/doc/object_detection.html
减少误报并改善回忆在这些工作中始终是平衡的,你不应该只关注减少误报。也许您可以尝试使用标准机器学习框架进行对象检测
答案 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模板匹配
推荐的机器学习教程
高级图像匹配,请参考匹配学习,例如神经网络