【问题标题】:Find the best match among templates using OpenCV template matching matchTemplate()使用 OpenCV 模板匹配 matchTemplate() 查找模板之间的最佳匹配
【发布时间】:2021-06-11 19:37:19
【问题描述】:

我有一组口袋妖怪精灵 (example) 和一张显示其中一个精灵的图像。 an image contains a sprite 我打算在精灵中找到与res = cv2.matchTemplate 的最佳匹配结果,以便获得该口袋妖怪的名称。

for t in templates:
    res = cv2.matchTemplate(img, t, cv2.TM_CCOEFF_NORMED)
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)

但是,我不知道如何使用res 选择最佳结果。如何使用res 作为衡量匹配的指标?谢谢!

【问题讨论】:

  • 对于 CCOEFF 方法,您的 max_loc 将告诉您最大相关系数的 (x, y) 位置(这将是模板匹配最佳的位置)。我的回答here 可能会有所帮助;它试图解释所有不同的模板匹配模式。正如我在那个答案中所讨论的那样,我实际上建议将 SQDIFF 用于数字图像。

标签: python c++ opencv image-processing computer-vision


【解决方案1】:

这里的教程描述了如何使用matchTemplate函数的输出来选择最佳匹配: https://docs.opencv.org/3.4/de/da9/tutorial_template_matching.html

看起来您可能只是错过了 normalize 调用,它将所有结果缩放到一个设定范围。在本教程的示例中,此范围为 0 - 1。

在你的情况下,以下应该是你需要的:

cv2.normalize( res, res, 0, 1, cv2.NORM_MINMAX, -1 )

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


if (match_method == cv2.TM_SQDIFF or match_method == cv2.TM_SQDIFF_NORMED):
    match_loc = min_loc
else:
    match_loc = max_loc 

match_loc 根据所使用的模板匹配方法为您提供最佳匹配。

编辑:如果有一个阈值,您决定,例如,“最佳”匹配高于/低于(取决于所使用的方法)0.5 被认为根本不匹配,那么您将实施逻辑来表明未找到匹配项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多