


So implementieren Sie die Erkennung maschinenlesbarer Zonen (MRZ) in Python
Maschinenlesbare Zone (MRZ) ist eine entscheidende Funktion, die in modernen Pässen, Visa und Personalausweisen zum Einsatz kommt. Es enthält wesentliche Informationen über den Dokumenteninhaber, wie z. B. seinen Namen, sein Geschlecht, seinen Ländercode und seine Dokumentennummer. Die MRZ-Erkennung spielt eine Schlüsselrolle bei der Grenzkontrolle, der Flughafensicherheit und den Check-in-Prozessen in Hotels. In diesem Tutorial zeigen wir, wie Sie das Dynamsoft Capture Vision SDK nutzen, um die MRZ-Erkennung unter Windows, Linux und macOS zu implementieren Plattformen. Dieser Leitfaden bietet einen schrittweisen Ansatz zur Nutzung der leistungsstarken Funktionen des SDK, um die plattformübergreifende MRZ-Erkennung nahtlos und effizient zu gestalten.
Python MRZ-Erkennungsdemo 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
Nach dem Login kopierenWozu 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.
Erste Schritte mit dem Dynamsoft Python Capture Vision-Beispiel
Das offizielle MRZ-Scanner-Beispiel zeigt, wie man mit dem Dynamsoft Capture Vision SDK in kurzer Zeit einen einfachen Python-basierten MRZ-Reader erstellt.
Werfen wir einen Blick auf den Quellcode und analysieren seine Funktionalität:
import sys from dynamsoft_capture_vision_bundle import * import os class MRZResult: def __init__(self, item: ParsedResultItem): self.doc_type = item.get_code_type() self.raw_text=[] self.doc_id = None self.surname = None self.given_name = None self.nationality = None self.issuer = None self.gender = None self.date_of_birth = None self.date_of_expiry = None if self.doc_type == "MRTD_TD3_PASSPORT": if item.get_field_value("passportNumber") != None and item.get_field_validation_status("passportNumber") != EnumValidationStatus.VS_FAILED: self.doc_id = item.get_field_value("passportNumber") elif item.get_field_value("documentNumber") != None and item.get_field_validation_status("documentNumber") != EnumValidationStatus.VS_FAILED: self.doc_id = item.get_field_value("documentNumber") line = item.get_field_value("line1") if line is not None: if item.get_field_validation_status("line1") == EnumValidationStatus.VS_FAILED: line += ", Validation Failed" self.raw_text.append(line) line = item.get_field_value("line2") if line is not None: if item.get_field_validation_status("line2") == EnumValidationStatus.VS_FAILED: line += ", Validation Failed" self.raw_text.append(line) line = item.get_field_value("line3") if line is not None: if item.get_field_validation_status("line3") == EnumValidationStatus.VS_FAILED: line += ", Validation Failed" self.raw_text.append(line) if item.get_field_value("nationality") != None and item.get_field_validation_status("nationality") != EnumValidationStatus.VS_FAILED: self.nationality = item.get_field_value("nationality") if item.get_field_value("issuingState") != None and item.get_field_validation_status("issuingState") != EnumValidationStatus.VS_FAILED: self.issuer = item.get_field_value("issuingState") if item.get_field_value("dateOfBirth") != None and item.get_field_validation_status("dateOfBirth") != EnumValidationStatus.VS_FAILED: self.date_of_birth = item.get_field_value("dateOfBirth") if item.get_field_value("dateOfExpiry") != None and item.get_field_validation_status("dateOfExpiry") != EnumValidationStatus.VS_FAILED: self.date_of_expiry = item.get_field_value("dateOfExpiry") if item.get_field_value("sex") != None and item.get_field_validation_status("sex") != EnumValidationStatus.VS_FAILED: self.gender = item.get_field_value("sex") if item.get_field_value("primaryIdentifier") != None and item.get_field_validation_status("primaryIdentifier") != EnumValidationStatus.VS_FAILED: self.surname = item.get_field_value("primaryIdentifier") if item.get_field_value("secondaryIdentifier") != None and item.get_field_validation_status("secondaryIdentifier") != EnumValidationStatus.VS_FAILED: self.given_name = item.get_field_value("secondaryIdentifier") def to_string(self): msg = (f"Raw Text:\n") for index, line in enumerate(self.raw_text): msg += (f"\tLine {index + 1}: {line}\n") msg+=(f"Parsed Information:\n" f"\tDocumentType: {self.doc_type or ''}\n" f"\tDocumentID: {self.doc_id or ''}\n" f"\tSurname: {self.surname or ''}\n" f"\tGivenName: {self.given_name or ''}\n" f"\tNationality: {self.nationality or ''}\n" f"\tIssuingCountryorOrganization: {self.issuer or ''}\n" f"\tGender: {self.gender or ''}\n" f"\tDateofBirth(YYMMDD): {self.date_of_birth or ''}\n" f"\tExpirationDate(YYMMDD): {self.date_of_expiry or ''}\n") return msg def print_results(result: ParsedResult) -> None: tag = result.get_original_image_tag() if isinstance(tag, FileImageTag): print("File:", tag.get_file_path()) if result.get_error_code() != EnumErrorCode.EC_OK: print("Error:", result.get_error_string()) else: items = result.get_items() print("Parsed", len(items), "MRZ Zones.") for item in items: mrz_result = MRZResult(item) print(mrz_result.to_string()) if __name__ == '__main__': print("**********************************************************") print("Welcome to Dynamsoft Capture Vision - MRZ 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/passport-sample.jpg" if not os.path.exists(image_path): print("The image path does not exist.") continue result = cvr_instance.capture(image_path, "ReadPassportAndId") if result.get_error_code() != EnumErrorCode.EC_OK: print("Error:", result.get_error_code(), result.get_error_string()) else: parsed_result = result.get_parsed_result() if parsed_result is None or len(parsed_result.get_items()) == 0: print("No parsed results.") else: print_results(parsed_result) input("Press Enter to quit...")
Erklärung
- Die Methode LicenseManager.init_license initialisiert das Dynamsoft Capture Vision SDK mit einem gültigen Lizenzschlüssel.
- Die CaptureVisionRouter-Klasse verwaltet Bildverarbeitungsaufgaben und koordiniert verschiedene Bildverarbeitungsmodule. Seine Capture-Methode verarbeitet das Eingabebild und gibt das Ergebnis zurück.
- Die ReadPassportAndId ist eine integrierte Vorlage, die den Verarbeitungsmodus angibt. Das SDK unterstützt verschiedene Verarbeitungsmodi, wie z. B. MRZ-Erkennung, Dokumentkantenerkennung und Barcode-Erkennung.
- Die Methode get_parsed_result ruft das MRZ-Erkennungsergebnis als Wörterbuch ab. Die MRZResult-Klasse extrahiert und verpackt die relevanten MRZ-Informationen. Da diese Klasse in verschiedenen Anwendungen wiederverwendet werden kann, wird empfohlen, sie in eine utils.py-Datei zu verschieben.
Im nächsten Abschnitt verwenden wir OpenCV, um die MRZ-Erkennungsergebnisse zu visualisieren und die erkannten MRZ-Zonen auf dem Passbild anzuzeigen.
Visualizing Machine Readable Zone Location in a Passport Image
In the code above, result is an instance of the CapturedResult class. Calling its get_recognized_text_lines_result() method retrieves a list of TextLineResultItem objects. Each TextLineResultItem object contains the coordinates of the detected text line. Use the following code snippet to extract the coordinates and draw contours on the passport image:
cv_image = cv2.imread(image_path) line_result = result.get_recognized_text_lines_result() items = line_result.get_items() for item in items: 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.imshow( "Original Image with Detected MRZ Zone", cv_image) cv2.waitKey(0) cv2.destroyAllWindows()
Scanning and Recognizing MRZ in Real-time via Webcam
Scanning and recognizing MRZ in real-time via webcam requires capturing a continuous image stream. We can use the OpenCV library to capture frames from the webcam and process them with the Dynamsoft Capture Vision SDK. The following code snippet demonstrates how to implement real-time MRZ recognition using a webcam:
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("ReadPassportAndId") 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_TEXT_LINE: text = item.get_text() line_results = text.split('\n') 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) delta = y3 - y1 for line_result in line_results: cv2.putText( frame, line_result, (x1, y1), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1, cv2.LINE_AA) y1 += delta del location elif item.get_type() == EnumCapturedResultItemType.CRIT_PARSED_RESULT: mrz_result = MRZResult(item) print(mrz_result.to_string()) if cv2.waitKey(1) & 0xFF == ord('q'): break cv2.imshow('frame', frame) cvr.stop_capturing() vc.release() cv2.destroyAllWindows()
Explanation
- The FrameFetcher class implements the ImageSourceAdapter interface to feed frame data into the built-in buffer.
- The MyCapturedResultReceiver class implements the CapturedResultReceiver interface. The on_captured_result_received method runs on a native C++ worker thread, sending CapturedResult objects to the main thread where they are stored in a thread-safe queue for further use.
- A CapturedResult contains several CapturedResultItem objects. The CRIT_TEXT_LINE type represents recognized text lines, while the CRIT_PARSED_RESULT type represents parsed MRZ data.
Running the Real-time MRZ Recognition Demo on Windows
Source Code
https://github.com/yushulx/python-mrz-scanner-sdk/tree/main/examples/official
Das obige ist der detaillierte Inhalt vonSo implementieren Sie die Erkennung maschinenlesbarer Zonen (MRZ) in Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen











Python ist leichter zu lernen und zu verwenden, während C leistungsfähiger, aber komplexer ist. 1. Python -Syntax ist prägnant und für Anfänger geeignet. Durch die dynamische Tippen und die automatische Speicherverwaltung können Sie die Verwendung einfach zu verwenden, kann jedoch zur Laufzeitfehler führen. 2.C bietet Steuerung und erweiterte Funktionen auf niedrigem Niveau, geeignet für Hochleistungsanwendungen, hat jedoch einen hohen Lernschwellenwert und erfordert manuellem Speicher und Typensicherheitsmanagement.

Um die Effizienz des Lernens von Python in einer begrenzten Zeit zu maximieren, können Sie Pythons DateTime-, Zeit- und Zeitplanmodule verwenden. 1. Das DateTime -Modul wird verwendet, um die Lernzeit aufzuzeichnen und zu planen. 2. Das Zeitmodul hilft, die Studie zu setzen und Zeit zu ruhen. 3. Das Zeitplanmodul arrangiert automatisch wöchentliche Lernaufgaben.

Python ist in der Entwicklungseffizienz besser als C, aber C ist in der Ausführungsleistung höher. 1. Pythons prägnante Syntax und reiche Bibliotheken verbessern die Entwicklungseffizienz. 2. Die Kompilierungsmerkmale von Compilation und die Hardwarekontrolle verbessern die Ausführungsleistung. Bei einer Auswahl müssen Sie die Entwicklungsgeschwindigkeit und die Ausführungseffizienz basierend auf den Projektanforderungen abwägen.

