"""This is a demo for running the barcode QR code reader usng streamlit library""" from dataclasses import dataclass, field from typing import Any, Optional import asyncio import streamlit as st from PIL import Image import numpy as np import pandas as pd from src.deep_barcode_reader.barcode import Wrapper @dataclass class DemoBarcodeReader: """This is a demo class for barcode/qr code reader using different methods""" image: Optional[Any] = field(init=False, default=None) model_option: str = field(init=False, default="opencv") model_size: str = field(init=False, default="n") def upload_image(self) -> None: """Upload an image from the streamlit page""" uploaded_file = st.file_uploader( "Choose an image...", type=["jpg", "png", "jpeg"] ) if uploaded_file is not None: self.image = Image.open(uploaded_file) else: self.image = Image.open("tests/test_data/sample.jpg") st.image( self.image, caption="Original/Uploaded Image", use_container_width=True ) def select_model(self) -> None: """Select a model for barcode/qr code reader""" self.model_option = st.selectbox( "Choose a reader/decoder model", ["zbar", "opencv", "qrreader"] ) if self.model_option == "qrreader": ml_size = st.selectbox( "Choose a model size for QRReader method", ["nano", "small", "medium", "large"], ) self.model_size = ( "n" if ml_size == "nano" else "s" if ml_size == "small" else "m" if ml_size == "medium" else "l" ) def process_image(self) -> None: """Process the image for barcode/qr code reader""" if st.button("Read/Decode Barcode/QR Code"): reader = Wrapper(model_size=self.model_size, method=self.model_option) detections, result_img = asyncio.run( reader.method_selection(image=np.array(self.image), result_path="") ) st.markdown("