【问题标题】:Explanation of a few lines: template matching in python using openCV几行解释:python中的模板匹配使用openCV
【发布时间】:2019-06-04 17:51:46
【问题描述】:

我需要有人给我解释一下这四行代码:

res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)    
threshhold = 0.70
loc = np.where( res >= threshhold)
for pt in zip(*loc[:: -1]):

我有点知道前两个是什么意思。但是循环部分让我发疯。

  • 在这种情况下 zip() 的作用是什么?
  • 我们为什么要颠倒列表
  • “*loc”是什么意思?我的意思是星号
  • pt 到底是什么?

其余代码(重要的部分):

while True:
    for i in range(4):
        img_gray = cv2.cvtColor(imageGrab(), cv2.COLOR_BGR2GRAY)
        f = str(files[i])
        template = cv2.imread(f, 0)

        w, h = template.shape[:: -1]

        res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)
        threshhold = 0.70
        loc = np.where( res >= threshhold)
        for pt in zip(*loc[:: -1]):

            x=pt[0]
            y=pt[1]
            center_x = (x + 0.5 * w) + 415
            center_y = (y + 0.5 * h) + 287

            pyautogui.click(center_x , center_y)
            time.sleep(4)
            count = count + 1
            break

我把 break 放在最后,因为我只想使用循环一次(你认为有什么更好的方法吗?)

我会非常感谢所有回答的人。你不必回答我所有的问题,如果你只知道一个答案然后分享。谢谢

【问题讨论】:

    标签: python opencv template-matching


    【解决方案1】:

    res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)

    matchTemplate 为每个像素计算模板与该位置图像的匹配程度。它返回一个包含这些值的二维数组。您使用的方法是TM_CCOEFF_NORMED,NORMED 表示结果已标准化,因此值映射在 0 和 1 之间。您可以显示res,最佳匹配将是白色。此图片取自文档here,您可以在其中找到更多信息。

    threshhold = 0.70
    loc = np.where( res >= threshhold)
    

    np.where 返回res/quality of match 的值大于或等于阈值(设置为 0.70)的索引。对应于图像的 x 和 y 值的索引。索引作为 2 个数组的元组返回 - 一个用于 x,一个用于 y。 Nice examples

    for pt in zip(*loc[:: -1]):
    这里发生了一些单独的事情:
    *loc[:: -1] * 允许任意数量的参数。它用于解包loc-tuple。 example
    zip(loc[1],loc[0])zip(*loc[:: -1]) 的作用相同

    列表的反转似乎是任意的并且没有必要,只要您在其余代码中考虑它即可。

    for pt in zip()
    zip() 返回一个可迭代对象,一个可用于循环的对象。它创建输入参数的元组,并使用for pt in 一一返回。在这种情况下,输入是一个 x 值数组和一个 y 值数组,因此它将返回一个 (x,y) 元组。元组存储在pt

    尝试显示/打印出一些步骤,它会帮助你理解。

    ===

    如果你只想要循环一次,我想你想要最好的匹配。您可以使用以下内容:

    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
    max_loc 将保存最佳匹配的 x,y。 (左上角)

    【讨论】:

      猜你喜欢
      • 2016-07-02
      • 2016-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-14
      • 1970-01-01
      相关资源
      最近更新 更多