"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comment créer un scanner de codes-barres Python pour Windows, Linux et macOS

Comment créer un scanner de codes-barres Python pour Windows, Linux et macOS

Publié le 2024-11-02
Parcourir:550

La numérisation de codes-barres est devenue un outil essentiel dans divers secteurs, de la vente au détail et de la logistique aux soins de santé. Sur les plates-formes de bureau, il permet la capture et le traitement rapides des informations sans saisie manuelle des données, ce qui permet de gagner du temps et de réduire les erreurs. Dans ce didacticiel, nous continuerons à explorer les capacités du SDK Dynasoft Capture Vision en créant un scanner de codes-barres Python pour Windows, Linux , et macOS.

Démo du scanner de codes-barres Python sur macOS

Conditions préalables

  • Licence d'essai de Dynasoft Capture Vision : obtenez une clé de licence d'essai de 30 jours pour le SDK Dynamsoft Capture Vision.

  • Packages Python : installez les packages Python requis à l'aide des commandes suivantes :

    pip install dynamsoft-capture-vision-bundle opencv-python
    

    A quoi servent ces forfaits ?

    • dynamsoft-capture-vision-bundle est le SDK Dynamsoft Capture Vision pour Python.
    • opencv-python capture les images de la caméra et affiche les résultats des images traitées.

Lecture de codes-barres à partir d'images statiques

Étant donné que le SDK Dynamsoft Capture Vision est un cadre unifié intégré à diverses tâches de traitement d'image, nous pouvons facilement basculer entre les modes de traitement d'image en transmettant le nom PresetTemplate à la méthode capture().

Modèles intégrés du SDK Dynamsoft Capture Vision

L'extrait de code suivant montre l'énumération PresetTemplate intégrée dans le SDK Dynamsoft Capture Vision :

class EnumPresetTemplate(Enum):
    PT_DEFAULT = _DynamsoftCaptureVisionRouter.getPT_DEFAULT()
    PT_READ_BARCODES = _DynamsoftCaptureVisionRouter.getPT_READ_BARCODES()
    PT_RECOGNIZE_TEXT_LINES = _DynamsoftCaptureVisionRouter.getPT_RECOGNIZE_TEXT_LINES()
    PT_DETECT_DOCUMENT_BOUNDARIES = (
        _DynamsoftCaptureVisionRouter.getPT_DETECT_DOCUMENT_BOUNDARIES()
    )
    PT_DETECT_AND_NORMALIZE_DOCUMENT = (
        _DynamsoftCaptureVisionRouter.getPT_DETECT_AND_NORMALIZE_DOCUMENT()
    )
    PT_NORMALIZE_DOCUMENT = _DynamsoftCaptureVisionRouter.getPT_NORMALIZE_DOCUMENT()
    PT_READ_BARCODES_SPEED_FIRST = (
        _DynamsoftCaptureVisionRouter.getPT_READ_BARCODES_SPEED_FIRST()
    )
    PT_READ_BARCODES_READ_RATE_FIRST = (
        _DynamsoftCaptureVisionRouter.getPT_READ_BARCODES_READ_RATE_FIRST()
    )
    PT_READ_SINGLE_BARCODE = _DynamsoftCaptureVisionRouter.getPT_READ_SINGLE_BARCODE()
    PT_RECOGNIZE_NUMBERS = _DynamsoftCaptureVisionRouter.getPT_RECOGNIZE_NUMBERS()
    PT_RECOGNIZE_LETTERS = _DynamsoftCaptureVisionRouter.getPT_RECOGNIZE_LETTERS()
    PT_RECOGNIZE_NUMBERS_AND_LETTERS = (
        _DynamsoftCaptureVisionRouter.getPT_RECOGNIZE_NUMBERS_AND_LETTERS()
    )
    PT_RECOGNIZE_NUMBERS_AND_UPPERCASE_LETTERS = (
        _DynamsoftCaptureVisionRouter.getPT_RECOGNIZE_NUMBERS_AND_UPPERCASE_LETTERS()
    )
    PT_RECOGNIZE_UPPERCASE_LETTERS = (
        _DynamsoftCaptureVisionRouter.getPT_RECOGNIZE_UPPERCASE_LETTERS()
    )

