使用cv.matchTemplate查找多个最佳匹配

时间:2019-07-10 19:28:54

标签: opencv template-matching

我正在使用函数cv.matchTemplate来查找模板匹配项。

result = cv.matchTemplate(img, templ, match_method)

运行函数后,列表result中有很多答案。我想过滤列表以找到最佳的 n 匹配项。 result中的数据只是大量数字,因此我不知道要基于什么条件进行过滤。使用extremes = cv.minMaxLoc(result, None)会对结果列表进行不必要的过滤,然后再将其转换为位置。

match_method是cv.TM_SQDIFF。我要:

  • 将结果过滤到最匹配
  • 使用结果获取位置

我该如何实现?

2 个答案:

答案 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_COEFFcv.TM_COEFF_NORMED的匹配方法则相反(更好的是1)

答案 1 :(得分:1)

以上答案未找到所要求的最佳N个匹配项。它根据阈值过滤掉答案,从而使您仍然有超过N个结果或超过零个结果超过阈值的可能性。

要找到N个“最佳匹配项”,我们正在2维数组中查找N个最高数字并检索其索引,以便我们知道位置。我们可以使用nump.argpartition在1d数组中找到最高的N个索引,而numpy.ndarray.flattennumpy.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位置。