Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

de:universeller_bayescher_bilderkenner:gesten

Gestenerkennung

Für das Interdisziplinäre Projekt „Barrierefreier Schrank“ sollte für eine bessere Bedienung die Möglichkeit einer Gestensteuerung getestet werden. Die Unterscheidung der Gesten sollte anhand der Anzahl der gezeigten Finger erfolgen.

Ablauf der Gestenerkennung
?2

Die Hand vom Hintergrund trennen

Nach Hautfarbe filtern
Hierfür wurde die Vorgehensweise vom Sensor für Hautfarben übernommen.
Tests mit den allgemeinen HSV-Werten für die Hautfarbe ergaben jedoch eine schlechte Segmentierung zwischen Hintergrund und Hand. Deswegen wurde versucht die HSV-Werte adaptiv per Trackbar-Funktion individuell an die Hautfarbe einzustellen.

?2

Selbst dies ergab aber keine perfekte Segmentierung der Handkonturen, wie sie für ein gutes Ergebnis des Verfahrens wünschenswert wären. Es ist festzustellen das auch eine Hand eine Objekt ist das aus sehr vielen verschiedenfarbigen Elementen zusammengesetzt ist, möchte man eine ideale Kontur erhalten wäre eine Einlernphase für den User notwendig.

Hintergrundsubtraktion
Bei der Hintergrundsubtraktion wird erst für n-Bilder beim Aufruf der Funktion cvBGCodeBookUpdate ein Hintergrundbild erstellt, alternativ kann eine Videodatei des Hintergrundes benutzt werden. Danach wird über die Funktion cvBGCodeBookDiff der aufgenommene Hintergrund von einer Änderung des Hintergrundes als Vordergrund segmentiert. Mit dieser Methode konnte eine viel bessere Kontur der Hand segmentiert werden. Jedoch hatte das Verfahren das Problem das Schatten und Lichtänderungen ebenfalls segmentiert werden.

?2

Eine kleine Abhilfe hierfür war es im HSV-Kanal des Original-Bildes beim Hue-Kanal nach Werten zwischen 0-20 filtern, die grob im Berreich der Hautfarbe liegen. Bevor ein Vergleich mit dem aufgenommenen Hintergrundbild erfolgt.

?2

So können Schatteneffekte von der Segmentierung ausgeschlossen werden.

?2

Sich stark wechselnde Hintergründe, wie vor Fenstern, stellen trotzdem ein Problem der Methode dar.

IR-Tiefenbild
Eine andere Möglichkeit wäre es eine Kamera zu verwenden die mittels Infrarot- Sender &-Empfänger ein Tiefenbild anhand einer Triangulation erzeugen kann. Legt man im Programm nun fest das die Handgeste auf einer bestimmten Entfernung stattfindet, kann hiermit auch eine gute Segmentierung erfolgen. Zwecks fehlender Hardware konnte diese Methode nicht getestet werden. Ein zuverlässiges System im Bereich Gestenerkennung per Tiefenbild ist aber zum Beispiel die Kinect-Kamera von Microsoft. Mit der Kinect ist es möglich ein 11bit(2028 Werte) Tiefenbild zu erzeugen. Die Kinect erzeugt das Tiefenbild mittels Light Coding, indem ein Punktmuster aus Infrarotlichtpunkten ausgesendet wird und am CMOS Infrarotempfänger wieder decodiert und hieraus die Tiefeninformation mittels Triangulation gewonnen wird.

Funktionsweise des Kinect Light Coding

Histogramm
Eine andere Möglichkeit ist es die Geste hinter einem monotonen Hintergrund zum Beispiel einem komplett grünen Hintergrund aufzunehmen. In diesem Fall kann durch einen Schwellwert im Histogramm auch eine gute Handkontur erzeugt werden. Dies hat jedoch den Nachteil das man in der Realität selten monotone Hintergründe vorfindet.

Ergebnis
Nach verschiedenen Test und der Recherche der Literatur, wurde eine Kombination aus Hintergrundsubtraktion und HSV-Schwellwert im Farbbereich menschlicher Haut gestestet. Folgende Arbeit 1 kam ebenfalls zum Ergebnis das die Filterung nach HSV-Farben für eine Gestenerkennung ungeeignet ist. Der aktuelle Stand der Technik geht in die Richtung Gestenerkennung per IR-Tiefenbild. Beispiel hierfür sind die Microsoft Kinect oder das neue Microsoft Digits.

Das Adobe Flash Plugin wird benötigt, um diesen Inhalt anzuzeigen.

Kanten detektieren

