Sofortige Sicht

Warum WaveMe

Suchen Sie nach einer Lösung, die eine Vision-Kamera beinhaltet? Sie wollen eine leistungsstarke Anwendung, bei der Sie das Sagen haben? Dann sollten Sie einen Blick auf WaveMe werfen. WaveMe ist eine Plattform, die die üblichen Probleme löst, die bei der Entwicklung von Bildverarbeitungsanwendungen auftreten, die Zugang zu High-End-Grafiken benötigen. WaveMe ist für alle, denen Labview zu schwer ist und die eine Anwendung von Grund auf neu schreiben wollen.

Mit diesem Tech-Talk möchte ich ein wenig tiefer in das eintauchen, was WaveMe als generische Programmierumgebung bietet und warum Sie, oder Senslogic, mit sehr wenig Aufwand ein leistungsstarkes Tool bauen können.

Grundlegende Architektur

Wie macht WaveMe das? WaveMe wurde von Anfang an so konzipiert, dass es grundsätzlich verschiedene Anwendungen mit der Bildverarbeitungskamera als gemeinsame Komponente handhaben kann. Das Herzstück der Plattform ist eine Pipeline, die von einem Pipeline-Manager verwaltet wird, der Module (das ist Ihr Code) mit definierten Eingangs- und Ausgangstypen hinzufügt und entfernt.

Die Pipeline wie auch der Rest der Anwendung basieren auf einem Producer-Consumer-Paradigma. Dies gilt für alles, von Bildern bis zur Speicherzuweisung. Der Produzent ist in der Regel eine Kamera, kann aber alles sein, was Daten erzeugt. Jeder kann ein Produzent in der Pipeline sein. Der (ultimative) Konsument ist ein Compositor, der alle Aufgaben im Zusammenhang mit der Anzeige von Bildern, der Beantwortung von Grafikbefehlen, der Weitergabe von Ereignissen und schließlich der Rückgabe der vom Produzenten zugewiesenen Daten übernimmt, wenn diese nicht mehr benötigt werden. Die einzige Besonderheit des Compositors ist, dass er in einem OpenGL-Kontext läuft, was bedeutet, dass wir Zugriff auf den gesamten Satz von OpenGL-Befehlen haben.

Die Plattform verfügt über eine ganze Reihe vordefinierter Grafikprimitive, wie das Zeichnen von Linien, Polygonen, Kreisen, Fadenkreuzen, das Rendern von Text und sogar die Anzeige von Zernike-Polynomen. Wenn Sie nicht finden, was Ihnen gefällt, können Sie ganz einfach Ihre eigenen hinzufügen. Das ist zwar mit einem gewissen Mehraufwand verbunden, aber wir sind nie durch die Plattform eingeschränkt. Wenn wir es brauchen, steht uns die ganze Pracht von OpenGL zur Verfügung.

Kooperative Module

Ein WaveMe Modul ist eine Bibliothek, die ihre eigene Benutzeroberfläche mitbringt, ihre Eingabe- und Ausgabetypen definiert und zu einer Live-Pipeline hinzugefügt wird, wenn entsprechende Daten verfügbar sind. Module arbeiten als Filter und sind kooperativ. Sie sehen alle Daten in der Pipeline. Ein Modul erfüllt in der Regel die folgenden Aufgaben,

  • Achten Sie auf die Art der Daten
    • Wenn es sich bei den Daten um eine Exit-Anforderung handelt, wird ein Exit-Code zurückgegeben. Dieses Modul wird aufgelöst. Die Aufräumarbeiten werden mit den registrierten Aufräumfunktionen durchgeführt, die Sie beim Starten des Moduls angegeben haben
  • Die Nachricht in der Pipeline weiterleiten, wenn sie nicht vom richtigen Typ ist, und mit einem Continue-Code zurückgeben
  • Wenn die Daten das sind, wonach wir suchen,
    • Wir machen die Arbeit, und wenn wir die Daten nicht mehr brauchen, geben wir sie an die Pipeline zurück. Vielleicht will ein anderes Modul sie auch haben. Das bleibt Ihnen überlassen. Sie können die Daten "fallen lassen" und damit ihre Aufräumfunktionen aufrufen.
    • Wir können auch zusätzliche Nachrichten generieren, die in der Pipeline weitergereicht werden, um schließlich vom Compositor verarbeitet zu werden.
    • Wenn alles erledigt ist, kehren Sie mit einem Continue-Code zurück. Das Modul wird wieder aufgeweckt, wenn die nächste Nachricht eintrifft.

