Когда вы используете cv2.videowriter
, убедитесь, что размер кадра равен размеру экрана, чтобы изображение не искажалось.
Кроме того, если вам нужно записать экран, вам следует убедитесь, что окно opencv не влияет на красоту всего рабочего стола.
В своем коде я добавил полупрозрачный круг. При необходимости вы можете изменить прозрачность круга.
from PIL import ImageGrab
import numpy as np
import cv2
import datetime
from pynput import keyboard
import threading
import win32api
flag=False
def transparent_circle(img,center,radius,color,thickness):
center = tuple(map(int,center))
rgb = [255*c for c in color[:3]] # convert to 0-255 scale for OpenCV
alpha = color[-1]
radius = int(radius)
if thickness > 0:
pad = radius + 2 + thickness
else:
pad = radius + 3
roi = slice(center[1]-pad,center[1]+pad),slice(center[0]-pad,center[0]+pad)
try:
overlay = img[roi].copy()
cv2.circle(img,center,radius,rgb, thickness=thickness, lineType=cv2.LINE_AA)
opacity = alpha
cv2.addWeighted(src1=img[roi], alpha=opacity, src2=overlay, beta=1. - opacity, gamma=0, dst=img[roi])
except:
logger.debug("transparent_circle would have been partially outside of img. Did not draw it.")
def video_record():
date=datetime.datetime.now()
filename='path/rec_%s%s%s%s%s%s.avi' %(date.year,date.month,date.day,date.hour,date.minute,date.second)
p = ImageGrab.grab()
a, b = p.size
fourcc = cv2.VideoWriter_fourcc(*'XVID')
video = cv2.VideoWriter(filename, fourcc, 20, (a, b))
while True:
im = ImageGrab.grab()
imm=cv2.cvtColor(np.array(im), cv2.COLOR_RGB2BGR)
_xs,_ys = win32api.GetCursorPos()
transparent_circle(imm,(_xs,_ys),20,(0,255,255,0.5), -1)
# cv2.circle(imm,(_xs,_ys),20,(0,255,255,0.3),-1)
video.write(imm)
if flag:
print("Record Over")
break
video.release()
def on_press(key):
global flag
if key == keyboard.Key.esc:
flag=True
print("stop monitor")
return False
if __name__=='__main__':
th=threading.Thread(target=video_record)
th.start()
with keyboard.Listener(on_press=on_press) as listener:
listener.join()
Когда вы запустите код, начните запись. Когда вы нажимаете клавишу ESC
, останавливаете запись и сохраняете файл.
Примечание. Может потребоваться добавить некоторые библиотеки, в противном случае возникнет ошибка, что модуль не найден