当未检测到代码时退出Python QR Scanner,但在处理代码时继续运行



我正在创建一个python脚本,用于扫描QR码,然后处理代码中的信息。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的超时应该是可以的,但在decoder(image)内运行while循环时应该被忽略

经过一天的搜索,加上伊夫对这个问题的评论,我得出的结论是我的工作方式不对。所以现在我添加了一个全局计时器,如果开始处理二维码,它就会被取消。

现在我的代码看起来是这样的,而且它似乎可以工作。如果有更好的方法,或者使用全局变量是一种糟糕的做法,我很乐意听到。

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()

最新更新