将WinAPI屏幕截图转换为OpenCV兼容表单

时间:2016-10-28 14:06:41

标签: python opencv numpy winapi

所以我最初问了一个问题here,与PIL相比,使用win api进行更快的屏幕截图。我能够通过BitBlt成功捕获屏幕。

现在我不确定如何将位图转换为可与OpenCV一起使用的形式。 OpenCV对位图没有任何支持,当我打印(im)时,它是一个~14k长的1D阵列。 OpenCV无法对1D做任何事情,我试图用NUMPY重塑它并没有成功。

def take_screenshot1(hwnd):
  wDC = win32gui.GetWindowDC(hwnd)
  dcObj=win32ui.CreateDCFromHandle(wDC)
  cDC=dcObj.CreateCompatibleDC()
  dataBitMap = win32ui.CreateBitmap()
  dataBitMap.CreateCompatibleBitmap(dcObj, 765, 503)
  cDC.SelectObject(dataBitMap)
  cDC.BitBlt((0, 0), (765, 503), dcObj, (0, 0), win32con.SRCCOPY)

  im = dataBitMap.GetBitmapBits(False)
  #img = np.array(im)
  #cv2.cvtColor(img, cv2.COLOR_RGB2BGR)

  dcObj.DeleteDC()
  cDC.DeleteDC()
  win32gui.ReleaseDC(hwnd, wDC)
  win32gui.DeleteObject(dataBitMap.GetHandle())

修改 这是工作代码:

def take_screenshot1(hwnd):
  wDC = win32gui.GetWindowDC(hwnd)
  dcObj=win32ui.CreateDCFromHandle(wDC)
  cDC=dcObj.CreateCompatibleDC()
  dataBitMap = win32ui.CreateBitmap()
  dataBitMap.CreateCompatibleBitmap(dcObj, 765, 503)
  cDC.SelectObject(dataBitMap)
  cDC.BitBlt((0, 0), (765, 503), dcObj, (0, 0), win32con.SRCCOPY)

  im = dataBitMap.GetBitmapBits(False)

  img = np.array(im).astype(dtype="uint8")

  img.shape = (503,765,4)

  cv2.cvtColor(img, cv2.COLOR_RGB2BGR)

  dcObj.DeleteDC()
  cDC.DeleteDC()
  win32gui.ReleaseDC(hwnd, wDC)
  win32gui.DeleteObject(dataBitMap.GetHandle())

1 个答案:

答案 0 :(得分:2)

Python化身中的

GetBitmapBits()返回一个有符号整数而不是无符号字节的数组。您应该首先将其转换为无符号字节,然后按照@DanMašek所说的那样进行。