如何优化从 PyCBitmap 到 OpenCV 图像的转换
How to optimize conversion from PyCBitmap to OpenCV image
我有这段代码,它可以工作...但是运行起来很慢:
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 库从字符串创建数组比从元组创建数组快得多。
我有这段代码,它可以工作...但是运行起来很慢:
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 库从字符串创建数组比从元组创建数组快得多。