我需要为一个OpenCV项目快速截屏。我可以很容易地使用PIL,例如:
def take_screenshot1(hwnd):
rect = win32gui.GetWindowRect(hwnd)
img = ImageGrab.grab(bbox=rect)
img_np = np.array(img)
return cv2.cvtColor(img_np, cv2.COLOR_RGB2BGR)
但它平均需要0.05秒,这对实时捕获来说不够快。在
我可以使用发布的答案here,但这只会将位图保存到文件中。这比使用PIL要快10倍多,但我不确定OpenCV中是否有任何方法可以将其转换为bgr/hsv图像。在
^{pr2}$在编辑:大小的值为500x500,因此在两个示例中都保存了相同的区域。在
即使我保存了图像,然后用OpenCV重新打开它,它仍然比PIL快,但是肯定有更简单的方法吗?在
编辑:好,使用注释并对winapi I进行一些研究,现在可以直接访问位图数据,如下所示:
def take_screenshot1(hwnd):
wDC = win32gui.GetWindowDC(hwnd)
dcObj=win32ui.CreateDCFromHandle(wDC)
cDC=dcObj.CreateCompatibleDC()
dataBitMap = win32ui.CreateBitmap()
dataBitMap.CreateCompatibleBitmap(dcObj, 500, 500)
cDC.SelectObject(dataBitMap)
cDC.BitBlt((0, 0), (500, 500), dcObj, (0, 0), win32con.SRCCOPY)
im = dataBitMap.GetBitmapBits(True) # Tried False also
img = np.array(im)
cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
print(img)
dcObj.DeleteDC()
cDC.DeleteDC()
win32gui.ReleaseDC(hwnd, wDC)
win32gui.DeleteObject(dataBitMap.GetHandle())
但是我不确定如何将返回的位图转换为OpenCV能够理解的格式,因为OpenCV中没有将位图转换为rgb/bgr的方法
目前没有回答
相关问题 更多 >
编程相关推荐