十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
这篇文章给大家分享的是有关python如何使用OpenCV捕获事件的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
创新互联专注为客户提供全方位的互联网综合服务,包含不限于成都做网站、网站制作、成都外贸网站建设、开州网络推广、重庆小程序开发、开州网络营销、开州企业策划、开州品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;创新互联为所有大学生创业者提供开州建站搭建服务,24小时服务热线:18980820575,官方网址:www.cdcxhl.com
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捕获事件”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!