Statische Gestenerkennung auf einem Smartphone

Download Report

Transcript Statische Gestenerkennung auf einem Smartphone

STATISCHE
GESTENERKENNUNG AUF
EINEM SMARTPHONE
Sebastian Linder, Jan Menges, Markus Jeckle
Inhalt
1.
2.
3.
4.
5.
6.
7.
Projektübersicht
Gestenerkennung
OpenCV
Android
OpenCV auf Android
Rock, Paper, Scissor (App)
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?
• deutlich schneller und bequemer per Touchscreen
• hoher Akkuverbrauch durch Dauereinsatz der Kamera
• Umsetzung erfordert Kommunikation Smartphone  Autoradio
• als Showcase/Proof-of-concept geeignet, da Gesten Bestandteil
des Spiels sind
1.2 Welche Plattform?
• Einarbeitung in Objective-C zu aufwendig &
langwierig
• veraltete Plattform => fehlende Unterstützung
• veraltete Plattform
• Smartphones mit Symbian?
• große Community
• Support (SDK)
• intern seit OpenCV2.2 unterstützt (theoretisch)
2. Gestenerkennung
Statische Geste
• Form der Hand ausschlaggebend, nicht die Bewegung
• Geringere Leistungsanforderung, daher für Smartphones eher
geeignet
Dynamische Geste
• Bewegung ausschlaggebend
• Hohe Leistungsanforderung (Microsoft Kinect)
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 &
OpenBSD
2006
Version 1.0
2009
Version 2.0
2011
Version 2.2
(AndroidUnterstü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
6.1 Verlauf der Entwicklung
1. Prototyp
(natives
OpenCV auf
Windows)
Gestenerkennung
2. Prototyp
(JavaCV auf
Windows)
JavaCV auf
Android
RPS-Spiel
6.1 Ablauf der Gestenerkennung I
Konvertierungen
Segmentierung
Konturenfindung
Zuschneiden
TemplateMatching
6.1 Ablauf der Gestenerkennung II
Konvertierungen
Segmentierung
Konturenfindung
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
Zuschneiden
TemplateMatching
6.1 Ablauf der Gestenerkennung III
Konvertierungen
Segmentierung
Konturenfindung
Zuschneiden
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
TemplateMatching
6.1 Ablauf der Gestenerkennung IV
Konvertierungen
Segmentierung
Konturenfindung
1.
Alle Konturen werden erkannt
2.
Größte Fläche/Kontur (Hand) im Bild wird gesucht
Zuschneiden
TemplateMatching
6.1 Ablauf der Gestenerkennung V
Konvertierungen
Segmentierung
Konturenfindung
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
Zuschneiden
TemplateMatching
6.1 Ablauf der Gestenerkennung VI
Konvertierungen
Segmentierung
Konturenfindung
Zuschneiden
TemplateMatching
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
Statischen Gestenerkennung auf einem Smartphone
Vielen Dank für die Aufmerksamkeit!