快速截图Winapi和Open

2024-06-08 21:37:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要为一个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的方法


Tags: 方法imgpildefnpcv2opencvtake