python是如何利用多線進程優化視頻應用到的? 原來是這樣的

前言
如果要用Python播放視頻,或者打開攝像頭獲取視頻流,我們可以用OpenCV Python。但是在視頻幀獲取的時候同時做一些圖像識別和處理,可能會因爲耗時多而導致卡頓。一般來說,我們首先會想到把這些工作放入到線程中處理。但是由於Python GIL的存在,用不用線程幾乎沒有區別。所以要解決這個問題,必須通過多進程。這裏分享下使用Dynamsoft Barcode Reader開發Python條形碼掃碼的例子。

學習從來不是一個人的事情,要有個相互監督的夥伴,工作需要學習python或者有興趣學習python的夥伴可以私信回覆小編“學習”或者評論,留言,點贊 領取全套免費python學習資料、視頻()裝包

用Python和攝像頭打造的桌面條形碼掃碼應用

安裝Dynamsoft Barcode Reader:

pip install dbr

安裝OpenCV Python

pip install opencv-python

在主程序中創建一個新的掃碼進程和共享內存:

from multiprocessing import Process, Queue
frame_queue = Queue(4)
finish_queue = Queue(1)
dbr_proc = Process(target=dbr_run, args=(
        frame_queue, finish_queue))
dbr_proc.start()

通過OpenCV不斷獲取視頻幀插入到隊列中:


vc = cv2.VideoCapture(0)
 
if vc.isOpened():  # try to get the first frame
    rval, frame = vc.read()
else:
    return
 
windowName = "Barcode Reader"
base = 2
count = 0
while True:
    cv2.imshow(windowName, frame)
    rval, frame = vc.read()
 
    count %= base
    if count == 0:
        try:
            frame_queue.put_nowait(frame)
        except:
            try:
                while True:
                    frame_queue.get_nowait()
            except:
                pass
 
    count += 1

條形碼讀取進程不斷從隊列中拿出數據進行解碼:


def dbr_run(frame_queue, finish_queue):
    dbr.initLicense(config.license)
    while finish_queue.qsize() == 0:
        try:
            inputframe = frame_queue.get_nowait()
            results = dbr.decodeBuffer(inputframe, config.barcodeTypes)
            if (len(results) > 0):
                print(get_time())
                print("Total count: " + str(len(results)))
                for result in results:
                    print("Type: " + result[0])
                    print("Value: " + result[1] + "\n")
        except:
            pass
 
    dbr.destroy()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章