最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

前言

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

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

Python多線程編程

使用Python進(jìn)行多線程編程是較為簡單的,Python的threading模塊封裝了相關(guān)的操作,通過編寫功能類繼承threading.Thread即可實(shí)現(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()

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

OpenCV視屏流的多線程處理

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

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進(jìn)行保護(hù);主線程使用thread_exit全局狀態(tài)變量控制子線程的運(yùn)行狀態(tài)。稍微特別一點(diǎn)的是,thread_exit實(shí)際上控制著兩個(gè)線程的運(yùn)行狀態(tài),因?yàn)樵谏鲜龅奶幚砹鞒讨?,兩個(gè)線程都擁有終止運(yùn)行流程的話語權(quán),故這樣的處理是合理的。

結(jié)語

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

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

相關(guān)文章

  • Python實(shí)現(xiàn)隨機(jī)漫步的詳細(xì)過程

    Python實(shí)現(xiàn)隨機(jī)漫步的詳細(xì)過程

    隨機(jī)漫步顧名思義每一步都是隨機(jī)的,假設(shè)有一個(gè)點(diǎn),下一步往哪里走,走多遠(yuǎn),這些都沒有明確的表示,完全是隨機(jī)的,最后走到哪里,是由一系列隨機(jī)決策決定的,這篇文章主要給大家介紹了關(guān)于Python實(shí)現(xiàn)隨機(jī)漫步的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • python語言變量和數(shù)據(jù)類型基礎(chǔ)學(xué)習(xí)

    python語言變量和數(shù)據(jù)類型基礎(chǔ)學(xué)習(xí)

    這篇文章主要為大家介紹了python語言變量和數(shù)據(jù)類型基礎(chǔ)學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • Python實(shí)現(xiàn)快速計(jì)算詞頻功能示例

    Python實(shí)現(xiàn)快速計(jì)算詞頻功能示例

    這篇文章主要介紹了Python實(shí)現(xiàn)快速計(jì)算詞頻功能,結(jié)合實(shí)例形式總結(jié)分析了Python使用nltk庫進(jìn)行詞頻計(jì)算功能的相關(guān)操作技巧,需要的朋友可以參考下
    2018-06-06
  • Python求1到n的階乘之和的實(shí)例

    Python求1到n的階乘之和的實(shí)例

    這篇文章主要介紹了Python求1到n的階乘之和的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Python解決pip install時(shí)出現(xiàn)的Could not fetch URL問題

    Python解決pip install時(shí)出現(xiàn)的Could not fetch URL問題

    這篇文章主要介紹了Python解決pip install時(shí)出現(xiàn)的Could not fetch URL問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • 基于Python創(chuàng)建語音識(shí)別控制系統(tǒng)

    基于Python創(chuàng)建語音識(shí)別控制系統(tǒng)

    這篇文章主要介紹了通過Python實(shí)現(xiàn)創(chuàng)建語音識(shí)別控制系統(tǒng),能利用語音識(shí)別識(shí)別說出來的文字,根據(jù)文字的內(nèi)容來控制圖形移動(dòng),感興趣的同學(xué)可以關(guān)注一下
    2021-12-12
  • scrapy中的spider傳參實(shí)現(xiàn)增量的方法

    scrapy中的spider傳參實(shí)現(xiàn)增量的方法

    有時(shí)候需要根據(jù)項(xiàng)目的實(shí)際需求向spider傳遞參數(shù)來控制spider的運(yùn)行方式,本文主要介紹了scrapy中的spider傳參實(shí)現(xiàn)增量的方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2022-06-06
  • Python subprocess模塊詳細(xì)解讀

    Python subprocess模塊詳細(xì)解讀

    這篇文章主要介紹了Python subprocess模塊詳細(xì)解讀,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • Python3.5面向?qū)ο蟪绦蛟O(shè)計(jì)之類的繼承和多態(tài)詳解

    Python3.5面向?qū)ο蟪绦蛟O(shè)計(jì)之類的繼承和多態(tài)詳解

    這篇文章主要介紹了Python3.5面向?qū)ο蟪绦蛟O(shè)計(jì)之類的繼承和多態(tài),結(jié)合實(shí)例形式詳細(xì)分析了Python3.5面向?qū)ο蟪绦蛟O(shè)計(jì)中類的繼承與多態(tài)常見用法及相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2019-04-04
  • Python編程super應(yīng)用場(chǎng)景及示例解析

    Python編程super應(yīng)用場(chǎng)景及示例解析

    最近有粉絲向我咨詢super相關(guān)的問題,說網(wǎng)上搜索到的教程不夠通俗易懂,看了之后還是不太理解。所以在這里基于我自己的理解來講解一下super
    2021-10-10

最新評(píng)論

镇平县| 扶沟县| 平邑县| 城步| 香港 | 霍林郭勒市| 阳朔县| 麻江县| 崇义县| 九台市| 沂南县| 绿春县| 仁化县| 岳西县| 白水县| 南岸区| 论坛| 平远县| 久治县| 大洼县| 桂林市| 大姚县| 吴堡县| 东辽县| 铁岭县| 呼和浩特市| 湖北省| 蓝田县| 深水埗区| 肇州县| 孟津县| 汉川市| 江陵县| 桐城市| 丹东市| 汉沽区| 晋宁县| 高台县| 曲阳县| 普兰县| 开阳县|