如何优化从PyCBitmap到OpenCV图像的转换

5
我有一段代码,它能够运行,但是速度非常慢:
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图像?

2个回答

6

第一次使用Python。我认为我现在对数据结构有了更好的理解。这里是显著提高性能的修复:

更改为:

signedIntsArray = bmp.GetBitmapBits(False)
img = np.array(signedIntsArray).astype(dtype="uint8")

to:

signedIntsArray = bmp.GetBitmapBits(True)
img = np.fromstring(signedIntsArray, dtype='uint8')

速度得到了极大提升!

这是因为np库从字符串创建数组比从元组中创建更快。


1
没想到会有这么大的加速。对我来说,它改善了10倍以上。感谢这个提示! - Erasmus Cedernaes

0

使用 np.fromstring 现在已被弃用,您可以使用以下方法:

signedIntsArray = bmp.GetBitmapBits(True)
img = np.frombuffer(signedIntsArray, dtype=np.uint8)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接