Gestenerkennungsalgorithmus basierend auf diskreten Punkten

8

Ich versuche das Problem zu lösen, eine menschliche Geste mit einer bekannten Geste zu verbinden. Die vom Menschen erzeugte Geste wird durch eine Folge von Punkten dargestellt, die in einen Pfad interpoliert und mit dem bestehenden Pfad verglichen werden müssen. Das Bild unten zeigt, was ich zu vergleichen versuche

Können Sie mir bitte helfen, mich mit Ressourcen oder Konzepten in die richtige Richtung zu lenken, die ich einlesen kann, um einen Algorithmus zu erstellen, der diesen beiden Pfaden entspricht? Ich habe keine Erfahrung damit, bevor ich irgendwelche Einblicke schätze.

    
Atomix 29.12.2013, 01:54
quelle

1 Antwort

5

Empfangseingang

Messen Sie die Eingabe in einem Intervall. Alle xx Millisekunden messen Sie die Koordinaten der Hand / des Fingers / Stylus des Benutzers.

Speichern von Mustern und Eingabe

Muster (erwartete Eingabe)

Ändern Sie das Muster. Es ist derzeit eine kontinuierliche "Funktion", aber die Messung als solche ist schwierig. Verwenden Sie diskrete Punkte in einem bestimmten Intervall. Dieses Intervall kann sehr kurz sein, abhängig davon, wie genau Sie Gesten benötigen. Eigentlich sollte es sehr kurz sein; Je mehr Punkte zu vergleichen sind, desto besser (ich erkläre das im nächsten Abschnitt etwas besser).

Eingabe (vom Benutzer erhalten)

Wenn die Eingabe gemessen wird, muss das Eingabemessintervall kurz genug sein, damit jedes empfangene Paar von Eingabepunkten nah genug ist, um es mit den erwarteten Punkten zu vergleichen.

Stellen Sie sich vor, der Benutzer führt eine Geste sehr schnell aus (und schließt sie in der Zeit ab, in der Ihr Eingabe-Leser nur drei Bilder liest). Das Muster und die Eingabe können nicht zuverlässig verglichen werden:

Um dies zu vermeiden, muss Ihr Eingabe-Reader ein relativ kurzes Intervall haben. Dies ist jedoch wahrscheinlich kein großes Problem, da die meisten Hardware sogar die schnellsten menschlichen Gesten lesen kann.

Zurück zu Mustern: Sie sollten immer detailliert genug sein, um mehr Punkte als jede mögliche Eingabe zu enthalten. Mehr erwartete Punkte ermöglichen eine bessere Genauigkeit. Wenn sich ein Benutzer langsam bewegt, hat die Eingabe mehr Punkte. Wenn sie sich schnell bewegen, hat die Eingabe weniger.

Bedenken Sie Folgendes: Wenn Sie eine einzelne Geste ausführen, erhalten Sie halb so viele Eingabe-Frames, wie das Muster enthält. Der Benutzer hat sich mit einer "normalen" Geschwindigkeit bewegt. Um den Algorithmus zu vereinfachen, können Sie Ihr Muster also um den Faktor 2 verkleinern und dann die Eingabekoordinaten direkt mit den Musterkoordinaten vergleichen.

Diese Methode ist einfacher als die Alternative (siehe nächster Abschnitt).

Muster "Dichte" (Koordinatenfrequenz)

Wenn Sie eine kleine Anzahl von erwarteten Punkten haben, müssen Sie Approximationen vornehmen, um die Eingabe anzupassen.

Hier ist ein "extremes" Beispiel, aber es beweist das Konzept. Gegeben dieses Muster und Eingabe:

Punkt 3r kann nicht zuverlässig mit Punkt 2 oder Punkt 3 verglichen werden. Sie müssten also eine Funktion der Punkte 2, 3 und 3r verwenden, um festzustellen, ob 3r auf dem richtigen Pfad ist. Betrachten Sie nun die gleiche Eingabe, aber wo das Muster eine höhere Dichte hat:

Sie müssen jetzt keine Kompromisse eingehen, da 3r im Muster der Geste im Wesentlichen definitiv ist. Eine leichte Verringerung der Dichte des Musters bewirkt, dass die Eingabe sehr gut übereinstimmt.

Positionierung

Relative Positionierung

Anstatt absolute Positionen zu vergleichen (z. B. auf einem Touchscreen), möchten Sie wahrscheinlich, dass die Geste irgendwo in einer Ebene des Raums erlaubt ist. Zu diesem Zweck müssen Sie den Startpunkt der Eingabe mit einem Koordinatensystem verknüpfen.

