我正在使用函数cv.matchTemplate
来查找模板匹配项。
result = cv.matchTemplate(img, templ, match_method)
运行函数后,列表result
中有很多答案。我想过滤列表以找到最佳的 n 匹配项。 result
中的数据只是大量数字,因此我不知道要基于什么条件进行过滤。使用extremes = cv.minMaxLoc(result, None)
会对结果列表进行不必要的过滤,然后再将其转换为位置。
match_method是cv.TM_SQDIFF
。我要:
我该如何实现?
答案 0 :(得分:1)
您可以对matchTemplate的结果进行分类,以找到具有足够匹配项的位置。 This tutorial应该可以帮助您入门。阅读页面底部的内容以查找多个匹配项。
import numpy as np
threshold = 0.2
loc = np.where( result <= threshold) # filter the results
for pt in zip(*loc[::-1]): #pt marks the location of the match
cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0,0,255), 2)
请紧记,取决于您使用的功能将决定您的过滤方式。随着匹配质量的提高,cv.TM_SQDIFF
趋于零,因此将threshold
设置得更接近零会滤掉更差的结果。 cv.TM CCORR
cv.TM_CCORR_NORMED
cv.TM_COEFF
和cv.TM_COEFF_NORMED
的匹配方法则相反(更好的是1)
答案 1 :(得分:1)
以上答案未找到所要求的最佳N个匹配项。它根据阈值过滤掉答案,从而使您仍然有超过N个结果或超过零个结果超过阈值的可能性。
要找到N个“最佳匹配项”,我们正在2维数组中查找N个最高数字并检索其索引,以便我们知道位置。我们可以使用nump.argpartition在1d数组中找到最高的N个索引,而numpy.ndarray.flatten和numpy.unravel_index可以在2d和1d数组之间来回移动,就像这样:
find_num = 5
result = cv.matchTemplate(img, templ, match_method)
idx_1d = np.argpartition(result.flatten(), -find_num)[-find_num:]
idx_2d = np.unravel_index(idx_1d, result.shape)
从这里您可以找到前5个匹配项的x,y位置。