欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

OpenCV視頻流Python多線程處理方法詳細分析

 更新時間:2022年11月16日 14:31:33   作者:hlld26  
為OpenCV是搞計算機視覺必須要掌握的基礎,這篇文章主要給大家介紹了關于OpenCV視頻流多線程處理的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下

前言

最近在功能性測試的過程中,需要在Python環(huán)境下用OpenCV讀取網(wǎng)絡攝像頭的視頻流,接著用目標檢測器進行視屏幀的后續(xù)處理。在測試過程中發(fā)現(xiàn)如果是單線程的情況,會出現(xiàn)比較嚴重的時延,如果目標檢測模型稍微大一點,像YOLOv4這類的,那么情況更加嚴重。

后面考慮到演示效果,從單線程改為了多線程,即單獨用一個線程實時捕獲視頻幀,主線程在需要時從子線程拷貝最近的幀使用即可。通過這樣的修改,不僅時延基本消失,整個流程的實時性也有相對的提升,可以說是非常實用的技巧。

Python多線程編程

使用Python進行多線程編程是較為簡單的,Python的threading模塊封裝了相關的操作,通過編寫功能類繼承threading.Thread即可實現(xiàn)自己的邏輯。簡單的代碼示例如下所示:

class myThread(threading.Thread):
    def __init__(self, name=None):
        super(myThread, self).__init__(name=name)
    def run(self):
        print('=> Thread %s is running ...' % self.name)
thread = myThread()
thread.start()
thread.join()

上面的代碼簡單展示了如何使用線程類:通過調用start()方法,線程實例開始在單獨的線程上下文中運行自己的run()函數(shù)處理任務,直到線程退出。在此期間,主線程可以繼續(xù)執(zhí)行任務。當主線程任務執(zhí)行結束時,主線程可通過設置全局狀態(tài)變量告知子線程退出,同時調用join()方法等待子線程運行結束。

OpenCV視屏流的多線程處理

在上面例子的基礎上,可對簡單的單線程處理流程進行優(yōu)化,即將讀取視頻幀的部分單獨放在一個線程執(zhí)行,同時提供線程間同步、數(shù)據(jù)交互的支持,在主線程中運行目標檢測模型和后續(xù)處理流程,在需要時從讀取視頻幀的子線程獲取最近的幀進行預處理、推理、后處理和可視化等操作。相關的示例代碼如下:

import numpy as np
import cv2
import threading
from copy import deepcopy
thread_lock = threading.Lock()
thread_exit = False
class myThread(threading.Thread):
    def __init__(self, camera_id, img_height, img_width):
        super(myThread, self).__init__()
        self.camera_id = camera_id
        self.img_height = img_height
        self.img_width = img_width
        self.frame = np.zeros((img_height, img_width, 3), dtype=np.uint8)
    def get_frame(self):
        return deepcopy(self.frame)
    def run(self):
        global thread_exit
        cap = cv2.VideoCapture(self.camera_id)
        while not thread_exit:
            ret, frame = cap.read()
            if ret:
                frame = cv2.resize(frame, (self.img_width, self.img_height))
                thread_lock.acquire()
                self.frame = frame
                thread_lock.release()
            else:
                thread_exit = True
        cap.release()
