как записать экран в высоком качестве - PullRequest
0 голосов
/ 19 февраля 2020

Я создаю устройство записи экрана для рабочего стола в python. и я уже закончил часть кодирования, но когда я записываю экран, почему он не записывает в высоком разрешении. проблема ......... 1> я хочу записать экран в высоком качестве, что я должен делать. 2> Я также пытаюсь навести курсор с помощью cv2.circle (), но я хочу создать круг с меньшей непрозрачностью или более прозрачным

мой код

import cv2
import numpy as np
import pyautogui
import datetime
import win32api

date=datetime.datetime.now()

SCREEN_SIZE = (960,540) #std res 1366, 768
framerate=12
# define the codec
fourcc = cv2.VideoWriter_fourcc(*'XVID')
filename='E:/project/videos/rec_%s%s%s%s%s%s.avi' %(date.year,date.month,date.day,date.hour,date.minute,date.second)

out = cv2.VideoWriter(filename, fourcc,framerate, SCREEN_SIZE)

while True:

    img = pyautogui.screenshot()

    frame = np.array(img)

    frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    _xs,_ys = win32api.GetCursorPos()
    image=cv2.circle(frame,(_xs,_ys),20,(0,255,255,0.3),-1)
    frame = cv2.resize(frame,(960,540)) #resize window

    out.write(frame)

    cv2.imshow('screenshot', frame)

    if cv2.waitKey(1) == ord("q"):
        break


cv2.destroyAllWindows()
out.release()

1 Ответ

2 голосов
/ 20 февраля 2020

Когда вы используете 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()

enter image description here

Когда вы запустите код, начните запись. Когда вы нажимаете клавишу ESC, останавливаете запись и сохраняете файл.

Примечание. Может потребоваться добавить некоторые библиотеки, в противном случае возникнет ошибка, что модуль не найден

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...