Ist es genug, um Python für zwei Stunden am Tag zu lernen? Es hängt von Ihren Zielen und Lernmethoden ab. 1) Entwickeln Sie einen klaren Lernplan, 2) Wählen Sie geeignete Lernressourcen und -methoden aus, 3) praktizieren und prüfen und konsolidieren Sie praktische Praxis und Überprüfung und konsolidieren Sie und Sie können die Grundkenntnisse und die erweiterten Funktionen von Python während dieser Zeit nach und nach beherrschen.

Python und C haben jeweils ihre eigenen Vorteile, und die Wahl sollte auf Projektanforderungen beruhen. 1) Python ist aufgrund seiner prägnanten Syntax und der dynamischen Typisierung für die schnelle Entwicklung und Datenverarbeitung geeignet. 2) C ist aufgrund seiner statischen Tipp- und manuellen Speicherverwaltung für hohe Leistung und Systemprogrammierung geeignet.

PythonlistsarePartThestandardlibrary, whilearraysarenot.listarebuilt-in, vielseitig und UNDUSEDFORSPORINGECollections, während dieArrayRay-thearrayModulei und loses und loses und losesaluseduetolimitedFunctionality.

Python zeichnet sich in Automatisierung, Skript und Aufgabenverwaltung aus. 1) Automatisierung: Die Sicherungssicherung wird durch Standardbibliotheken wie OS und Shutil realisiert. 2) Skriptschreiben: Verwenden Sie die PSUTIL -Bibliothek, um die Systemressourcen zu überwachen. 3) Aufgabenverwaltung: Verwenden Sie die Zeitplanbibliothek, um Aufgaben zu planen. Die Benutzerfreundlichkeit von Python und die Unterstützung der reichhaltigen Bibliothek machen es zum bevorzugten Werkzeug in diesen Bereichen.

Zu den Anwendungen von Python im wissenschaftlichen Computer gehören Datenanalyse, maschinelles Lernen, numerische Simulation und Visualisierung. 1.Numpy bietet effiziente mehrdimensionale Arrays und mathematische Funktionen. 2. Scipy erweitert die Numpy -Funktionalität und bietet Optimierungs- und lineare Algebra -Tools. 3.. Pandas wird zur Datenverarbeitung und -analyse verwendet. 4.Matplotlib wird verwendet, um verschiedene Grafiken und visuelle Ergebnisse zu erzeugen.
