如何确定matchTemplate是否找到了对象?

8
我使用了这个答案并编写了自己的程序,但我有一个具体的问题。
如果图像中没有对象,matchTemplate不会抛出错误,并且我不知道任何方法来检查matchTemplate是否找到了对象,是否可以给我建议或者给我一个检查这个问题的函数名称。
2个回答

12

matchTemplate() 返回一个矩阵,其值表示对象在该像素中心的概率。如果您知道那里有对象(且仅有一个对象),则只需查找最大值的位置。

如果您不知道,则必须找到最大值,如果它高于某个阈值,则应该存在您的对象。

现在,选择该阈值很棘手-您需要为您的应用程序找到好的阈值。当然,您会有一些误报(当没有对象时,但最大值大于阈值)和一些漏报(您的对象没有创建足够大的峰值)

选择阈值的方法是收集包含或不包含对象的相当大的图像数据库,并统计对象在内时峰值大小,以及在没有对象时峰值大小,并选择最佳分离两个类别的阈值


如果可能的话,您能告诉我用于检查的函数或类吗? - haykart
minMaxLoc(),在您提供的链接中,仅返回最大位置。在正确的位置上填写双重引用,而不是NULL,您将收到图像中的最大值。(请检查OpenCV文档中的minMaxLoc()) - Sam
如果”matchTemplate()“返回概率值,为什么返回矩阵中会得到负值?您对此有任何想法吗? - G_cy
@G_cy,它可以根据您使用的方法返回负值,如果您只打算使用一种方法,我建议您阅读每种方法的相关信息。这是一个展示所有方法的好网站:https://docs.opencv.org/4.x/d4/dc6/tutorial_py_template_matching.html - Rstar37

0
在我的项目中,我使用了多对象模板匹配的示例,并且只检查了"loc"数组的长度。
 res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED)
 threshold = 0.20
 loc = np.where( res >= threshold) 

 if len(loc[0])>0:
     detection = True
 else:
     detection = False

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接