Le modèle PT_DEFAULT prend en charge plusieurs tâches, notamment la détection de documents, la reconnaissance MRZ et la détection de codes-barres. Pour optimiser les performances spécifiquement pour la détection de codes-barres, définissez le modèle sur EnumPresetTemplate.PT_READ_BARCODES.value.

Code Python pour la détection de codes-barres

En référence aux exemples précédents de détection de documents et de reconnaissance MRZ, le code suivant peut être utilisé pour lire des codes-barres à partir d'images statiques :

import sys
from dynamsoft_capture_vision_bundle import *
import os
import cv2
import numpy as np
from utils import *

if __name__ == '__main__':

    print("**********************************************************")
    print("Welcome to Dynamsoft Capture Vision - Barcode Sample")
    print("**********************************************************")

    error_code, error_message = LicenseManager.init_license(
        "LICENSE-KEY")
    if error_code != EnumErrorCode.EC_OK and error_code != EnumErrorCode.EC_LICENSE_CACHE_USED:
        print("License initialization failed: ErrorCode:",
              error_code, ", ErrorString:", error_message)
    else:
        cvr_instance = CaptureVisionRouter()
        while (True):
            image_path = input(
                ">> Input your image full path:\n"
                ">> 'Enter' for sample image or 'Q'/'q' to quit\n"
            ).strip('\'"')

            if image_path.lower() == "q":
                sys.exit(0)

            if image_path == "":
                image_path = "../../../images/multi.png"

            if not os.path.exists(image_path):
                print("The image path does not exist.")
                continue
            result = cvr_instance.capture(
                image_path, EnumPresetTemplate.PT_READ_BARCODES.value)
            if result.get_error_code() != EnumErrorCode.EC_OK:
                print("Error:", result.get_error_code(),
                      result.get_error_string())
            else:
                cv_image = cv2.imread(image_path)

                items = result.get_items()
                print('Found {} barcodes.'.format(len(items)))
                for item in items:
                    format_type = item.get_format()
                    text = item.get_text()
                    print("Barcode Format:", format_type)
                    print("Barcode Text:", text)

                    location = item.get_location()
                    x1 = location.points[0].x
                    y1 = location.points[0].y
                    x2 = location.points[1].x
                    y2 = location.points[1].y
                    x3 = location.points[2].x
                    y3 = location.points[2].y
                    x4 = location.points[3].x
                    y4 = location.points[3].y
                    del location

                    cv2.drawContours(
                        cv_image, [np.intp([(x1, y1), (x2, y2), (x3, y3), (x4, y4)])], 0, (0, 255, 0), 2)

                    cv2.putText(cv_image, text, (x1, y1 - 10),
                                cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)

                cv2.imshow(
                    "Original Image with Detected Barcodes", cv_image)
                cv2.waitKey(0)
                cv2.destroyAllWindows()

    input("Press Enter to quit...")

Remarque : remplacez la LICENSE-KEY par votre clé de licence valide.

Test du lecteur de codes-barres Python avec une image multi-codes-barres

Le décodage de plusieurs codes-barres à partir d'une seule image est un cas d'utilisation courant dans le commerce de détail et la logistique. L'image suivante contient plusieurs codes-barres de différents formats :

How to Build a Python Barcode Scanner for Windows, Linux, and macOS

Détection multi-codes-barres en temps réel avec une webcam

Lors de la lecture de codes-barres à partir d'un fichier image, nous invoquons la méthode capture() dans le thread principal. Cependant, pour traiter les flux vidéo en temps réel provenant d’une webcam, une approche différente est nécessaire pour éviter de bloquer le thread principal. Le SDK Dynamsoft Capture Vision fournit un mécanisme intégré pour gérer les images vidéo en temps réel et les traiter de manière asynchrone sur un thread de travail C natif. Pour implémenter cela, étendez les classes ImageSourceAdapter et CapturedResultReceiver pour gérer respectivement les données d'image et les résultats capturés, puis appelez la méthode start_capturing() pour commencer le traitement du flux vidéo.

