我正在使用entireScreen=ImageGrab.grab()
创建一个screengrab,然后使用openCV2进行一些分析,以测试屏幕是否包含某些模板图像。这些模板加载了template = cv2.imread(name,0)
。
我现在遇到以下问题:在将屏幕截图与模板进行比较时,我总是需要首先保存我的屏幕截图:
entireScreen.save('pics/screenshot.png', format='png')
然后重新加载:
cv2.imread('screenshot.png',0)
否则以下情况不起作用:
res = cv2.matchTemplate(img,template,method)
我会收到类似这样的错误消息:
TypeError: image is not a numpy array, neither a scalar
我的问题:如何将屏幕截图从entireScreen=ImageGrab.grab()
转换为与opencv2兼容的格式,而无需保存,然后使用cv2.imread重新加载。
答案 0 :(得分:1)
在Linux系统上,可以使用pyscreenshot
作为docs
状态,它是ImageGrab模块的替代品,ImageGrab模块仅适用于Windows。
所以,在我的linux系统上,我做了类似的事情 -
import pyscreenshot as ImageGrab
然后,您可以获取屏幕截图并直接在内存空间中访问它作为一个numpy数组,而无需实际保存到磁盘上并使用imread
读取,如此 -
img = np.array(ImageGrab.grab().convert('RGB'))
这个img
可以与cv2.matchTemplate
一起使用。
逐步运行样本并验证输出 -
In [32]: import pyscreenshot as ImageGrab
In [33]: img = np.array(ImageGrab.grab().convert('RGB'))
In [34]: img.shape
Out[34]: (768, 1366, 3)
In [35]: img.dtype
Out[35]: dtype('uint8')
以下是一个示例运行,展示cv2.matchTemplate
如何与img
一起使用 -
In [41]: res = cv2.matchTemplate(img[:,:,0],img[10:40,50:80,0],cv2.TM_SQDIFF)
In [42]: np.where(res<10) # 10 is threshold for matching
Out[42]: (array([10]), array([50]))