Know-how Bildverarbeitung

Mit Polarisation

Verborgenes sichtbar machen >

Mehr
The Imaging & Vision Handbook 2019/2020

Expertenwissen kompakt

DAS HANDBUCH

DER BILDVERARBEITUNG >

Neue Auflage 2019/2020

Mehr

Prototyping mit Python für Bildverarbeitungslösungen

Prototyping spielt bei der Entwicklung von Bildverarbeitungslösungen eine wichtige Rolle. Um die Realisierbarkeit von Ideen zu überprüfen, eine schnelle Abschätzung des zeitlichen Rahmens und der Kosten einer Entwicklung vorzunehmen oder um Anwendern erste Ergebnisse präsentieren zu können, kommen häufig Prototyping-Methoden zum Einsatz.

Die Beschleunigung solcher Prozesse ist daher für alle Beteiligten enorm vorteilhaft. CVB2019 stellt dazu drei neue objektorientierte APIs vor, die C++, .NET und Python unterstützen und die die Realisierung von Bildverarbeitungslösungen mit Common Vision Blox zukünftig noch schneller und effizienter machen. Die neuen APIs sind mit der aktuellen CVB-API kompatibel, so dass Anwender auf bestehenden Applikationen aufbauen können, ohne ihren Quellcode neu schreiben zu müssen.

Welche Vorteile bietet Python?

CVBpy bringt die Leistungsfähigkeit und Geschwindigkeit von Common Vision Blox einer neuen Anwendergruppe näher, die schnelle Ergebnisse und einfache Programmierung mit Python gewöhnt ist. Python, eine universelle open-source und interpretierte höhere Programmiersprache, ist kostenlos verfügbar und anwenderfreundlich.

Sie ist eine der am meisten verbreiteten Programmiersprachen, und laut einer Umfrage bei Entwicklern auch eine der beliebtesten. Python läuft auf Embedded-, Linux- und Windows-Plattformen und ist portabel, so dass es keine Einschränkungen bezüglich Compiler und Hardware gibt. Dank ihrer klaren und übersichtlichen Syntax lässt sie sich leicht erlernen. Das spart Zeit und Ressourcen, erhöht die Produktivität und macht sie genau deshalb für die Erstellung von Prototypen so interessant. Es gibt bereits Python-Frameworks, die in vielen Anwendungsbereichen eingesetzt werden, darunter IoT, Machine Learning, Deep Learning und künstliche Intelligenz, was bedeutet, dass Schnittstellen für eine enorme Bandbreite von Bibliotheken zur Verfügung stehen.

Python-Vorzüge für CVB genutzt

Eine optimierte Pythonanbindung ist essentiell, um die Leistungsfähigkeit von Common Vision Blox voll auszuschöpfen. Die übliche Vorgehensweise bei der Erstellung einer Python-Schnittstelle ist ihre Generierung aus einer C-Schnittstelle mithilfe von Standard-Tools. Allerdings ist dies nicht der bestmögliche Ansatz, da Python wesentlich mehr leistungsstarke Funktionen bietet, die auf diese Weise unberücksichtigt bleiben. Grundsätzlich ist es besser, die Pythonanbindung aus einer moderneren, objektorientierten und leistungsfähigeren Architektur wie C++ zu generieren. Das ist zwar ein gewisser Fortschritt, jedoch lassen sich wichtige Python-Features immer noch nicht nutzen, da hier lediglich eine Programmiersprache in eine andere „hineingezwängt“ wird und dabei einige der wichtigsten Eigenschaften beider Sprachen ignoriert werden.

Das Ergebnis besteht in der Regel aus deren kleinsten gemeinsamen Nenner, was weit von Entwickleranforderungen entfernt ist. Die Lösung besteht darin, den Wrapper manuell zu erstellen. Was auf den ersten Blick ziemlich komplex erscheint, ist dem Entwicklerteam von STEMMER IMAGING, das sowohl mit Common Vision Blox als auch mit Python bestens vertraut ist, schnell und effizient gelungen.

