我有这段代码,它可以工作…但是运行非常慢:
hwin = win32gui.GetDesktopWindow() width = win32api.GetSystemMetrics(win32con.SM_CXVIRTUALSCREEN) height = win32api.GetSystemMetrics(win32con.SM_CYVIRTUALSCREEN) left = win32api.GetSystemMetrics(win32con.SM_XVIRTUALSCREEN) top = win32api.GetSystemMetrics(win32con.SM_YVIRTUALSCREEN) hwindc = win32gui.GetWindowDC(hwin) srcdc = win32ui.CreateDCFromHandle(hwindc) memdc = srcdc.CreateCompatibleDC() bmp = win32ui.CreateBitmap() bmp.CreateCompatibleBitmap(srcdc, width, height) memdc.SelectObject(bmp) memdc.BitBlt((0, 0), (width, height), srcdc, (left, top), win32con.SRCCOPY) signedIntsArray = bmp.GetBitmapBits(False) img = np.array(signedIntsArray).astype(dtype="uint8") # This is REALLY slow! img.shape = (height,width,4) srcdc.DeleteDC() memdc.DeleteDC() win32gui.ReleaseDC(hwin, hwindc) win32gui.DeleteObject(bmp.GetHandle()) return cv2.cvtColor(img, cv2.COLOR_RGBA2RGB)
这段代码捕获了整个Windows桌面(均显示),并将其转换为我以后使用的OpenCV映像。我相信,如果进行一些重新设计,此转换的运行速度可能会慢一些。具体来说,np.array(signedIntsArray)调用的确很慢!
关于如何更快地将桌面捕获转换为OpenCV映像的任何想法?
第一次使用Python。我想我对数据结构现在有了更好的了解。这是可以大大提高性能的修复程序:
更改:
signedIntsArray = bmp.GetBitmapBits(False) img = np.array(signedIntsArray).astype(dtype="uint8")
至:
signedIntsArray = bmp.GetBitmapBits(True) img = np.fromstring(signedIntsArray, dtype='uint8')
速度大大提高!
这是因为np库从字符串创建数组比从元组创建数组要快得多。