Maus- und Tastaturereignisse

Beim Schreiben einer vollwertigen GUI-Anwendung gibt es viele Standard-Ereignisse zu behandeln. WaveMe wird mit einer Vorlage geliefert, in der Maus- und Tastaturereignisse vordefiniert sind, so dass sie mit dem Rest der Plattform zusammenarbeiten. Standardmäßig befindet sich Ihre Anwendung in einer Registerkarte neben anderen Modulen. Eines davon ist das Modul, das die Kamera steuert. Wenn Sie die Kamera-Registerkarte auswählen, erwartet WaveMe, dass Module, die derzeit Tastatur- und Mausereignisse verarbeiten, diese loslassen und umgekehrt, wenn die Registerkarte des Moduls ausgewählt wird. All dies wird von der Standardvorlage erledigt. Alles, was wir tun müssen, ist die Änderung des Namens der Vorlage Callback-Funktionen und fügen Sie Ihren eigenen Code, zumindest wenn wir diese Ereignisse zu interagieren wollen.

Grafisches Toolkit & Benutzeroberfläche

WaveMe basiert auf GTK4 und glib-2.0 für seine Benutzeroberfläche, und ein Großteil der Art und Weise, wie Module mit der Pipeline interagieren, folgt den von diesen Bibliotheken verwendeten Mustern.

Es wird davon ausgegangen, dass die Kamera einen konstanten Fluss von Bildern liefert und die Module darauf reagieren, indem sie Nachrichten auf der Grundlage dessen erzeugen, was sie sehen. Diese Semantik passt gut zu grafischen Elementen, die eine Eigenschaft jedes Bildes verfolgen.

Dieses Verhalten passt vielleicht nicht zu allem, so dass wir es eventuell ändern müssen. Der Compositor geht davon aus, dass alle Objekte, die er empfängt, persistent sind und dass eine weitere Nachricht mit der gleichen ID nur wenige Millisekunden entfernt ist, es sei denn, man sagt etwas anderes. Es gibt Dinge, die wir vielleicht tun wollen, die nicht auf diese Beschreibung passen. Wenn wir zum Beispiel eine Farbkarte ändern wollen, ist das definitiv eine Nachricht, die keine Nachverfolgung braucht. Für diese Art von Nachrichten müssen wir die Nachricht als einmalig kennzeichnen. Erschießen und vergessen. Der Aktionsteil der Nachricht wird einmal aufgerufen und dann nie wieder.

Eine letzte Sache, die zumindest einmal erwähnt werden sollte: Alle Nachrichten können eine Aufräumfunktion haben, und die Aufräumfunktion läuft im OpenGL-Kontext. Wenn wir einen Blick in den OpenGL-Status werfen und ihn an die Anwendung zurückschicken müssen, ist dies der richtige Ort dafür.

Resümee

Ich hoffe, dass ich einen kleinen Einblick in die Möglichkeiten von WaveMe gegeben habe. Einige Dinge wurden nicht behandelt, wie z.B. wie wir die Benutzeroberfläche aufbauen, oder zumindest die Teile der Benutzeroberfläche, die spezifisch für WaveMe sind. Vieles davon ist in der Vorlage enthalten, von der alle derzeit für WaveMe verfügbaren Module abgeleitet sind. Die allgemeine Philosophie besteht darin, eine Vorlage zu verwenden, die alle Grundlagen abdeckt, und diese mit den Besonderheiten der einzelnen Anwendungen zu erweitern. Nachdem ich bereits einige davon geschrieben habe, denke ich, dass WaveMe sich zu einer wiederverwendbaren Plattform entwickelt hat, auf der viele Anwendungen schnell aufgebaut werden können. Überlegen Sie es sich. Vielleicht probieren Sie es sogar aus. Sie können mich gerne kontaktieren unter [email protected] wenn Sie herausfinden möchten, ob WaveMe auch für Sie geeignet ist.

Kommentar verfassen