我运行了这段代码,以检查找到的常见实例的数量以及模板所在的位置。应该有7个匹配项,但是它只显示4个,当我尝试打印计数时,运行代码时它显示为21个。我知道,由于阈值> 0.8,它返回21。但是,有没有一种方法可以避免,即对同一模板进行多次计数?另外,我如何也可以检测其他3个模板?
import numpy as np
import cv2
img=cv2.imread('tempsearch.jpg')
template=cv2.imread('temptemp.jpg')
r,c,s=template.shape
res=cv2.matchTemplate(img,template,cv2.TM_CCOEFF_NORMED)
thresh=0.8
count=0
loc=np.where(res>thresh)
for pt in zip(*loc[::-1]):
cv2.rectangle(img , pt , (pt[0]+c , pt[1]+r) , (0,255,0) , 2)
count+=1
#print(img[list(pt)])
#cv2.imshow('img'+str(count),img[list(pt)])
cv2.imshow('det',img)
cv2.imshow('res',res)
cv2.waitKey(0)
cv2.destroyAllWindows()
图片:
模板:
答案 0 :(得分:0)
听起来您的模板对单个对象有多个可能的匹配,而您只想要最佳匹配。在对象检测中,通常使用Non-Maximum Suppression解决此问题。本质上,您会发现所有重叠的边界框并采用得分最高的边界框。假设您的阈值很好,那么每个匹配对象只有一个边界框。