Common Vision Blox: Prototyping von Bildverarbeitungslösungen mit Python
26.06.2020 -
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 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 schneller und effizienter machen.
Die APIs sind mit der aktuellen CVB-API kompatibel, sodass Anwender auf bestehenden Applikationen aufbauen können, ohne ihren Quellcode neu schreiben zu müssen.
CVBpy bringt die Leistungsfähigkeit und Geschwindigkeit von Common Vision Blox einer neuen Anwendergruppe näher, die schnelle Ergebnisse und eine einfache Programmierung mit Python gewöhnt ist. Python, eine universelle open-source und interpretierte höhere Programmiersprache, ist kostenlos 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, sodass es keine Einschränkungen bezüglich Compiler und Hardware gibt. Durch ihre klare und übersichtliche Syntax lässt sie sich leicht erlernen. Das spart Zeit und Ressourcen, erhöht die Produktivität und macht sie genau deshalb für das Erstellen von Prototypen so interessant. Es gibt bereits Python-Frameworks, die in vielen Anwendungsbereichen zum Einsatz kommen, darunter das sogenannte Internet of Things, Machine Learning, Deep Learning und künstliche Intelligenz, was bedeutet, dass Schnittstellen für eine große 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 Python-Anbindung aus einer moderneren, objektorientierten und leistungsfähigeren Architektur wie C++ zu generieren. Das ist zwar ein gewisser Fortschritt, jedoch lassen sich wichtige Python-Funktionen 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 gelungen, das sowohl mit Common Vision Blox als auch mit Python bestens vertraut ist. Der erstellte CVBpy-Binder bietet Zugang zu vielen Python-Funktionen, die für das Programmieren und das Prototyping mit CVB genutzt werden können, zum Beispiel:
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 das Erfassen und Verarbeiten komplexer Bilder und hohe Bildraten erfordern, aber auch für Anwendungen, die viele verschiedene Systeme umfassen, die große Datenmengen erzeugen und entsprechend große Speicherkapazitäten benötigen.
Integrierte Dokumentation: Python bietet eine integrierte Dokumentation, die direkt in CVBpy zur Verfügung steht. 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 ermöglicht es, native Threads zu starten und die Async-Funktion von Python anzuwenden, die im Wesentlichen über eine Ereignisbehandlungsroutine (Event Handler) arbeitet.
Stabile API: Python bietet durch 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, sodass keine Anpassungen für zukünftige Versionen von Python 3 nötig sind.
Integrierte Anbindung an NumPy: NumPy unterstützt große, mehrdimensionale Matrixfelder sowie viele hochentwickelten mathematischen Funktionen. Die CVBpy-Schnittstelle ermöglicht das direkte Übertragen von Bildern an NumPy, die von einem realen Gerät aufgenommen wurden, wo alle entwickelten Algorithmen angewendet werden können.
Grafische 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. 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 Emulations-Dateiformat, 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 aktuelle Bild für die Verarbeitung bereitstellt. Das Bild selbst besteht aus mehreren Ebenen und das Gerät verfügt über Node-Maps, zum Beispiel eine GenAPI-Node-Map, für den Kontrollpfad. Die Maps, Nodes und Features lassen sich auf verschiedenen Ebenen von jedem Gerät abrufen, das über einen XML-Code definiert wird. 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-Beispiel zeigt den ziemlich simplen Code, der für das Erfassen einer Reihe von Bildern nötig ist: 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 nötig. Die GUI-Anwendung muss Multithreading-fähig sein, damit die Kamera asynchron dazu laufen kann. Außerdem ist ein einheitliches Verwenden der Bilderfassungs-Hardware 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 sich im laufenden Betrieb modifizieren lassen, was Prototyping-Prozesse erheblich beschleunigt. Der Einsatz von CVBpy unterscheidet sich nicht von der Arbeit mit herkömmlichen Python-Modulen und bietet Programmierern und Entwicklern die bewährten Vorteile von CVB.