from dynamsoft_capture_vision_bundle import *
import cv2
import numpy as np
import queue
from utils import *


class FrameFetcher(ImageSourceAdapter):
    def has_next_image_to_fetch(self) -> bool:
        return True

    def add_frame(self, imageData):
        self.add_image_to_buffer(imageData)


class MyCapturedResultReceiver(CapturedResultReceiver):
    def __init__(self, result_queue):
        super().__init__()
        self.result_queue = result_queue

    def on_captured_result_received(self, captured_result):
        self.result_queue.put(captured_result)


if __name__ == '__main__':
    errorCode, errorMsg = LicenseManager.init_license(
        "LICENSE-KEY")
    if errorCode != EnumErrorCode.EC_OK and errorCode != EnumErrorCode.EC_LICENSE_CACHE_USED:
        print("License initialization failed: ErrorCode:",
              errorCode, ", ErrorString:", errorMsg)
    else:
        vc = cv2.VideoCapture(0)
        if not vc.isOpened():
            print("Error: Camera is not opened!")
            exit(1)

        cvr = CaptureVisionRouter()
        fetcher = FrameFetcher()
        cvr.set_input(fetcher)

        # Create a thread-safe queue to store captured items
        result_queue = queue.Queue()

        receiver = MyCapturedResultReceiver(result_queue)
        cvr.add_result_receiver(receiver)

        errorCode, errorMsg = cvr.start_capturing(
            EnumPresetTemplate.PT_READ_BARCODES.value)

        if errorCode != EnumErrorCode.EC_OK:
            print("error:", errorMsg)

        while True:
            ret, frame = vc.read()
            if not ret:
                print("Error: Cannot read frame!")
                break

            fetcher.add_frame(convertMat2ImageData(frame))

            if not result_queue.empty():
                captured_result = result_queue.get_nowait()

                items = captured_result.get_items()
                for item in items:

                    if item.get_type() == EnumCapturedResultItemType.CRIT_BARCODE:
                        text = item.get_text()
                        location = item.get_location()
                        x1 = location.points[0].x
                        y1 = location.points[0].y
                        x2 = location.points[1].x
                        y2 = location.points[1].y
                        x3 = location.points[2].x
                        y3 = location.points[2].y
                        x4 = location.points[3].x
                        y4 = location.points[3].y
                        cv2.drawContours(
                            frame, [np.intp([(x1, y1), (x2, y2), (x3, y3), (x4, y4)])], 0, (0, 255, 0), 2)

                        cv2.putText(frame, text, (x1, y1),
                                    cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)

                        del location

            if cv2.waitKey(1) & 0xFF == ord('q'):
                break

            cv2.imshow('frame', frame)

        cvr.stop_capturing()
        vc.release()
        cv2.destroyAllWindows()

Explication

  • La classe FrameFetcher implémente l'interface ImageSourceAdapter pour alimenter les données d'image dans le tampon intégré.
  • La classe MyCapturedResultReceiver implémente l'interface CapturedResultReceiver. La méthode on_captured_result_received s'exécute sur un thread de travail C natif et envoie les objets CapturedResult au thread principal où ils sont stockés dans une file d'attente thread-safe pour une utilisation ultérieure.
  • Un CapturedResult contient plusieurs objets CapturedResultItem. Le type CRIT_BARCODE représente les données de codes-barres reconnues.

Test du scanner de codes-barres Python sur macOS

How to Build a Python Barcode Scanner for Windows, Linux, and macOS

Code source

https://github.com/yushulx/python-barcode-qrcode-sdk/tree/main/examples/official/10.x

Déclaration de sortie Cet article est reproduit sur : https://dev.to/yushulx/how-to-build-a-python-barcode-scanner-for-windows-linux-and-macos-15d?1 En cas de violation, veuillez contacter study_golang@163 .comdelete
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3