python - 使用 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")
解决方案
您的问题是您永远不会向输出写入任何内容,因为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)
推荐阅读
- powershell - 如何在将两个哈希表与 Powershell 进行比较时选择特定的哈希表键和值?
- c# - 如何安装 Microsoft.Office.Tools.Excel?
- postgresql - 将 PostgreSQL 连接到现有的 GIS 地理数据库
- string - 替换 ksh 脚本中路径中的目录名称
- java - 数据 null onActivityResult
- emscripten - Emscripten - 如何从 C 到 JavaScript 获取 uint8_t 数组?
- python - 如何在一段文本中搜索单词列表,一旦找到,添加到字典
- ansible - 是否有将日期字符串转换为纪元的 ansible 函数
- keras - 如何在 keras 生成器中使用 NN?
- julia - 在 Julia 中使用 ForwardDiff 时限制函数签名