【问题标题】:how to record screen in high quality如何以高质量录制屏幕
【发布时间】:2020-02-19 12:58:31
【问题描述】:

我正在用 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()

【问题讨论】:

    标签: python python-3.x opencv winapi


    【解决方案1】:

    使用cv2.videowriter时,请确保framesize等于屏幕大小,以免图像失真。

    另外,如果需要录屏,要确保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 键时,停止录制并保存文件。

    注意:可能需要添加一些库,否则会出现找不到模块的错误

    【讨论】:

    • 这很好,但我可以在 pyqt5 窗口的标签或 gui 中的 tkinter 中显示当前录制,并带有开始和停止录制按钮。你能告诉我我该怎么做吗?
    • @arvind8 如有新问题,欢迎发新问题寻找答案,请务必提供足够清晰的细节:)
    • 您的代码输出不是高清的,如何通过将编解码器更改为 H.264 或任何其他或更改文件扩展名来获得高清输出。
    • @arvind8 this 有帮助吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-23
    • 1970-01-01
    • 2014-10-11
    • 2023-01-04
    相关资源
    最近更新 更多