几行解释:使用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]):
我大概知道前两个是什么意思。但是循环部分让我发疯。
- 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
我把 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。 (左上角)
我需要有人向我解释这四行代码:
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
我把 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。 (左上角)