几行解释:使用openCV

时间:2019-06-04 17:51:46

标签: python opencv template-matching

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

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”是什么意思?我的意思是星号
  • 什么意思呢?

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

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

我将中断放在最后,因为我只想使用一次循环(您认为有更好的方法吗?)

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

1 个答案:

答案 0 :(得分:0)

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

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

enter image description here

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

np.where返回其中res /匹配质量的值大于或等于阈值(设置为0.70)的索引。索引对应于图像的x和y值。索引以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()返回一个可迭代的对象,该对象可用于循环。它创建输入参数的元组,并使用for pt in逐一返回。在这种情况下,输入是x值数组和y值数组,因此它将返回(x,y)元组。元组存储在pt中。

尝试显示/打印一些步骤,它将帮助您理解。

===

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

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