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.
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?
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.
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.
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.
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:
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
https://github.com/yushulx/python-barcode-qrcode-sdk/tree/main/examples/official/10.x
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