将PIL图像转换为OpenCV2图像

时间:2015-10-03 04:40:36

标签: python opencv numpy python-imaging-library

我正在使用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重新加载。

1 个答案:

答案 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]))