python多进程优化_如何利用多进程优化Python视频应用
如果要用Python播放視頻,或者打開(kāi)攝像頭獲取視頻流,我們可以用OpenCV Python。但是在視頻幀獲取的時(shí)候同時(shí)做一些圖像識(shí)別和處理,可能會(huì)因?yàn)楹臅r(shí)多而導(dǎo)致卡頓。一般來(lái)說(shuō),我們首先會(huì)想到把這些工作放入到線程中處理。但是由于Python GIL的存在,用不用線程幾乎沒(méi)有區(qū)別。所以要解決這個(gè)問(wèn)題,必須通過(guò)多進(jìn)程。這里分享下使用Dynamsoft Barcode Reader開(kāi)發(fā)Python條形碼掃碼的例子。
用Python和攝像頭打造的桌面條形碼掃碼應(yīng)用
安裝Dynamsoft Barcode Reader:
pip install dbr
安裝OpenCV Python
pip install opencv-python
在主程序中創(chuàng)建一個(gè)新的掃碼進(jìn)程和共享內(nèi)存:
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()
通過(guò)OpenCV不斷獲取視頻幀插入到隊(duì)列中:
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
條形碼讀取進(jìn)程不斷從隊(duì)列中拿出數(shù)據(jù)進(jìn)行解碼:
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()
這樣基本完成。不過(guò)在app退出的時(shí)候會(huì)看到一些錯(cuò)誤信息:
Traceback (most recent call last):
File "E:\Programs\Python\Python36\lib\multiprocessing\queues.py", line 236, in _feed
send_bytes(obj)
File "E:\Programs\Python\Python36\lib\multiprocessing\connection.py", line 200, in send_bytes
self._send_bytes(m[offset:offset + size])
File "E:\Programs\Python\Python36\lib\multiprocessing\connection.py", line 290, in _send_bytes
nwritten, err = ov.GetOverlappedResult(True)
BrokenPipeError: [WinError 109] The pipe has been ended
記得在結(jié)束應(yīng)用之前要清空隊(duì)列中的數(shù)據(jù):
def clear_queue(queue):
try:
while True:
queue.get_nowait()
except:
pass
queue.close()
queue.join_thread()
程序運(yùn)行效果:
源碼
總結(jié)
以上是生活随笔為你收集整理的python多进程优化_如何利用多进程优化Python视频应用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 吊顶用黑钛金条电视背景墙用金色钛金条好看
- 下一篇: 老年人补牙多少钱一颗