„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > So erstellen Sie einen Python-Barcode-Scanner für Windows, Linux und macOS

So erstellen Sie einen Python-Barcode-Scanner für Windows, Linux und macOS

Veröffentlicht am 02.11.2024
Durchsuche:775

Barcode-Scannen ist zu einem unverzichtbaren Werkzeug in verschiedenen Branchen geworden, vom Einzelhandel über die Logistik bis hin zum Gesundheitswesen. Auf Desktop-Plattformen ermöglicht es die schnelle Erfassung und Verarbeitung von Informationen ohne manuelle Dateneingabe, was Zeit spart und Fehler reduziert. In diesem Tutorial werden wir die Funktionen des Dynamsoft Capture Vision SDK weiter erkunden, indem wir einen Python-Barcodescanner für Windows, Linux erstellen. , und macOS.

Python-Barcode-Scanner-Demo auf macOS

Voraussetzungen

  • Dynamsoft Capture Vision-Testlizenz: Erhalten Sie einen 30-Tage-Testlizenzschlüssel für das Dynamsoft Capture Vision SDK.

  • Python-Pakete: Installieren Sie die erforderlichen Python-Pakete mit den folgenden Befehlen:

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

    Wozu dienen diese Pakete?

    • dynamsoft-capture-vision-bundle ist das Dynamsoft Capture Vision SDK für Python.
    • opencv-python erfasst Kamerabilder und zeigt verarbeitete Bildergebnisse an.

Lesen von Barcodes aus statischen Bildern

Da es sich beim Dynamsoft Capture Vision SDK um ein einheitliches Framework handelt, das in verschiedene Bildverarbeitungsaufgaben integriert ist, können wir problemlos zwischen den Bildverarbeitungsmodi wechseln, indem wir den Namen PresetTemplate an die Methode „capture()“ übergeben.

Integrierte Vorlagen des Dynamsoft Capture Vision SDK

Der folgende Codeausschnitt zeigt die integrierte PresetTemplate-Enumeration im Dynamsoft Capture Vision SDK:

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

Die PT_DEFAULT-Vorlage unterstützt mehrere Aufgaben, einschließlich Dokumentenerkennung, MRZ-Erkennung und Barcode-Erkennung. Um die Leistung speziell für die Barcode-Erkennung zu optimieren, legen Sie die Vorlage auf EnumPresetTemplate.PT_READ_BARCODES.value fest.

Python-Code zur Barcode-Erkennung

Unter Bezugnahme auf die vorherigen Beispiele zur Dokumentenerkennung und MRZ-Erkennung kann der folgende Code zum Lesen von Barcodes aus statischen Bildern verwendet werden:

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

Hinweis: Ersetzen Sie den LIZENZSCHLÜSSEL durch Ihren gültigen Lizenzschlüssel.

Testen des Python-Barcode-Readers mit einem Multi-Barcode-Bild

Das Dekodieren mehrerer Barcodes aus einem einzigen Bild ist ein häufiger Anwendungsfall im Einzelhandel und in der Logistik. Das folgende Bild enthält mehrere Barcodes unterschiedlicher Formate:

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

Echtzeit-Multibarcode-Erkennung mit einer Webcam

Beim Lesen von Barcodes aus einer Bilddatei rufen wir die Methode „capture()“ im Hauptthread auf. Für die Verarbeitung von Echtzeit-Videostreams von einer Webcam ist jedoch ein anderer Ansatz erforderlich, um eine Blockierung des Hauptthreads zu vermeiden. Das Dynamsoft Capture Vision SDK bietet einen integrierten Mechanismus für die Verarbeitung von Echtzeit-Videobildern und deren asynchrone Verarbeitung in einem nativen C-Worker-Thread. Um dies zu implementieren, erweitern Sie die Klassen ImageSourceAdapter und CapturedResultReceiver, um die Bilddaten bzw. erfassten Ergebnisse zu verarbeiten, und rufen Sie dann die Methode start_capturing() auf, um mit der Verarbeitung des Videostreams zu beginnen.

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

Erläuterung

  • Die FrameFetcher-Klasse implementiert die ImageSourceAdapter-Schnittstelle, um Frame-Daten in den integrierten Puffer einzuspeisen.
  • Die MyCapturedResultReceiver-Klasse implementiert die CapturedResultReceiver-Schnittstelle. Die Methode on_captured_result_received wird auf einem nativen C-Worker-Thread ausgeführt und sendet CapturedResult-Objekte an den Haupt-Thread, wo sie zur weiteren Verwendung in einer thread-sicheren Warteschlange gespeichert werden.
  • Ein CapturedResult enthält mehrere CapturedResultItem-Objekte. Der Typ CRIT_BARCODE stellt erkannte Barcode-Daten dar.

Testen des Python-Barcode-Scanners unter macOS

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

Quellcode

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

Freigabeerklärung Dieser Artikel ist abgedruckt unter: https://dev.to/yushulx/how-to-build-a-python-barcode-scanner-for-windows-linux-and-macos-15d?1 Wenn es einen Verstoß gibt, bitte Kontaktieren Sie Study_golang@163 .comdelete
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3