Ich habe eine Android-Anwendung, die Gestenkoordinaten erhält (3 Achsen - x, y, z). Ich muss sie mit den Koordinaten vergleichen, die ich in meinem DB habe und feststellen, ob sie gleich sind oder nicht.
Ich muss auch etwas Toleranz hinzufügen, da Beschleunigungsmesser (Gerät, das Gesten erfasst) sehr empfindlich ist. Es wäre einfach, aber ich möchte auch z.B. "großer Kreis" in der Luft gezeichnet, wie "kleiner Kreis" in der Luft gezeichnet. was bedeutet, dass es verschiedene Werte geben würde, aber die Struktur des Graphen wäre gleich, oder?
Ich habe gehört, dass man Graphenwerte in Bits übersetzen und dann vergleichen soll. Ist das der richtige Ansatz? Gibt es eine Bibliothek für einen solchen Vergleich?
Bisher habe ich es nur hart codiert und alle meine Anforderungen außer dem letzten (großer Kreis gegen kleiner Kreis) abgedeckt.
Mein Code jetzt:
%Vor%BEARBEITEN:
Ich habe JGraphT
gefunden, es könnte funktionieren. Wenn Sie schon etwas darüber wissen, lassen Sie es mich wissen.
EDIT2:
Sehen Sie sich diese Bilder an, sie sind die gleiche Geste, aber eine ist langsamer als die andere.
Ich habe keine Bilder mit der gleichen Geste aufgenommen, bei denen einer kleiner als der andere wäre, könnte das später hinzufügen.
Ich habe eine Java-Implementierung des Dynamic Time Wrapping
-Algorithmus verwendet. Die Bibliothek heißt fastDTW.
Unglücklicherweise unterstützen sie es nicht mehr, obwohl ich einen Nutzen dafür gefunden habe. Ссылка
Ich kann mich jetzt nicht erinnern, aber ich glaube, ich habe dieses hier benutzt und es selbst zusammengestellt: Ссылка
Wenn Ihre Liste von Gesten komplex ist, würde ich vorschlagen, ein neurales Netzwerk zu trainieren, das die Gesten basierend auf den von Ihnen erwähnten Graphwert-Bits klassifizieren kann. Die Aufgabe ist der Klassifizierung von handschriftlichen Ziffern sehr ähnlich, für die es viele Ressourcen im Netz gibt.
Der andere Ansatz wäre, die Form der Geste mathematisch zu erraten, aber ich bezweifle, dass sie nützlich sein wird, wenn man die Toleranz des Beschleunigungsmessers und die Tatsache berücksichtigt, dass Benutzer keine genauen Formen zeichnen.
(a) wandeln Sie Ihre 3D-Koordinaten in 2D-Ebene um. Verwenden Sie Matrixtransformationen .
(b) normalisieren Sie Ihre Gestenskala - wiederum mit Matrixtransformationen
(c) Normalisieren Sie die Anzahl der Punkte oder verwenden Sie die Interpolation im nächsten Schritt.
(d) Berechnen Sie den Unterschied zwischen Ihrer gespeicherten Geste und der aktuellen Geste (c) als
%Vor%Wenn der Unterschied unter Ihrer vordefinierten Genauigkeit liegt - Gesten sind gleich.
Tags und Links java