我正在創建一個掃描 QR 碼的 python 腳本,然后處理代碼中的資訊。python 腳本將通過 RBPI 上的 systemd 中的計時器每隔幾秒鐘啟動一次,但是在掃描代碼時 - 如果在 5 秒內沒有檢測到代碼,腳本應該終止。但是,如果檢測到代碼,則處理應繼續運行,并且腳本應僅在處理完成后退出。
這是我的代碼:
import cv2
import numpy as np
from pyzbar.pyzbar import decode
from multiprocessing import Process
import time
def decoder(image):
gray_img = cv2.cvtColor(image,0)
barcode = decode(gray_img)
for obj in barcode:
points = obj.polygon
(x,y,w,h) = obj.rect
pts = np.array(points, np.int32)
pts = pts.reshape((-1, 1, 2))
barcodeData = obj.data.decode("utf-8")
barcodeType = obj.type
string = str(barcodeData)
cv2.destroyAllWindows()
# stop timeout on action_process and keep it running
# processMyQRCode(barcodeData) Demo:
i = 0
while i < 10:
print("processing code for " str(i) " seconds")
i = 1
time.sleep(1)
print(string " is processed")
exit()
def open_scanner():
#add cv2.CAP_DSHOW on windows while developing, remove on RBPI
cap = cv2.VideoCapture(0 , cv2.CAP_DSHOW)
while True:
ret, frame = cap.read()
decoder(frame)
cv2.imshow('My Title', frame)
code = cv2.waitKey(1)
if code == ord('q'):
exit()
if __name__ == '__main__':
action_process = Process(target=open_scanner)
action_process.start()
action_process.join(timeout=5)
action_process.terminate()
所以當沒有檢測到代碼時,5的超時應該沒問題,但是在內部運行while回圈時應該被忽略 decoder(image)
uj5u.com熱心網友回復:
在搜索了這一天之后,并根據 Yves 對這個問題的評論,我得出的結論是我的作業方式錯誤。所以現在我添加了一個全域計時器,如果開始處理二維碼,它就會被取消。
現在我的代碼看起來像這樣,它似乎可以作業。如果有更好的方法,或者這種全域變數的使用是不好的做法,我很想聽聽。
import cv2
import numpy as np
from pyzbar.pyzbar import decode
import time
from threading import Timer
import os
def decoder(image):
gray_img = cv2.cvtColor(image,0)
barcode = decode(gray_img)
for obj in barcode:
points = obj.polygon
(x,y,w,h) = obj.rect
pts = np.array(points, np.int32)
pts = pts.reshape((-1, 1, 2))
barcodeData = obj.data.decode("utf-8")
barcodeType = obj.type
process_code(barcodeData)
def process_code(barcodeData):
print("cancel timer")
myTimer.cancel()
i = 0
while i < 10:
print("processing code for " str(i) " seconds")
i = 1
time.sleep(1)
print(str(barcodeData) " is processed")
os._exit(0)()
def time_out_exit() :
print("No QR Code Found")
os._exit(0)()
def open_scanner():
myTimer.start()
#add cv2.CAP_DSHOW on windows while developing, remove on RBPI
cap = cv2.VideoCapture(0 , cv2.CAP_DSHOW)
#cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
decoder(frame)
#cv2.imshow('My Title', frame)
code = cv2.waitKey(1)
if code == ord('q'):
exit()
globals()['myTimer'] = Timer(10.0, time_out_exit)
if __name__ == '__main__':
open_scanner()
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/365640.html
下一篇:從相機Pyqt5調整直播幀大小
