温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

python如何使用OpenCV捕获事件

发布时间:2021-05-28 09:53:46 来源:亿速云 阅读:140 作者:小新 栏目:编程语言

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

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI