91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python如何使用OpenCV捕獲事件

發布時間:2021-05-28 09:53:46 來源:億速云 閱讀:152 作者:小新 欄目:編程語言

這篇文章給大家分享的是有關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

永康市| 德钦县| 梁河县| 凭祥市| 公主岭市| 马公市| 天峻县| 马尔康县| 西华县| 铜山县| 沙坪坝区| 五台县| 凤山县| 普兰店市| 郓城县| 台南县| 大城县| 罗山县| 紫金县| 会泽县| 特克斯县| 景谷| 女性| 高台县| 华池县| 庆阳市| 西乡县| 察隅县| 巴东县| 鹤壁市| 汾阳市| 彰化市| 陆川县| 武邑县| 葵青区| 泰安市| 晋州市| 博罗县| 马公市| 弋阳县| 天峨县|