【问题标题】:Converting a WinAPI screenshot to a OpenCV compatible form将 WinAPI 屏幕截图转换为 OpenCV 兼容形式
【发布时间】:2016-10-28 14:06:41
【问题描述】:

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

现在我不确定如何将位图转换为可与 OpenCV 一起使用的形式。 OpenCV 不支持位图,当我 print(im) 时,它是一个~14k 长的一维数组。 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())

【问题讨论】:

  • np.fromstring(im, dtype='uint8').reshape(height,width,4)
  • @DanMašek 这不起作用.. ValueError: 新数组的总大小必须保持不变
  • 哦,我想我明白了。你有dataBitMap.GetBitmapBits(False),而当我测试它时,我用True 调用它来获得一个可以像上面那样加载的字符串。
  • 这对你有用吗?如果我截取 20 张截图,它们总是一样的,我在游戏中每秒截取 1 张截图,窗口中的图像在变化。
  • 嗨@KyleHunter 我正在尝试做我认为完全相同的事情——但结果是一个垂直拉伸并具有垂直条带的OpenCV 图像。它看起来像这样(抱歉,这是缩小版的):imgur.com/U39CAXH 关于为什么会出现这种结果的任何想法?

标签: python opencv numpy winapi


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 2017-02-27
    • 2011-09-30
    • 2020-05-26
    • 2019-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多