python - 将 WinAPI 屏幕截图转换为 OpenCV 兼容形式

标签 python opencv numpy winapi

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

现在我不确定如何将位图转换为可以与 OpenCV 一起使用的形式。 OpenCV 不支持位图,当我 print(im) 时,它是一个 ~14k 长的一维数组。 OpenCV 对一维无能为力,我尝试用 NUMPY reshape 它,但没有成功。

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())

最佳答案

GetBitmapBits()在其 Python 版本中,返回一个有符号整数数组,而不是无符号字节。您应该首先将其转换为无符号字节,然后按照@DanMašek 所说的操作。

关于python - 将 WinAPI 屏幕截图转换为 OpenCV 兼容形式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40306865/

相关文章:

python - 使用 Python/PhantomJS/Selenium 滚动无限页面

visual-c++ - OpenCV 2.0 C++ API 使用 imshow : returns unhandled exception and "bad-flag"

python - Tkinter : Button in frame not visible

python - 如何在 sklearn 中使用逻辑回归来获取连续但有界的因变量?

Python手写文本提取

python - 将 numpy 数组每行移动一个递增的值

r - 在带有网状包的 R 中使用 Python - 找不到 Numpy

python - scipy.cluster.vq.kmeans2 中的 "Matrix is not positive definite"错误

python - 为什么 Python 根据内容使用不同的引号来表示字符串?

opencv - 寻找拥有 GOCV 的人