Das Ergebnisbild wird nun einem Filter zur Rauschunterdrückung übergeben und als nächstes müssen die Kanten als der Rand der Hand bestimmt werden. Dies geschieht mittels cvFindContours-Funktion, die Funktion bildet einen Kettencode (Richtungsinformationen) von zusammenhängenden Pixelblöcken aus unserem Binärbild. Die Funktion stellt hierfür verschiedene Methoden bereit unter anderem den weit verbreiteten Freemann-Code. Die Funktion speichert die Informationen der Kanten nun in einer Sequenz.

Umfang bestimmen

Aus den Richtungsinformationen des Kettecodes der Kontur kann nun mittels der cvMoments-Funktion der Umfang bestimmt werden. Dies ergibt dann bereits das erstes Merkmal der Klassifizierung.

Konvexe Hülle

Aus den Konturen müssen nun zusammenhängende Linien berechnet werden. Hierfür wird die Kontur auf Abrundungen untersucht mittels cvApproxPoly. Dadurch erhalten wir für unsere Kontur Eckpunkte. Mit der Funktion cvConvexHull2 wird aus den Eckpunkten der Kontur nun die Konvexe Hülle berechnet.

Definition der Konvexen Hülle:

Nehmen wir die Pixel p unserer Handkontur als Menge, dann müssen die Strecken aller Pixel p nach p eine Teilmenge innerhalb der Umrandung r sein.

∀p∈r
[p,p]⊆r

Des Weiteren muss r minimal sein.
Die Berechnung der Konvexen Hülle erfolgt nach dem Muster das die Konvexe Hülle ein Polygon der Pixel p unserer Handkontur ergibt. Wenn diese Umrandung r im Uhrzeigersinn abgelaufen wird, muss die Richtung der Pixel nur nach rechts niemals nach links zeigen dürfen. Zeigt eine Umrandung nach links wird die Verbindung des Pixel von p(n) nach p(n-1) gelöscht und die Verbindung der Pixel von p(n) nach p(n+1) überprüft. Dies geschieht solange bis wir ein Polygon erhalten dessen Umrandung im Uhrzeigersinn umlaufen werden kann und die Richtung immer nach rechts zeigt.

Ein aufschlussreiches Videotutorial zur Definition und Berechnung einer Konvexen Hülle stellt folgendes Video dar.
Das Adobe Flash Plugin wird benötigt, um diesen Inhalt anzuzeigen.

Mittels der Funktion cvConvexityDefects wird die Differenz aus der Eingangskontur und der Konvexen Hülle bestimmt. Zwischen den Differenzpunkten werden nun Linien in das Bild gezeichnet. Die Differenz aus Eingangkontur und Konvexer Hülle gibt uns so aufschluss darüber wieviele Finger in der Hand gespreizt sind.

Klassifizieren

Mit den Merkmalen

  • Differenz aus Konvexer Hülle und Eingangskontur(Convexity-Defects)
  • Umfang der Kontur

Kann nun eine Klassifizierung der Handgeste erfolgen. Es wird zwischen 2 Gesten unterschieden

Geste Umfang Convexity-Defects Aktion
geschlossene Hand 30-60 < 3 Schublade Hineinfahren
geöffnete Hand >60 > 3 Schublade Herausfahren

?2
?2

Programmablaufplan

?2

Das senden der Befehle an den Barrierefreier Schrank geschiet über eine serielle Schnittstelle zwischen einem PC auf dem das OpenCV-Programm läuft und dem PSoC-Mikrocontroller des Schrankes.

Ausblick

Um sicher mehr als 2 Gesten zu unterscheiden müssten für die Klassifizierung noch mehr Merkmale bestimmt werden.

  • Es könnte noch die Fläche der Kontur bestimmt werden und hieraus zusammen mit dem Umfang der Formfaktor bestimmt werden.
  • Die Convexity-Defects könnten in Abhängigkeit zur Fläche der Kontur gebracht werden und ein Minimum für die Fläche eines Convexity-Defects festgelegt werden.
  • Die neuen Merkmale könnten mit Hilfe des Maschinellen Lernens eingelernt werden.

Sourcecode

Literatur

[1] Paul Doliotis, Alexandra Stefan, Christopher McMurrough, David Eckhard, and Vassilis Athitsos: Comparing Gesture Recognition Accuracy Using Color and Depth Information, University of Texas at Arlington

[2] http://opencv.willowgarage.com/wiki/, Stand:31.1.2013

[3] http://www.heise.de/tr/artikel/Zeig-s-dem-Handy-1791689.html, Stand:31.1.2013

[4] http://azttm.wordpress.com/2011/04/03/kinect-pattern-uncovered/, Stand:8.2.2013

[5] http://de.wikipedia.org/wiki/Triangulation_%28Messtechnik%29/, Stand:8.2.2013

de/universeller_bayescher_bilderkenner/gesten.txt · Zuletzt geändert: 2014/11/24 13:20 (Externe Bearbeitung)