STATISCHE GESTENERKENNUNG AUF EINEM SMARTPHONESebastian Linder, Jan Menges, Markus Jeckle
Inhalt1. Projektübersicht2. Gestenerkennung3. OpenCV4. Android5. OpenCV auf Android6. Rock, Paper, Scissor (App)7. Lessons learned
1. Projektübersicht Anwendung auf Smartphone, die statische
Gesten (z. B. "Daumen hoch" für OK) erkennt Teil der Arbeit ist die Auswahl einer passenden
Plattform (Android, Windows Mobile, Symbian, iPhone OS)
Verwendung passender Bildverarbeitungsalgorithmen (OpenCV)
1.1 Welche Anwendung?• Wieso sollte der Nutzer dazu Gesten benutzen?Heimsteuerung
(Jalousien/Radio/Garage)
• deutlich schneller und bequemer per TouchscreenGalerie-Steuerung
• hoher Akkuverbrauch durch Dauereinsatz der Kamera• Umsetzung erfordert Kommunikation Smartphone
AutoradioAuto-Radio-Steuerung
• als Showcase/Proof-of-concept geeignet, da Gesten Bestandteil des Spiels sindStein-Papier-Schere Spiel
1.2 Welche Plattform?• Einarbeitung in Objective-C zu aufwendig
& langwierigiOS• veraltete Plattform => fehlende
UnterstützungWindows Mobile
• veraltete Plattform• Smartphones mit Symbian?Symbian• große Community• Support (SDK)• intern seit OpenCV2.2 unterstützt
(theoretisch)Android
2. Gestenerkennung
• Form der Hand ausschlaggebend, nicht die Bewegung
• Geringere Leistungsanforderung, daher für Smartphones eher geeignet
Statische Geste
• Bewegung ausschlaggebend• Hohe Leistungsanforderung (Microsoft Kinect)
Dynamische Geste
2.1 Methoden I Stereoskopie
Wiedergabe von Bildern mit räumlichem Eindruck der Tiefe („3D“)
Bewegungsmessung: 3D-Position + 3D-Veränderung = 6D-Vision => dyn. Gesten
2.1 Methoden II Histogramm
Allgemein: Säulendiagramm gibt die Häufigkeit der skalierter Merkmale wieder
Im Bildbereich: Darstellung Tonwerte, z.B. Helligkeitsverteilung
Gestenerkennung mittels Histogram of Oriented Gradients (HOG) möglich: Häufigkeitsverteilung von Steigungen
2.1 Methoden III Template-Matching / Bildvergleich
Suche nach den Positionen, an denen das Template zu finden ist
einfacher Algorithmus Links oben beginnend Pixel für Pixel
nach rechts/unten und den Wert (zwischen 0 & 1: 0 = identisch, 1 = keine Ähnlichkeit) in eine Matrix schreiben
Problem: Rotation / Helligkeitsänderung
3. OpenCV freie Bibliothek („Open“) mit Algorithmen für
Bildverarbeitung und maschinelles Sehen („Computer Vision")
geschrieben in C/C++ läuft auf Androd, FreeBSD, iOS, Linux, MacOS, Windows &
OpenBSD2006Version 1.0
2009Version 2.0
2011Version 2.2 (Android-Unterstützung)
3.1 Anwendungen von OpenCV
Segmentierung Gesichtserkennung Gestenerkennung Bewegungserkennung Objekterkennung
4. Android von Google entwickeltes OS für Smartphones und Tablets SW-Entwicklung sehr gut dokumentiert (http://developer.android.com) C++ Programmierung mittels NDK (NativeDK)
CPU-intensive Anwendungen Grafik-Anwendungen Spiele (OpenGL ES 2.0)
Java-Programmierung mittels SDK (SoftwareDK) ausführbar in Dalvik Virtual Machine Integration in Eclipse mittels ADT-Plugin (Android Development Tools)
Visual Layout Editor: GUI-Builder XML-Editoren DDMS (Dalvik Debug Monitor Server)
4.1 Visual Layout Editor
4.2 DDMS
5. OpenCV auf Android I“Android is awesome, and so is OpenCV, so wouldn't it be awesome if they could work together? Well they can, and its now officially supported in OpenCV.”
eigener Trunk im OpenCV-Repository mittels JNI (Java Native Interface) umgesetzt Unsere Erfahrung: Kompilieren & Cross-Kompilieren erfolgslos
Immer wieder neue Kompilier- & Linkerfehler Vorgehen nach diversen Anleitungen führte nicht zum Erfolg (statische
Shared Objects)
5. OpenCV auf Android II
5.1 JavaCV
Wrapper für häufig genutzte CV-Bibliotheken, darunter OpenCV geschrieben von Samuel Audet, der auch Support leistet bietet vorkompiliertes OpenCV2.2 für Android 2.2 und ARM5/7
an Dokumentation sehr dünn (Quick Start Guide) teilweise undokumentierte Unterschiede im Funktionsaufruf
(z.B. Parameterzahl)
6. Rock, Paper, Scissor Rock, Paper, Scissor (Stein, Papier, Schere) als Proof-of-Concept
der Gestenerkennung auf Smartphone
Benutzer zeigt die
Geste
Smartphone erkennt
diese
Computergeste wird generiert
Vergleich der beiden
Gesten
Gewinner erhält Punkt
6.1 Verlauf der Entwicklung1.
Prototyp
(natives
OpenCV auf
Windows)
2. Prototyp (JavaCV auf
Windows)
JavaCV
auf Android
RPS-SpielGestenerkennung
Konvertierungen
Segmentierung
Konturenfindung
Zuschneide
n
Template-Matching
6.1 Ablauf der Gestenerkennung I
Konvertierungen
Segmentierung
Konturenfindung
Zuschneide
n
Template-Matching
1. Bild kommt als YUV NV21 von der Kamera
2. Konvertierung in RGB, um in OpenCV weiter zu verarbeiten
3. Konvertierung in den HSV-Farbraum, um die zu segmentieren ohne auf Lichtverhältnisse Rücksicht nehmen zu müssen
6.1 Ablauf der Gestenerkennung II
6.1 Ablauf der Gestenerkennung III
Konvertierungen
Segmentierung
Konturenfindung Zuschneiden Template-
Matching
1. „Smoothing“ (Verwischen) des Bildes, Dilatation (expandieren) & Erosion (schrumpfen)
2. Farbmessung von 5 Punkten im mittleren Bereich des Kamerabildes
3. Ist die gemessene Durchschnittsfarbe Hautfarben?4. Wenn ja: Segmentierung im HS(V)-Farbraum mit
Durchschnittsfarbe (+- delta), Dilatation & Erosion
6.1 Ablauf der Gestenerkennung IV
Konvertierungen
Segmentierung
Konturenfindung Zuschneiden Template-
Matching
1. Alle Konturen werden erkannt2. Größte Fläche/Kontur (Hand) im Bild wird
gesucht
6.1 Ablauf der Gestenerkennung V
Konvertierungen
Segmentierung
Konturenfindung Zuschneiden Template-
Matching
1. Die größte Kontur wird ausgeschnitten („Region of interest“), und dem Template-Matching übergeben
2. Auswahl der in Frage kommenden Geste(n) (Stein Papier/Schere) aufgrund des Seitenverhältnisses
3. Zuschneiden des Templates, so dass es mindestens einmal komplett in das Bild passt
6.1 Ablauf der Gestenerkennung VI
Konvertierungen
Segmentierung
Konturenfindung Zuschneiden Template-
Matching
1. Template-Matching füllt Matrizen (für jede untersuchte Geste eine) mit den Matching-Werten, daraus suchen wir uns jeweils das Minimum (= höchste Identität)
2. Das kleinste Minimum ist die erkannte Geste, sofern sie einen Schwellwert nicht überschreitet
7. Lessons learned I Eine sinnvolle Anwendung der Gestenerkennung auf Smartphones ist kaum
zu finden Bedienung mittels großer Touchscreens oft komfortabler hoher Akkuverbrauch durch Kamera schließt Dauernutzung aus
OpenCV sehr mächtige Bibliothek, welche gut dokumentiert ist und viel Anwendung im „Augmented Reality“-Bereich findet
Android Trunk jedoch noch in den Kinderschuhen, jedoch wird daran weiter gearbeitet
Android-Entwicklung einfach zu erlernen sehr gute Dokumentation viele Communities & Tutorials Design mittels Layout Editor anfangs kompliziert, nach Eingewöhnungszeit aber nutzbar
7. Lessons learned II Gestenerkennung an sich gut erforscht, jedoch stark von
Lichtverhältnissen abhängig Template-Matching Methode nicht zuverlässig genug
Gesten sehen nie gleich aus (keine Muster) Rotation nicht berücksichtigt (implementierbar, aber teuer) HOGs vermutlich besserer Ansatz, jedoch höherer Aufwand
Sinnvolles Themengebiet für weitere Projektarbeiten Netzwerkkomponente würde RPS mehr Sinn verleihen unter Android aufgrund der Performance eventuell mittels NDK
Vielen Dank für die Aufmerksamkeit!
Statischen Gestenerkennung auf einem Smartphone