我需要有人向我解释这四行代码:
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
我将中断放在最后,因为我只想使用一次循环(您认为有更好的方法吗?)
我将非常感谢所有回答的人。如果您只知道一个答案,然后分享,则不必回答我所有的问题。谢谢<3
答案 0 :(得分:0)
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
/匹配质量的值大于或等于阈值(设置为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。 (左上角)