Считыватель штрих-кодов веб-камеры: Экспорт нескольких данных штрих-кода в блокнот

#python #arrays #list #opencv #set

Вопрос:

Я изменил найденный в Интернете код, который считывает штрих-код с веб-камеры с помощью opencv/pyzbar.

Он способен считывать несколько штрих-кодов, но когда я устаю записывать их в блокнот, появляется только 1 данные.

Я попытался сохранить считанные данные в массив/список и экспортировать, но это не работает.

Как я могу заставить его записать все отдельные штрих-коды в блокнот.

 #import libraries
 
 import cv2
import time
from pyzbar import pyzbar

def read_barcodes(frame):
    barcodes = pyzbar.decode(frame)
    for barcode in barcodes:
        x, y , w, h = barcode.rect
        #1 Decode barcode/Create frame
        barcode_info = barcode.data.decode('utf-8')
        cv2.rectangle(frame, (x, y),(x w, y h), (0, 255, 0), 2)
 
     #2 Create text on top of the barcode
    cv2.putText(frame, barcode_info, (x   6, y - 6), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (255, 0, 255), 2)
    #3 Export to text 
    code = []
    if barcode_info in code:
        print("Duplicate")
    else:
        code.append(barcode_info)
        print (code)
        #set ={}
        #set.update(barcode_info)
    with open("barcode_result.txt", mode ='w') as file:
        for x in code:
            file.write("Recognized Barcode:"   x  "n")
return frame

def main():
#1 Open webcam using OpenCV
camera = cv2.VideoCapture(0)    #0(webcam) 1(camera)
ret, frame = camera.read()
#2 Loop till Esc is pressed
while ret:
    ret, frame = camera.read()
    frame = read_barcodes(frame)
    cv2.imshow('Barcode/QR code reader', frame)
    if cv2.waitKey(1) amp; 0xFF == 27:
        break
#3 Close webcam
camera.release()
cv2.destroyAllWindows()
#4 
if __name__ == '__main__':
main()
 

Вебкам

блокнот

Ответ №1:

Я не читал весь код, но похоже, что вы используете режим » w » для открытия файла, каждый раз, когда вы это делаете, файл стирается перед записью.

Вероятно, вам нужно использовать mode=’a’ для добавления.

для вашего второго вопроса просто немного переместите свой цикл, чтобы он выполнялся в операторе else. в вашем коде он записывается в файл, игнорируя оператор if.

 if barcode_info in code:
    print("Duplicate")
else:
    code.append(barcode_info)
    print (code)
    #set ={}
    #set.update(barcode_info)
    with open("barcode_result.txt", mode ='a') as file:
        for x in code:
            file.write("Recognized Barcode:"   x  "n")
 

о, извините, не видел раньше

 #3 Export to text 
code = []
if barcode_info in code: #this will never happen
    print("Duplicate")
 

вы должны переместить свой код = [] за пределы цикла, как при инициализации вашей программы.

Что-то вроде:

     #2 Loop till Esc is pressed
code = []
while ret:
    ret, frame = camera.read()
    frame = read_barcodes(frame)
    cv2.imshow('Barcode/QR code reader', frame)
    if cv2.waitKey(1) amp; 0xFF == 27:
        break

#loop terminated, now write
with open("barcode_result.txt", mode ='a') as file:
        for x in code:
            file.write("Recognized Barcode:"   x  "n")

#3 Close webcam
 

я не проверял, потому что не могу использовать вашу библиотеку

 def read_barcodes(frame):
...
#3 Export to text 
if barcode_info in code:
    print("Duplicate")
else:
    code.append(barcode_info)
    print (code)
    ...
 

Комментарии:

1. Спасибо! теперь он может записывать несколько данных, но как мне заставить его записывать отдельные данные штрих-кода.