Создать графический интерфейс для сканирования QR-кода с помощью Tkinter и OpenCV? - PullRequest
0 голосов
/ 15 октября 2019

Я хочу создать графический интерфейс для сканирования QR-кода с помощью Tkinter python, чтобы записывать видео с некоторыми кнопками и списком. Я закончил в комбайне OpenCV с Tkinter. Тем не менее, я не могу сканировать любой QR-код. Я понял, что моя проблема из строки barcodes = pyzbar.decode(frame), но я не знаю, в чем ее ошибка, потому что программа все еще работает без сбоев. Вот мой код:

from imutils.video import VideoStream
from pyzbar import pyzbar
from PIL import Image, ImageTk
from firebase_admin import credentials, firestore

import Tkinter as tki
import firebase_admin
import threading
import argparse
import datetime
import imutils
import time
import cv2
import RPi.GPIO as GPIO
import customer
from customer import Customerlist

    window = tki.Tk()  #Makes main window

    #Graphics window
    imageFrame = tki.Frame(window, width=600, height=500)
    imageFrame.grid(row=0, column=0, padx=10, pady=2)

    #Capture video frames
    lmain = tki.Label(imageFrame)
    lmain.grid(row=0, column=0)
    #gst = "nvcamerasrc ! video/x-raw(memory:NVMM), width=(int)640, height=(int)480, format=(string)I420, framerate=(fraction)24/1 ! nvvidconv flip-method=6 ! video/x-raw, format=(string)I420 ! videoconvert ! video/x-raw, format=(string)BGR ! appsink"
    cap = cv2.VideoCapture(0)

    def show_frame():
        ret, frame = cap.read()
        frame = cv2.flip(frame, 1)
        frame = imutils.resize(frame, width=400)
        cv2image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA)
        img = Image.fromarray(cv2image)
        imgtk = ImageTk.PhotoImage(image=img)
        lmain.imgtk = imgtk
        lmain.configure(image=imgtk)
        lmain.after(10, show_frame) 



    while True : 
                    show_frame()
                    barcodes = pyzbar.decode(frame) 
                    window.mainloop()  #Starts GUI

                    for barcode in barcodes:
                        (x, y, w, h) = barcode.rect
                        cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2)
                        # the barcode data is a bytes object so if we want to draw it
                        # on our output image we need to convert it to a string first
                        barcodeData = barcode.data.decode("utf-8")
                        barcodeType = barcode.type  

                        # draw the barcode data and barcode type on the image
                        text = "{} ({})".format(barcodeData, barcodeType)
                        cv2.putText(frame, text, (x, y - 10),
                            cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)  
                cv2.imshow("Thesis", frame)
                key = cv2.waitKey(1) & 0xFF      

csv.close()
cap.release()
cv2.destroyAllWindows()

Кто-нибудь может мне помочь? Я очень ценю

1 Ответ

0 голосов
/ 15 октября 2019

window.mainloop() - это блокирующий вызов - он запускает бесконечный цикл. Таким образом, код под ним, который обрабатывает кадр, никогда не будет выполнен.
Решением было бы поместить код обработки штрих-кода в отдельную функцию, которая вызывается из show_frame().

примерааналогичного вопроса

...