Maison  >  Article  >  développement back-end  >  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

DDD
DDDoriginal
2024-10-22 13:24:03760parcourir

La

La lecture 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 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 framework unifié intégré à diverses tâches de traitement d'image, nous pouvons facilement basculer entre les modes de traitement d'image en passant 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.

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

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn