Modules
HandDetector
- class GestureRecognition.modules.handdetector.HandDetector(outputSignal='detector')
Bases:
ModuleModul zur Erkennung von Händen und deren Landmarken.
Dieses Modul verwendet das MediaPipe Hand Landmarker Modell, um Hände in einem Kamerabild zu erkennen und deren Landmarken zu bestimmen.
Ziel ist es, die Webcam-Bilder zu verarbeiten, eine Handdetektion durchzuführen und die erkannten Landmarken sowie eine Visualisierung an das Framework zurückzugeben.
Konstruktor des Moduls.
Ziel ist es, das Modul beim Framework korrekt zu registrieren.
Hinweise
Ein Modul muss definieren, welche Signale es empfangen möchte.
Diese werden über
inputSignalsangegeben.Nur Signale, die hier subscribed werden, erscheinen später im
dataDictionary der Methodenstart()undstep().
Für dieses Modul werden unter anderem folgende Signale benötigt:
config: Systemkonfigurationwebcam: aktuelles Kamerabild
Zusätzlich muss ein Output-Schema definiert werden.
Output Schema
Das Modul erzeugt ein Signal mit dem Namen
detector.Dieses Signal enthält das Ergebnis der Handdetektion, welches beispielsweise Informationen über erkannte Hände und Landmarken enthalten kann.
Beispiel:
outputSchema={"type": "object", "properties": {outputSignal: {}}}Bemerkung
Die Basisklasse
Moduleerwartet beim Aufruf vonsuper().__init__unter anderem:inputSignalsoutputSchemanamedes Moduls
- param outputSignal:
Name des erzeugten Output-Signals.
- type outputSignal:
str, optional
- start(data)
Initialisierung des Moduls.
Diese Methode wird einmal beim Start des Moduls ausgeführt.
Ziel ist es, das benötigte Handdetektionsmodell zu laden und für die spätere Verarbeitung vorzubereiten.
Hinweise
MediaPipe stellt eine Hand-Landmark-Erkennung bereit.
Laden sie wie im Artikel beschrieben das Modell ein und speichern sie das detector Objekt in einem Attribut des Moduls. z.B.
self.detector
Tipp
Halte die Initialisierung strikt getrennt von der Verarbeitung. In
startsollte nur vorbereitet, nicht gerechnet werden.- param data:
Eingabedaten des Frameworks. Enthält unter anderem das Signal
config.- type data:
dict
- returns:
Ein leeres Dictionary.
- rtype:
dict
- step(data)
Verarbeitung eines einzelnen Frames.
Ziel ist es, ein Kamerabild zu analysieren, Hände zu erkennen und deren Landmarken zu bestimmen.
Hinweise
Greife auf das
webcamSignal zu, um das aktuelle Bild zu erhalten.Das Bild liegt typischerweise als
np.ndarrayvor.Für MediaPipe muss das Bild ggf. in ein geeignetes Format konvertiert werden (
mp.Image).Anschließend kann das Bild an den Handdetektor übergeben werden.
Das Ergebnis enthält Informationen über erkannte Hände sowie deren Landmarken.
Für jede erkannte Hand können die Landmarken anschließend visualisiert werden.
Für die Visualisierung kann ein
GALYObjekt verwendet werden.Die Funktion
draw_hand_landmarks()kann genutzt werden, um Landmarken und Verbindungen darzustellen.
Tipp
- Arbeite schrittweise:
Bild holen
Format konvertieren
Detektion durchführen
Ergebnis verarbeiten / visualisieren
Warnung
- Achte darauf, dass:
das Bildformat korrekt ist (RGB vs. BGR)
die Detektion pro Frame effizient bleibt (Live-Demo)
- param data:
Enthält unter anderem:
webcam: aktuelles Kamerabildconfig: Systemkonfiguration
- type data:
dict
- returns:
Soll das Ergebnis der Handdetektion sowie optional ein
GALYObjekt für die Visualisierung enthalten.Beispiel:
return {outputSignal: result, "galy": galy}- rtype:
dict
- stop(data)
Wird aufgerufen, wenn das Modul beendet wird.
Ziel ist es, bei Bedarf Ressourcen freizugeben oder interne Zustände zurückzusetzen.
Hinweise
In vielen Fällen ist keine spezielle Bereinigung notwendig.
Bemerkung
Diese Methode ist optional, kann aber wichtig werden, wenn externe Ressourcen (z. B. Modelle, Streams) verwendet werden.
- param data:
Letzte übergebene Daten des Frameworks.
- type data:
dict
TrailMarker
- class GestureRecognition.modules.trailmarker.TrailMarker(outputSignal='trailmarker')
Bases:
ModuleModul zum Zeichnen einer Spur anhand der Bewegung eines Fingers.
Die Position eines bestimmten Finger-Landmarks wird über mehrere Frames hinweg gespeichert. Aus diesen Punkten kann anschließend eine Linie erzeugt werden, die den Bewegungsverlauf des Fingers visualisiert.
Ziel ist es, die Verarbeitung der Landmark-Daten sowie die Verwaltung eines Zustands über mehrere Frames hinweg selbst zu implementieren.
Konstruktor des Moduls.
Ziel ist es, das Modul beim Framework korrekt zu registrieren.
Hinweise
Ein Modul muss definieren, welche Signale es empfangen möchte.
Diese werden über
inputSignalsangegeben.Nur Signale, die hier subscribed werden, erscheinen später im
dataDictionary der Methodenstart()undstep().
Für dieses Modul werden unter anderem folgende Signale benötigt:
config: Systemkonfigurationdetector: Ergebnisse der Handdetektion
Zusätzlich muss ein Output-Schema definiert werden.
Output Schema
Da dieses Modul keine eigenen Daten erzeugt, reicht beispielsweise:
outputSchema={"type": "object", "properties": {outputSignal: {}}}Bemerkung
Die Basisklasse
Moduleerwartet beim Aufruf vonsuper().__init__unter anderem:inputSignalsoutputSchemanamedes Moduls
- param outputSignal:
Name des erzeugten Output-Signals.
- type outputSignal:
str, optional
- start(data)
Initialisierung des Modulzustands.
Diese Methode wird einmal beim Start des Moduls ausgeführt.
Ziel ist es, alle Variablen vorzubereiten, die während der Laufzeit des Moduls benötigt werden.
Hinweise
Lese benötigte Parameter aus der Konfiguration.
Bestimme beispielsweise, welcher Finger verfolgt werden soll.
Lege eine Datenstruktur an, in der mehrere vergangene Fingerpositionen gespeichert werden können, z.B.
collections.dequemit einer maximalen Größe.Diese Historie wird später verwendet, um eine Spur zu zeichnen.
Speichere aus der Konfiguration weitere benötigte Parameter, z.B. Finger-Index, maximale Anzahl verlorener Frames oder Webcam-Parameter.
Für den Zugriff auf verschachtelte Konfigurationswerte kann
get_nested_key()verwendet werden.
Tipp
Eine
dequeist ideal für Trajektorien, da sie effizient alte Punkte entfernt.Bemerkung
Initialisiere hier nur Zustände und Parameter, keine eigentliche Verarbeitung.
- param data:
Eingabedaten des Frameworks. Enthält unter anderem das Signal
config.- type data:
dict
- returns:
Ein leeres Dictionary.
- rtype:
dict
- step(data)
Verarbeitung eines einzelnen Frames.
Ziel ist es, die aktuelle Position eines Fingers zu bestimmen, diese Position in einer Trajektorie zu speichern und daraus eine visuelle Spur zu erzeugen.
Hinweise
Greife auf das
detectorSignal zu, um erkannte Hände und deren Landmarken zu erhalten.Falls keine Hand erkannt wurde, kann beispielsweise ein Zähler für verlorene Frames erhöht werden.
Wird eine Hand erkannt, kann die Landmarke des gewünschten Fingers extrahiert werden.
Die Position kann zur bestehenden Trajektorie hinzugefügt werden.
Zwischen aufeinanderfolgenden Punkten können Linien gezeichnet werden, um eine Spur darzustellen.
Für die Visualisierung kann
line()derGALYverwendet werden.
Tipp
- Typischer Ablauf:
Landmark extrahieren
Punkt speichern
Trajektorie aktualisieren
Linien zwischen Punkten zeichnen
Warnung
- Achte darauf, dass:
keine leeren Landmark-Daten verarbeitet werden
die Trajektorie nicht unendlich wächst
verlorene Frames sinnvoll behandelt werden
- param data:
Enthält unter anderem:
detector: erkannte Hände und Landmarkenconfig: Systemkonfiguration
- type data:
dict
- returns:
Um die Zeichenoperationen auszuführen, sollte ein
GALYObjekt zurückgegeben werden.Beispiel:
return { ..., "galy": galy}- rtype:
dict
- stop(data)
Wird aufgerufen, wenn das Modul beendet wird.
Ziel ist es, bei Bedarf Ressourcen freizugeben oder interne Zustände zurückzusetzen.
Hinweise
In vielen Fällen ist keine spezielle Bereinigung notwendig.
Bemerkung
Diese Methode ist optional, kann aber sinnvoll sein, wenn Zustände explizit zurückgesetzt werden sollen.
- param data:
Letzte übergebene Daten des Frameworks.
- type data:
dict
Preprocessor
- class GestureRecognition.modules.preprocessor.Preprocessor(outputSignal='preprocessor')
Bases:
ModuleModul zur Vorverarbeitung von Fingertrajektorien.
Dieses Modul verarbeitet die vom Handdetektor gelieferten Landmarken und extrahiert daraus die Bewegung eines bestimmten Fingers über mehrere Frames hinweg.
Ziel ist es, eine Trajektorie zu sammeln, diese zu normalisieren und anschließend als Eingabe für nachfolgende Module bereitzustellen.
Konstruktor des Moduls.
Ziel ist es, das Modul beim Framework korrekt zu registrieren.
Hinweise
Ein Modul muss definieren, welche Signale es empfangen möchte.
Diese werden über
inputSignalsangegeben.Nur Signale, die hier subscribed werden, erscheinen später im
dataDictionary der Methodenstart()undstep().
Für dieses Modul werden unter anderem folgende Signale benötigt:
config: Systemkonfigurationdetector: Ergebnisse der Handdetektion
Zusätzlich muss ein Output-Schema definiert werden.
Output Schema
Das Modul erzeugt ein Signal mit dem Namen
preprocessor.Dieses Signal enthält entweder eine normalisierte Trajektorie oder
None, falls noch nicht genügend Daten gesammelt wurden.Beispiel:
outputSchema={"type": "object", "properties": {outputSignal: {}}}Bemerkung
Die Basisklasse
Moduleerwartet beim Aufruf vonsuper().__init__unter anderem:inputSignalsoutputSchemanamedes Moduls
- param outputSignal:
Name des erzeugten Output-Signals.
- type outputSignal:
str, optional
- start(data)
Initialisierung des Modulzustands.
Diese Methode wird einmal beim Start des Moduls ausgeführt.
Ziel ist es, alle benötigten Parameter aus der Konfiguration zu lesen und interne Datenstrukturen vorzubereiten.
Hinweise
Lese relevante Parameter aus der Konfiguration, z.B. den zu verfolgenden Finger.
Lege eine Datenstruktur an, um mehrere vergangene Fingerpositionen zu speichern, z.B.
collections.dequemit einer maximalen Größe.Speichere außerdem Parameter wie die maximale Anzahl verlorener Frames oder die minimale Anzahl benötigter Punkte.
Zum Zugriff auf verschachtelte Konfigurationswerte kann
get_nested_key()verwendet werden.
Tipp
Eine
dequemit fester Länge ist ideal für Trajektorien, da alte Punkte automatisch verworfen werden.Bemerkung
- Trenne klar zwischen:
Initialisierung von Parametern (
start)Verarbeitung von Daten (
step)
- param data:
Eingabedaten des Frameworks. Enthält unter anderem das Signal
config.- type data:
dict
- returns:
Ein leeres Dictionary.
- rtype:
dict
- step(data)
Verarbeitung eines einzelnen Frames.
Ziel ist es, eine Fingerposition aus den erkannten Landmarken zu extrahieren und diese in einer Trajektorie zu speichern.
Hinweise
Greife auf das
detectorSignal zu, um erkannte Handlandmarks zu erhalten.Falls keine Hand erkannt wurde, sollte ein interner Zähler für verlorene Frames erhöht werden.
Wird eine Hand erkannt, kann die Landmarke des gewünschten Fingers extrahiert werden.
Die Position dieses Fingers kann anschließend in einer Trajektorie gespeichert werden.
Sobald genügend Punkte gesammelt wurden, kann die Trajektorie weiterverarbeitet werden.
Mögliche Verarbeitungsschritte:
Umwandlung der gespeicherten Punkte in ein
numpy.ndarrayBerechnung eines Zentrums der Trajektorie
Skalierung oder Normalisierung der Punkte
Tipp
- Arbeite schrittweise:
Prüfen, ob Landmarken vorhanden sind
Fingerposition extrahieren
In Trajektorie speichern
Optional normalisieren
Warnung
- Achte darauf, dass:
genügend Punkte vorhanden sind
keine fehlerhaften Frames verarbeitet werden
verlorene Frames sinnvoll behandelt werden
- param data:
Enthält unter anderem:
detector: erkannte Hände und Landmarkenconfig: Systemkonfiguration
- type data:
dict
- returns:
Gibt entweder
Noneoder eine normalisierte Trajektorie zurück.Beispiel:
return {outputSignal: trajectory}- rtype:
dict
- stop(data)
Wird aufgerufen, wenn das Modul beendet wird.
Ziel ist es, bei Bedarf interne Zustände zurückzusetzen oder Ressourcen freizugeben.
Hinweise
In vielen Fällen ist keine spezielle Bereinigung notwendig.
Bemerkung
Diese Methode ist optional, kann aber relevant werden, wenn interne Zustände explizit zurückgesetzt werden sollen.
- param data:
Letzte übergebene Daten des Frameworks.
- type data:
dict