将 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]))
我正在使用 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]))