"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > Cómo construir un escáner de códigos de barras Python para Windows, Linux y macOS

Cómo construir un escáner de códigos de barras Python para Windows, Linux y macOS

Publicado el 2024-11-02
Navegar:810

El escaneo de códigos de barras se ha convertido en una herramienta esencial en diversas industrias, desde el comercio minorista y la logística hasta la atención médica. En plataformas de escritorio, permite la captura y procesamiento rápido de información sin ingreso manual de datos, ahorrando tiempo y reduciendo errores. En este tutorial, continuaremos explorando las capacidades del SDK de Dynamsoft Capture Vision mediante la creación de un escáner de código de barras Python para Windows, Linux y macOS.

Demostración del escáner de código de barras Python en macOS

Requisitos previos

  • Licencia de prueba de Dynamsoft Capture Vision: obtenga una clave de licencia de prueba de 30 días para el SDK de Dynamsoft Capture Vision.

  • Paquetes de Python: instale los paquetes de Python necesarios utilizando los siguientes comandos:

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

    ¿Para qué sirven estos paquetes?

    • dynamsoft-capture-vision-bundle es el SDK de Dynamsoft Capture Vision para Python.
    • opencv-python captura fotogramas de la cámara y muestra los resultados de las imágenes procesadas.

Lectura de códigos de barras a partir de imágenes estáticas

Dado que Dynamsoft Capture Vision SDK es un marco unificado integrado con varias tareas de procesamiento de imágenes, podemos cambiar fácilmente entre modos de procesamiento de imágenes pasando el nombre PresetTemplate al método capture().

Plantillas integradas del SDK de Dynamsoft Capture Vision

El siguiente fragmento de código muestra la enumeración integrada PresetTemplate en el SDK de 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()
    )

La plantilla PT_DEFAULT admite múltiples tareas, incluida la detección de documentos, el reconocimiento de MRZ y la detección de códigos de barras. Para optimizar el rendimiento específicamente para la detección de códigos de barras, configure la plantilla en EnumPresetTemplate.PT_READ_BARCODES.value.

Código Python para la detección de códigos de barras

Haciendo referencia a los ejemplos anteriores de detección de documentos y reconocimiento de MRZ, el siguiente código se puede utilizar para leer códigos de barras de imágenes estáticas:

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...")

Nota: Reemplace LICENSE-KEY con su clave de licencia válida.

Prueba del lector de códigos de barras Python con una imagen de varios códigos de barras

Decodificar múltiples códigos de barras a partir de una sola imagen es un caso de uso común en el comercio minorista y la logística. La siguiente imagen contiene varios códigos de barras de diferentes formatos:

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

Detección de múltiples códigos de barras en tiempo real con una cámara web

Al leer códigos de barras de un archivo de imagen, invocamos el método capture() en el hilo principal. Sin embargo, para procesar transmisiones de vídeo en tiempo real desde una cámara web, se necesita un enfoque diferente para evitar bloquear el hilo principal. El SDK de Dynamsoft Capture Vision proporciona un mecanismo integrado para manejar fotogramas de vídeo en tiempo real y procesarlos de forma asincrónica en un subproceso de trabajo nativo de C. Para implementar esto, extienda las clases ImageSourceAdapter y CapturedResultReceiver para manejar los datos de la imagen y los resultados capturados, respectivamente, luego llame al método start_capturing() para comenzar a procesar la transmisión de video.

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()

Explicación

  • La clase FrameFetcher implementa la interfaz ImageSourceAdapter para introducir datos de fotogramas en el búfer integrado.
  • La clase MyCapturedResultReceiver implementa la interfaz CapturedResultReceiver. El método on_captured_result_received se ejecuta en un subproceso de trabajo nativo de C y envía objetos CapturedResult al subproceso principal donde se almacenan en una cola segura para subprocesos para su uso posterior.
  • Un CapturedResult contiene varios objetos CapturedResultItem. El tipo CRIT_BARCODE representa datos de códigos de barras reconocidos.

Prueba del escáner de código de barras Python en macOS

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

Código fuente

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

Declaración de liberación Este artículo se reproduce en: https://dev.to/yushulx/how-to-build-a-python-barcode-scanner-for-windows-linux-and-macos-15d?1 Si hay alguna infracción, por favor contacto Study_golang@163 .comeliminar
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3