def main():
    global thread_exit
    camera_id = 0
    img_height = 480
    img_width = 640
    thread = myThread(camera_id, img_height, img_width)
    thread.start()
    while not thread_exit:
        thread_lock.acquire()
        frame = thread.get_frame()
        thread_lock.release()
        cv2.imshow('Video', frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            thread_exit = True
    thread.join()
if __name__ == "__main__":
    main()

在上面的代碼中,為確保資源訪問不受沖突,使用threading.Lock進行保護;主線程使用thread_exit全局狀態(tài)變量控制子線程的運行狀態(tài)。稍微特別一點的是,thread_exit實際上控制著兩個線程的運行狀態(tài),因為在上述的處理流程中,兩個線程都擁有終止運行流程的話語權,故這樣的處理是合理的。

結語

實際上使用多線程并行處理任務,最大程度地利用資源早已是老生常談的技巧,例如在服務器端,會開辟有專門的線程池用于處理隨時可能到來的請求,而在嵌入式通信終端上,也通常采用線程池的方式來處理收到的消息包,以盡可能提升實時性。雖然多線程的處理方式相較單線程而言要稍微復雜一些,但帶來的性能提升確是實打實的,所以還是很值得一試。

到此這篇關于OpenCV視頻流多線程處理方法詳細分析的文章就介紹到這了,更多相關OpenCV視頻流內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 用python打印菱形的實操方法和代碼

    用python打印菱形的實操方法和代碼

    在本篇文章里小編給大家分享了關于用python打印菱形的實操方法和代碼,對此有需要的朋友們可以學習下。
    2019-06-06
  • softmax及python實現(xiàn)過程解析

    softmax及python實現(xiàn)過程解析

    這篇文章主要介紹了softmax及python實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-09-09
  • Python語音合成之第三方庫gTTs/pyttsx3/speech橫評(內附使用方法)

    Python語音合成之第三方庫gTTs/pyttsx3/speech橫評(內附使用方法)

    Python是一種非常強大的腳本語言,可以用來實現(xiàn)各種復雜的應用,其中之一就是文本轉語音,即把文字轉換成聲音來發(fā)出,下面這篇文章主要給大家介紹了關于Python語音合成之第三方庫gTTs/pyttsx3/speech橫評的相關資料,文中還介紹了詳細的使用方法,需要的朋友可以參考下
    2023-05-05
  • Python 3.8正式發(fā)布,來嘗鮮這些新特性吧

    Python 3.8正式發(fā)布,來嘗鮮這些新特性吧

    今天 Python3.8 發(fā)布啦,它是 Python2 終結前最后一個大版本,我們一起看看這個版本都添加了那些新功能和特性
    2019-10-10
  • python實現(xiàn)網(wǎng)站的模擬登錄

    python實現(xiàn)網(wǎng)站的模擬登錄

    這篇文章主要介紹了python實現(xiàn)網(wǎng)站的模擬登錄的相關資料,通過自己構造post數(shù)據(jù)來用Python實現(xiàn)登錄過程,需要的朋友可以參考下
    2016-01-01
  • 對python創(chuàng)建及引用動態(tài)變量名的示例講解

    對python創(chuàng)建及引用動態(tài)變量名的示例講解

    今天小編就為大家分享一篇對python創(chuàng)建及引用動態(tài)變量名的示例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11
  • python 將字符串轉換成字典dict

    python 將字符串轉換成字典dict

    將字符串轉化成字典dict類型?這個可以用python的標準庫simplejson 轉換為JSON格式。
    2013-03-03
  • python基礎入門之字典和集合

    python基礎入門之字典和集合

    Python中的字典和集合是非常相似的數(shù)據(jù)類型,字典是無序的鍵值對。集合中的數(shù)據(jù)是不重復的,并且不能通過索引去修改集合中的值,我們可以往集合中新增或者修改數(shù)據(jù)。集合是無序的,并且支持數(shù)學中的集合運算,例如并集和交集等。
    2021-06-06
  • TensorFlow2中提供的幾種處理特征列的方法小結

    TensorFlow2中提供的幾種處理特征列的方法小結

    本文主要介紹了TensorFlow2中提供的幾種處理特征列的方法小結,主要介紹了6種方式,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • 用Python的Tornado框架結合memcached頁面改善博客性能

    用Python的Tornado框架結合memcached頁面改善博客性能

    這篇文章主要介紹了用Python的Tornado框架結合memcached頁面改善vLog性能,主要使用到了緩存來提升性能,需要的朋友可以參考下
    2015-04-04

最新評論