几行解释:使用openCV在python中进行模板匹配

Explanation of a few lines: template matching in python using openCV

我需要有人向我解释这四行代码:

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

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

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

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 放在最后是因为我只想使用循环一次(你认为有更好的方法吗?)

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

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

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

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

np.where returns res/匹配质量的值大于或等于阈值(设置为 0.70)的索引。对应于图像的 x 和 y 值的索引。索引被 return 编辑为 2 个数组的元组 - 一个用于 x,一个用于 y。 Nice examples

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

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

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

尝试displaying/printing一些步骤,它会帮助您理解。

===

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

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