将 PIL 图像转换为 OpenCV2 图像

Convert PIL image to OpenCV2 image

我正在使用 entireScreen=ImageGrab.grab() 创建一个屏幕截图,然后使用 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 重新加载它。

在 linux 系统上,可以使用 pyscreenshot 作为其 docs 状态,它是 ImageGrab 模块的替代品,它仅适用于 Windows。

所以,在我的 linux 系统上,我做了这样的事情 -

import pyscreenshot as ImageGrab

然后,您可以抓取屏幕截图并直接在内存 space 中访问它作为 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]))