<p>我正在做一个类似的项目。我一直在使用pyautogui库来实现自动化,但对库提供的图像匹配功能感到不满,因为精确图像匹配的运行时间很长且不灵活,所以我切换到opencv进行模板匹配。我发现这篇文章试图以最快的方式生成一个灰色numpy数组截图。弗罗约的回答并没有写到硬盘上,但我发现我所拥有的无论如何都要快一些。我也在Ubuntu上运行,我相信pyautogui的截图是在后台使用流行的linux工具scrot调用的。以下代码片段是根据opencv文档中提供的示例代码修改的:<a href="http://docs.opencv.org/3.1.0/d4/dc6/tutorial_py_template_matching.html" rel="nofollow noreferrer">http://docs.opencv.org/3.1.0/d4/dc6/tutorial_py_template_matching.html</a></p>
<pre><code>#!/usr/bin/env python
import cv2
import numpy as np
import pyautogui
import PIL
from time import time, sleep
import pyscreenshot as ImageGrab
def click_image(template_filename):
start = time()
'''
im=ImageGrab.grab()
im=im.convert('RGB')
im = np.array(im)
cv_img = im.astype(np.uint8)
screen = cv2.cvtColor(cv_img, cv2.COLOR_RGB2GRAY)
'''
pyautogui.screenshot('current_screen.png')
screen = cv2.imread('current_screen.png',cv2.IMREAD_GRAYSCALE)
template = cv2.imread(template_filename,cv2.IMREAD_GRAYSCALE)
if template is None:
print("failed to load template.")
quit()
w, h = template.shape[::-1]
method = 'cv2.TM_CCOEFF'
meth = eval(method)
# Apply template Matching
res = cv2.matchTemplate(screen,template,meth)
#get min/max values to match
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
top_left = max_loc
bottom_right = (top_left[0] + w, top_left[1] + h)
center =((top_left[0]+bottom_right[0])/2(top_left[1]+bottom_right[1])/2)
print(center)
pyautogui.moveTo(center)
pyautogui.click(center,button="right")
end = time()
print("clicked in "+str(int(1000*(end-start)))+"ms")
click_image("files.png")
</code></pre>