前言
如果要用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()