这篇文章给大家分享的是有关python如何使用OpenCV捕获事件的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
1、步骤说明
定义关键事件;
将包含事件的视频片段写入到视频文件;
利用线程以确保在输入流和输出视频剪辑文件中执行I / O时,不会放慢主程序的速度;
利用内置的Python数据结构,如DEQUE队列以按顺序存放关键帧。
2、实例
# 导入必要的包
from collections import deque # 导入队列,FIFO(first in first out)先进先出原则
from threading import Thread
from queue import Queue
import time
import cv2
class KeyClipWriter:
# bufSize 要在内存缓冲区中缓存的最大帧数
# timeout 超时时间
def __init__(self, bufSize=64, timeout=1.0):
# 存储在内存中要保留的最大缓冲区大小 以及睡眠超时期间
self.bufSize = bufSize
self.timeout = timeout
# 初始化帧的缓冲区(64帧)、Q:待写入的视频帧、视频写入类、 多线程(以避免I/O延迟)
# recordering boolean类型指示录制是否已启动
self.frames = deque(maxlen=bufSize)
self.Q = None
self.writer = None
self.thread = None
self.recording = False
def update(self, frame):
# 更新帧缓冲区
self.frames.appendleft(frame)
# 如果正在记录,将帧加入队列
if self.recording:
self.Q.put(frame)
def start(self, outputPath, fourcc, fps):
# 展示正在记录关键事件帧
# 表明正在录制,启动视频写入类,初始化需要写入视频文件的帧队列
self.recording = True
self.writer = cv2.VideoWriter(outputPath, fourcc, fps,
(600,600), True)
self.Q = Queue()
# 循环遍历所有帧,并加入队列
for i in range(len(self.frames), 0, -1):
self.Q.put(self.frames[i - 1])
# 开启一个单独的线程写入帧到视频文件
self.thread = Thread(target=self.write, args=())
self.thread.daemon = True
self.thread.start()
def write(self):
# 保持循环
while True:
# 如果停止了录制,退出线程
if not self.recording:
return
# 判断队列是否已经没有关键事件帧了
if not self.Q.empty():
# 获取队列中的下一帧并写入视频文件
frame = self.Q.get()
self.writer.write(frame)
# 如果队列已经空了,sleep超时时间以不浪费cpu周期
# 使用队列时空闲一会儿尤其重要,队列数据结构是线程安全的,暗示必须在更新内部缓冲区之前获取锁/信号量。
# 如果不sleep,当缓冲区为空时,然后写入和更新方法将不断为锁而战斗。相反,最好让视频写入类等待一会儿,直到需要写入文件的队列中存在积压的帧。
else:
time.sleep(self.timeout)
def flush(self):
# 通过刷新所有剩余帧来清空队列
while not self.Q.empty():
frame = self.Q.get()
self.writer.write(frame)
def finish(self):
# 表明结束录制、加入线程
# 刷新队列中的所有帧到视频文件
# 释放视频写入指针
self.recording = False
self.thread.join()
self.flush()
self.writer.release()
感谢各位的阅读!关于“python如何使用OpenCV捕获事件”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://www.py.cn/jishu/jichu/30674.html