首页 > 解决方案 > 使用 python tkinter 进行网络摄像头录制

问题描述

我想从网络摄像头录制视频(不是音频)。我放了两个按钮来开始录制和停止录制。当程序启动时,它会从相机中选择图像并在屏幕上显示。效果很好。我的问题是当我单击开始录制并在某些时间停止录制后,只创建了 avi 文件,找到了 0K 或 6K 大小。没有找到进一步的录音。

import tkinter
import cv2
import PIL.Image, PIL.ImageTk


stopb = None

class App():
    def __init__(self, window, window_title):
        self.window = window
        self.window.title = window_title
        self.ok = False
        self.video = cv2.VideoCapture(0)
        self.width = self.video.get(cv2.CAP_PROP_FRAME_WIDTH)
        self.height = self.video.get(cv2.CAP_PROP_FRAME_HEIGHT)
        #create videowriter
        self.fourcc = cv2.VideoWriter_fourcc(*'XVID')
        self.out = cv2.VideoWriter('output.avi',self.fourcc,10,(640,480))
        # Create a canvas that can fit the above video source size
        self.canvas = tkinter.Canvas(window, width=self.width, height=self.height)
        self.canvas.pack()

        self.opencamera = tkinter.Button(window, text="open camera", command=self.open_camera)
        self.opencamera.pack()
        self.closecamera = tkinter.Button(window, text="close camera", command=self.close_camera)
        self.closecamera.pack()
        self.delay = 10
        self.update()

        # After it is called once, the update method will be automatically called every delay milliseconds
        self.window.mainloop()

    def update(self):
        ret, frame = self.video.read()
        if self.ok == 'T':
            self.out.write(frame)
        if ret:
            self.photo = PIL.ImageTk.PhotoImage(image=PIL.Image.fromarray(frame))
            self.canvas.create_image(0, 0, image=self.photo, anchor=tkinter.NW)

        self.window.after(self.delay, self.update)

    def open_camera(self):
        self.ok = True
        print("camera opened")
        print(self.ok)


    def close_camera(self):
        print("camera closed")
        self.ok = False
        self.video.release()
        self.out.release()

    def __del__(self):
        if self.video.isOpened():
            self.video.release()
            self.out.release()


App(tkinter.Tk(), "mywindow")

标签: python

解决方案


您的问题是您永远不会向输出写入任何内容,因为if self.ok == 'T'永远不会评估为真。您应该将其更改为 just if self.ok,与您所做的相同ret

def update(self):
        ret, frame = self.video.read()
        if self.ok:
            self.out.write(frame)
        if ret:
            self.photo = PIL.ImageTk.PhotoImage(image=PIL.Image.fromarray(frame))
            self.canvas.create_image(0, 0, image=self.photo, anchor=tkinter.NW)

        self.window.after(self.delay, self.update)

推荐阅读