【问题标题】:How to use cv2.videowriter to record the computer screen with the use of Tkinter and without displaying the screen while recording it (imgshow)如何使用 cv2.videowriter 使用 Tkinter 录制计算机屏幕并且在录制时不显示屏幕(imgshow)
【发布时间】:2018-06-27 03:26:05
【问题描述】:

实际上我想做的是:

  1. 使用 Tkinter 按钮:

    1.1。开始录屏

    1.2。停止录屏

  2. 在录制过程中不显示正在同时录制的视频。

这是我的代码:

import tkinter as tk
import cv2
import numpy as np
from PIL import ImageGrab

window = tk.Tk()
window.title('ScreenVideo')
window.geometry('350x300')

#ScreenVideo

def StartS():
    fourcc = cv2.VideoWriter_fourcc(*'XVID')
    vid=cv2.VideoWriter("c:\\IQOutput\\rec.avi", fourcc, 10, (990,690))

    while(True):
        img = ImageGrab.grab(bbox=(10,10,1000,700))
        img_np=np.array(img)
        frame=cv2.cvtColor(img_np, cv2.COLOR_BGR2RGB)
        vid.write(frame)
        cv2.imshow("frame", frame)
        key=cv2.waitKey(1)
        if key==27:
            break

    vid.release()
    cv2.destroyAllWindows()

bstarts = tk.Button(window, text='StartRe', font=('Arial', 8), bg='light pink', width=5, height=1, command=StartS)     
bstarts.place(x=280, y=80, anchor='nw')

bstops = tk.Button(window, text='StopRe', font=('Arial', 8), bg='light pink', width=5, height=1, command=StopRe)     
bstops.place(x=280, y=120, anchor='nw')

上面的代码有以下选项:

(一)。当用户单击 Bstarts 按钮时开始录制。

(b)。在“框架”窗口中录制时同时显示屏幕。

(c)。当用户在 PC 上按“esc”键时停止录制。

(d)。将最终视频(命名为:“rec.avi”)保存在路径 C:\IQOutput\ 中。

但我希望这个程序有以下选项:

(一)。当用户点击 Bstarts 按钮时,它开始记录屏幕(已经开始工作了)。

(b)。录屏时不能同时显示屏幕(如何在录屏时移除或隐藏“imshow”相关功能?)

(c)。当用户单击 Bstops 按钮时,它会停止录制屏幕。

(d)。它将名为“rec.avi”的最终视频保存在路径c:\IQOutput\中。

【问题讨论】:

    标签: python python-3.x video tkinter cv2


    【解决方案1】:

    我回答了我问的问题(b):“(b)。不在屏幕上同时显示屏幕视频(如何在录制过程中删除或隐藏与“imshow”相关的功能?)”。我的学习是录像机,必须使用imshow。所以我的解决方法是调整大小并移动 imshow 窗口,代码如下:

        ....
        vid.write(frame)
        cv2.resizeWindow('frame', 20,20)
        cv2.moveWindow("frame", 5,5) 
        cv2.imshow("frame", frame) 
        ......
    

    现在 imshow 窗口很小,位于左上角,不会干扰我要录制的内容。

    但是我仍然不知道如何使用 tkiinter 的按钮来停止记录。原因是(1)一旦我单击 bstarts 按钮,此按钮功能会继续将图像帧捕获为视频(2)所以在按“esc”键停止 bstarts 按钮之前,我不能使用“screenvideo”窗口中的其他按钮函数。

    【讨论】:

    • 我找到了其他方法,我用python调用oCam(一个很好的截屏和录屏应用,可以得到很好的图片和mp4视频),用tkinter按下“开始”的热键/停止屏幕录制”在 Ocam 中,现在效果很好。现在我不需要使用 cv2。
    【解决方案2】:

    您可以使用递归而不是 while 循环,因为当您在 tkinter 中使用 while 循环时,它们永远不会释放按钮,因此您没有机会停止循环。 但是当你使用递归时,很容易通过调用其他函数(如停止按钮)来停止循环,你可以将 after_id 递归更改为 None。

    def ScreenRe():
        global after_id
        global secs
    
        secs += 1
        if secs % 1 == 0:  # every other second
            img = pyautogui.screenshot()
            frame=np.array(img)
            frame=cv2.cvtColor(frame,cv2.COLOR_BGR2RGB)
            out.write(frame)
            cv2.imshow('show',frame)
        after_id = top.after(1000, ScreenRe)  # check again in 1 second
    
    def start():
        global secs
        secs = 0
        ScreenRe()  # start repeated checking
    
    def stop():
        global after_id
        if after_id:
            top.after_cancel(after_id)
            after_id = None
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-08
      • 1970-01-01
      • 1970-01-01
      • 2015-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-23
      相关资源
      最近更新 更多