我不认为用那种方法是可行的,但我很乐意接受纠正并学到新知识。我知道有一些解决方法。
第一个方法是继续使用
pyautogui
,调用它的
mouseposition()
函数并在截图上粘贴/绘制自己合成的鼠标指针。我使用了OpenCV的
fillPoly()
函数来实现:
import cv2
import numpy as np
import pyautogui
import datetime
Xs = [0,8,6,14,12,4,2,0]
Ys = [0,2,4,12,14,6,8,0]
while True:
img = pyautogui.screenshot()
mouseX,mouseY = pyautogui.position()
mouseX *= 2
mouseY *= 2
frame = np.array(img)
frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
Xthis = [4*x+mouseX for x in Xs]
Ythis = [4*y+mouseY for y in Ys]
points = list(zip(Xthis,Ythis))
points = np.array(points, 'int32')
cv2.fillPoly(frame,[points],color=[255,255,255])
frame = cv2.resize(frame,(960,540))
cv2.imshow('Title', frame)
if cv2.waitKey(1) == ord("q"):
break
cv2.destroyAllWindows()
out.release()
![enter image description here](https://istack.dev59.com/8RtGh.gif)
第二种方法是使用
ffmpeg
,它可以捕获鼠标 - 您可以在当前应用程序的位置运行
ffmpeg
,或通过管道将
ffmpeg
的输出传输到您的应用程序中,并像现在一样继续处理它。可能看起来像这样:
import sys
import cv2
import time
import subprocess
import numpy as np
w,h = 3840, 2160
def ffmpegGrab():
"""Generator to read frames from ffmpeg subprocess"""
cmd = [
'ffmpeg',
'-pix_fmt', 'bgr0',
'-f', 'avfoundation',
'-capture_cursor', '1',
'-capture_mouse_clicks', '1',
'-r', '20',
'-i', '1',
'-vf','scale=w=3840:h=2160',
'-f', 'rawvideo',
'pipe:1'
]
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
while True:
frame = proc.stdout.read(w*h*4)
yield np.frombuffer(frame, dtype=np.uint8).reshape((h,w,4))
gen = ffmpegGrab()
start = time.time()
nFrames = 0
while True:
frame = next(gen)
nFrames += 1
frame = cv2.resize(frame,(960,540))
cv2.imshow('screenshot', frame)
if cv2.waitKey(1) == ord("q"):
break
fps = nFrames/(time.time()-start)
print(f'FPS: {fps}')
cv2.destroyAllWindows()
out.release()
![enter image description here](https://istack.dev59.com/KveV7.gif)
注意,pyautogui 在我的 Mac 上捕获一帧需要约 600 毫秒的时间,而上面的
ffmpeg
实现了约 20fps,每帧约 50 毫秒。
关键词:Python、图像处理、ffmpeg、pyautogui、屏幕抓取、屏幕捕获、fps、速度、素数。
ffmpeg
的-f
和-i
参数将有所不同。 - Mark Setchellcv2.fillPoly()
调用之前打印points
数组。 - Mark Setchell