import time
import cv2
import win32api
import win32con
import win32gui
import win32ui
import numpy as np
def grab_screen_win32():
"""
region:tuple,(left, top, right,down)
"""
hwin = win32gui.GetDesktopWindow()
width = 1920
height = 1080
left = 0
top = 0
hwindc = win32gui.GetWindowDC(hwin)
srcdc = win32ui.CreateDCFromHandle(hwindc)
memdc = srcdc.CreateCompatibleDC()
bmp = win32ui.CreateBitmap()
bmp.CreateCompatibleBitmap(srcdc, width, height)
memdc.SelectObject(bmp)
while True:
start = int(round(time.time() * 1000))
memdc.BitBlt((0, 0), (width, height), srcdc, (left, top), win32con.SRCCOPY)
signedIntsArray = bmp.GetBitmapBits(True)
img = np.frombuffer(signedIntsArray, dtype='uint8')
# print(img.shape)
img.shape = (height, width, 4)
# print(img.shape)
cv2.imshow("image", img)
cv2.waitKey(1)
print("耗时:", int(round(time.time() * 1000)) - start, "ms")
srcdc.DeleteDC()
memdc.DeleteDC()
win32gui.ReleaseDC(hwin, hwindc)
win32gui.DeleteObject(bmp.GetHandle())
def grab_screen_dxcam():
import dxcam
camera = dxcam.create(device_idx=0,output_color="BGRA") # returns a DXCamera instance on primary monitor
camera.start(region=(0, 0, 1920, 1080),target_fps=240,video_mode=True) # Optional argument to capture a region
camera.is_capturing # True
# ... Do Something
while True:
start = int(round(time.time() * 1000))
img = camera.get_latest_frame()
cv2.imshow("image", img)
cv2.waitKey(1)
print("耗时:", int(round(time.time() * 1000)) - start, "ms")
camera.stop()
camera.is_capturing # False
pass
grab_screen_dxcam()
# grab_screen_win32()
两个高性能截图库
1、使用win32截图
优点:稳定,速度也快
缺点:吃内存
2、使用dxcam库截图
优点:速度比win32还快
缺点:我的电脑识别不到n卡,理论用n卡速度还可以更快,github仓库说明可以轻松达到240fps