【问题标题】:Using cv.matchTemplate to find multiple best matches使用 cv.matchTemplate 查找多个最佳匹配项
【发布时间】:2019-07-10 19:28:54
【问题描述】:

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

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

运行函数后,列表result 中有一堆答案。我想过滤列表以找到最佳的 n 匹配项。 result 中的数据只是一大堆数字,所以我不知道要根据什么标准进行过滤。使用extremes = cv.minMaxLoc(result, None) 在将结果列表转换为位置之前以不希望的方式过滤结果列表。

match_method 是cv.TM_SQDIFF。我想:

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

我怎样才能做到这一点?

【问题讨论】:

  • This tutorial 应该可以帮助您入门。阅读页面底部以查找多个匹配项。
  • 这很有帮助!谢谢

标签: opencv template-matching


【解决方案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)

【讨论】:

    【解决方案2】:

    上面的答案没有找到问题中最好的 N 个匹配项。它会根据阈值过滤掉答案,留下(可能)您仍然有超过 N 个结果或零个结果超过阈值的可能性。

    为了找到 N 个“最佳匹配”,我们在一个二维数组中寻找 N 个最高的数字并检索它们的索引,以便我们知道位置。我们可以使用nump.argpartition 来查找一维数组中最高的 N 个索引,使用 numpy.ndarray.flattennumpy.unravel_index 在二维和一维数组之间来回切换,如下所示:

    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 位置。

    【讨论】:

      猜你喜欢
      • 2015-09-15
      • 2020-04-12
      • 1970-01-01
      • 2016-12-24
      • 1970-01-01
      • 2012-09-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-24
      相关资源
      最近更新 更多