代码之家  ›  专栏  ›  技术社区  ›  Programer Beginner

python 2.7 opencv matchtemplate,只获取最佳匹配

  •  0
  • Programer Beginner  · 技术社区  · 8 年前
    THRESHOLD = 0.9
    results = cv2.matchTemplate(image, template, cv2.TM_CCOEFF_NORMED)
    locations = numpy.where( results >= THRESHOLD) # <---
    

    通过上面的代码(箭头所在的位置),我可以得到 全部的 高于一定值的匹配 threshold .

    但我只想得到 最佳匹配 来自 results 然后检查 最佳匹配 如果它在 门槛 或者没有。我该怎么做?

    注意:请让您的回答对初学者友好。

    1 回复  |  直到 8 年前
        1
  •  2
  •   Jeru Luke    8 年前

    你应该用 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)    
    

    enter image description here

    编辑:

    您可以设置阈值并检查 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)