【问题标题】:Python 2.7 OpenCV matchTemplate, Get only the best matchPython 2.7 OpenCV matchTemplate,只获取最佳匹配
【发布时间】:2018-07-12 18:54:09
【问题描述】:
THRESHOLD = 0.9
results = cv2.matchTemplate(image, template, cv2.TM_CCOEFF_NORMED)
locations = numpy.where( results >= THRESHOLD) # <---

使用上面的代码(箭头所在的位置)我可以得到所有高于某个threshold的匹配项。

但我只想从results 获得最佳匹配,然后检查最佳匹配是否高于threshold。我该怎么做?

注意:请让您的答案适合初学者。

【问题讨论】:

  • 你需要使用cv2.minMaxLoc()

标签: python python-2.7 numpy opencv


【解决方案1】:

你应该使用cv2.minMaxLoc()。这将只返回一个和最佳匹配。

min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(results)

top_left = max_loc
bottom_right = (top_left[0] + w, top_left[1] + h)

cv2.rectangle(image.copy(), top_left, bottom_right, 255, 2)

**插图:**

我以足球场上的梅西为图像,以他的脸为模板。

img = cv2.imread('C:/Users/selwyn77/Desktop/messi.jpg', 0)
img2 = cv2.imread('C:/Users/selwyn77/Desktop/messi.jpg', 1)
template = cv2.imread('C:/Users/selwyn77/Desktop/messi_face.jpg', 0)
w, h = template.shape[::-1]

#img3 = img2.copy()

res = cv2.matchTemplate(img,template,cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)

top_left = max_loc
bottom_right = (top_left[0] + w, top_left[1] + h)

cv2.rectangle(img2, top_left, bottom_right, (0, 255, 0), 2)

cv2.imshow('img', img2)    

编辑:

您可以设置一个阈值并检查max_val 是否大于此阈值。如果大于则继续绘制匹配区域。

threshold = 0.85
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(results)
if max_val > threshold:

    top_left = max_loc
    bottom_right = (top_left[0] + w, top_left[1] + h)
    cv2.rectangle(image.copy(), top_left, bottom_right, 255, 2)

【讨论】:

  • 我怎样才能合并阈值?因为无论匹配多么糟糕,这个解决方案总是匹配的。如果它低于某个阈值,我希望它不显示任何匹配项。
猜你喜欢
  • 1970-01-01
  • 2014-02-26
  • 2021-06-11
  • 1970-01-01
  • 1970-01-01
  • 2015-11-10
  • 2016-08-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多