成都网站建设设计

将想法与焦点和您一起共享

python如何使用OpenCV捕获事件

这篇文章给大家分享的是有关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捕获事件”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!


当前名称:python如何使用OpenCV捕获事件
分享网址:http://chengdu.cdxwcx.cn/article/jhjsdi.html