Der erstellte CVBpy-Binder bietet Zugang zu vielen Python-Funktionen, die für die Programmierung und das Prototyping mit CVB genutzt werden können wie z. B.:

  • Explizites Ressourcenmanagement: CVBpy unterstützt das Management von Ressourcen wie Speicher oder Dateien, das von Python übernommen wird. Dadurch wird vermieden, dass Speicher manuell freigegeben, Dateien geschlossen oder das Ressourcenmanagement ausgelagert werden muss. Das explizite Ressourcenmanagement ist besonders wichtig für Bildverarbeitungsapplikationen, die die Erfassung und Verarbeitung komplexer Bilder und hohe Bildraten erfordern, aber auch für Anwendungen, die viele verschiedene Systeme umfassen, die große Datenmengen erzeugen und große Speicherkapazitäten benötigen.

  • Integrierte Dokumentation: Python bietet eine integrierte Dokumentation, die direkt in CVBpy zur Verfügung gestellt wird. Durch die feste Verbindung der Programmierschnittstelle mit ihrer Dokumentation kann die IDE (Integrated Development Environment) zu den verwendeten Funktionen direkt in die Dokumentation eingeblendet werden, was die Installation einer separaten Dokumentation erspart.

  • Verbesserte Unterstützung von Multithreading und Async für manuelle Abläufe: Dies erlaubt das Starten nativer Threads und die Anwendung der Async-Funktion von Python, die im Wesentlichen über eine Ereignisbehandlungsroutine (Event Handler) arbeitet.

  • Stabile API: Python bietet dank PEP 384 eine stabile API oder ABI (Application Binary Interface) während der gesamten Nutzungsdauer von Python 3. Das bedeutet, dass CVBPy auf jeder Python-Version – von V3.5 bis hin zur aktuellen V3.8 und höher – läuft, so dass keine Anpassungen für zukünftige Versionen von Python 3 erforderlich sind.

  • CVBpy stellt eine integrierte Anbindung an NumPy zur Verfügung: NumPy unterstützt große, mehrdimensionale Matrixfelder sowie eine große Auswahl an hochentwickelten mathematischen Funktionen. Die CVBpy-Schnittstelle erlaubt die direkte Übertragung von Bildern, die von einem realen Gerät aufgenommen wurden, an NumPy, wo alle entwickelten Algorithmen angewendet werden können.

  • Einfache Gestaltung einer grafischen Benutzeroberfläche mit PySide2: Bildverarbeitungsanwendungen erfordern eine geeignete Anzeigefunktion, um Originalbilder und die entsprechenden Ergebnisse von Algorithmen darzustellen. Da Python selbst keine Benutzeroberfläche bereitstellt, verfügt CVBpy über eine PySide2-Anbindung, einen Wrapper für Qt 5, eine der bekanntesten und beliebtesten Cross-Platform-GUI-Bibliotheken.

Moderne Objektorientierung

Hinsichtlich Objektorientierung kann CVBpy mit einer Reihe von einfachen Klassen interagieren. Der wichtigste Zugang zur Hardware, beispielsweise zu Kameras ist die Device-Factory, die auch den Zugriff auf verschiedene Gerätetypen ermöglicht (siehe Abb. oben). Es existiert eine allgemeine Schnittstelle zu Videogeräten mit echter Hardware oder zu Non-Streaming-Geräten, die nur einen Kontrollpfad haben. Es gibt auch emulierte Geräte mit definierten Daten – entweder als klassische Mediendatei oder in einem Emulationsdateiformat, die einen oder mehrere Datenströme verwenden (die Verwendung multipler Datenströme ist in Vorbereitung).

In der Regel steht jedoch mindestens ein Datenstrom zur Verfügung, der einen Ringspeicher bietet, in den die Bilder übertragen werden und der das aktuellste Bild für die Verarbeitung bereitstellt. Das Bild selbst besteht aus mehreren Ebenen und das Gerät verfügt über Node-Maps wie z. B. eine GenAPI-Node-Map für den Kontrollpfad. Die Maps, Nodes und Features können auf verschiedenen Ebenen von jedem Gerät, das über einen XML-Code definiert wird, abgerufen werden. Außerdem gibt es einige praktische Schnittstellen auf den Geräten, um den Zugriff auf gemeinsame Funktionen zu erleichtern.

Anwendungsbeispiele für CVBpy

Eines der einfachsten Anwendungsbeispiele ist Pythons „Hello World“-Programm. Dieses CVBpy ‘hello world’ Beispiel zeigt den ziemlich simplen Code, der für die Erfassung einer Reihe von Bildern nötig ist (sieh Abb. oben). Als erstes wird ein Mock-up aus der Device-Factory geöffnet, aus dem ein Datenstrom empfangen wird. Der Datenstrom wird gestartet und nimmt zehn Bilder auf, deren Nummern nach einer Statusüberprüfung der Bilder ausgedruckt werden. Anschließend wird die Bildaufnahme einfach beendet und alle Ressourcen werden freigegeben.

Für anspruchsvollere Anwendungen wäre eine schnellere und flexiblere Live-Darstellung erforderlich. Die GUI-Anwendung muss Multithreading-fähig sein, damit die Kamera asynchron dazu laufen kann. Außerdem ist eine einheitliche Verwendung der Bilderfassungshardware erforderlich, und im Optimalfall sollten GUI und der eigentliche Programmcode getrennt werden.

Das Video demonstriert die Anbindung an die Benutzeroberfläche und zeigt, wie einfach es ist, mit nur 26 Programmzeilen die Anzeige aus einer Bildquelle einzurichten und mit der GUI zu verknüpfen.

Zusammenfassung

Der Python-Support in Common Vision Blox eröffnet neue Möglichkeiten für Skripting-Anwendungen, die im laufenden Betrieb modifiziert werden können, was Prototyping-Prozesse erheblich beschleunigt. Die Verwendung von CVBpy unterscheidet sich nicht von der Arbeit mit herkömmlichen Python-Modulen und bietet Programmierern und Entwicklern die bewährten Vorteile von CVB.