Normalisierung

Um benutzerfreundlich zu sein, lassen Sie Gesten in verschiedenen Größen zu. Sie möchten Rohdaten nicht vergleichen, da die Größe der Ebene der Eingabe wahrscheinlich nicht mit der Größe der Ebene des Musters übereinstimmt.

Normalisieren Sie die Eingabe in x- und y-Richtung, um sie an die Größe Ihres Musters anzupassen. Halten Sie nicht das Seitenverhältnis fest.

  1. Verweisen Sie die Eingabe auf ein Koordinatensystem gemäß dem vorherigen Aufzählungszeichen
  2. Finden Sie den größten horizontalen und vertikalen Abstand zwischen zwei beliebigen Eingabe Punkten (nennen Sie sie RecMaxH und RecMaxV )
  3. Finden Sie den größten horizontalen und vertikalen Abstand zwischen zwei beliebigen Muster Punkten (nennen Sie sie ExpMaxH und ExpMaxV )
  4. Multiplizieren Sie alle x-Koordinaten der Eingabepunkte mit ExpMaxH/RecMaxH
  5. Mehrere y-Koordinaten aller Eingabepunkte nach ExpMaxV/RecMaxV

Sie haben jetzt zwei ähnlichere Punkte, die verglichen werden können. Die Normalisierung kann viel detaillierter sein; Zum Beispiel könnten Sie Sätze von 3 Punkten gleichzeitig normalisieren, um unglaublich ähnliche Bilder zu erhalten (aber Sie müssten dies wahrscheinlich für jedes Muster tun, dann vergleichen Sie die Summe aller Unterschiede, um das wahrscheinlichste übereinstimmende Muster zu finden).

Ich empfehle, das Muster aller Gesten als ein Diagramm derselben Größe zu speichern; das reduziert die Berechnung, wenn die Nähe der Eingabe zu möglichen Musterübereinstimmungen gemessen wird.

Wann soll der Eingang gemessen werden?

Benutzergesteuert

Stellen Sie sich eine Schaltfläche vor, die beim Anklicken / Aktivieren dazu führt, dass Ihr Programm beginnt, Eingaben zu messen. Dies wäre vergleichbar mit Googles Sprachsuche, die nicht ständig aufzeichnet und sucht; Stattdessen sagen Sie "Ok Jarvis" oder klicken Sie auf das Symbol für das handliche Mikrofon und beginnen Sie Ihre Frage zu sprechen.

Vorteile:

  • Vereinfacht den Algorithmus
  • Verhindert, dass Benutzer unbeabsichtigt ein Ereignis auslöst. Stellen Sie sich vor, jedes Wort, das Sie gesprochen haben, wurde analysiert und im Rahmen einer Suchanfrage an Google gesendet. Manchmal willst du einfach nichts machen.

Nachteile:

  • Weniger benutzerfreundlich. Der Benutzer muss sich aus dem Weg gehen, um die Aufnahme für Gesten auszulösen.

Wenn Sie zum Beispiel eine Gestensuche (lächerliches Beispiel) schreiben, ist dies wahrscheinlich die bessere Methode, diese zu implementieren. Niemand möchte jede Bewegung, die er interpretiert, als eine Aktion in Ihrer Anwendung interpretieren. Wenn Sie jedoch ein Kinect-ähnliches oder gestenbasiertes Spiel schreiben, möchten Sie wahrscheinlich ständig aufzeichnen und nach Gesten suchen.

Konstante

Ihr Programm zeichnet die Gestenkoordinaten ständig im angegebenen Intervall auf (dies könnte auf "Datensätze bei Bewegung" reduziert werden, ansonsten werden keine Koordinaten gespeichert). Sie müssen eine Entscheidung treffen: Wie viele "Frames" werden Sie aufnehmen, bis Sie feststellen, dass die aktuell gespeicherte Bewegung keine erkannte Geste ist?

Speichern Sie Koordinaten in einem Puffer: eine Warteschlange 1.5 oder 2 (um vorsichtig zu sein) mal so lang wie die größte Anzahl von Bildern, die Sie aufnehmen möchten.

  • Sobald Sie feststellen, dass in diesem Puffer eine Sequenz von Frames vorhanden ist, die einem Muster entsprechen, führen Sie das Ergebnis dieser Geste aus und löschen Sie die Warteschlange.

  • Wenn es die Möglichkeit gibt, dass die nächste Geste eine "Option" für die neueste Geste ist, notieren Sie den Anwendungsstatus als "derzeit wartend auf Option für

Trojan 29.12.2013, 04:18
quelle