Handgesten-Erkennung für Media Browsing

Themenbeschreibung: Erkennung und Verarbeitung von Handgesten zur Steuerung von Anwendungen.

 

In diesem Projekt soll eine Benutzerinteraktion über Handgesten ermöglicht werden. Die Handgesten des Benutzers werden dabei über eine Kamera eingelesen und in mehreren Schritten zu einer Gesten-Repräsentation weiterverarbeitet.


Abb. 1

Gruppe:

Was Sie in diesem Dokument finden:

Kritiken über unser Projekt

Projektbeschreibung

Die technische Realisierung

Anwendungen und Spellcast

Beschreibung verwendeter Softwarebibliotheken

Projektfortschritt

                    Entwicklung von Filtern
                    Matching von Handgesten
                                    Vergleichsfunktion beim Matching
                    Bedienung des Prototypen
                    Bedienung des Lern- und Erkennugsprogramms

Fazit

Ausarbeitung


Downloads

Quellen und Links

    

 

Kritiken:

  1. Kritik

  2. Kritik

  3. Kritik

  4. Kritik 

 

Projektbeschreibung: 

In diesem Projekt geht es um Benutzerinteraktion mittels Handgesten. Als Fingerstellung bezeichnen wir hier eine bestimmte Anordnung bzw. Positionierung der Finger einer Hand innerhalb eines Einzelbildes. Diese ist (idealerweise) invariant gegenüber Position, Rotation und Skalierung. Das zu realisierende System liest Handgesten als Bilder von einer Kamera ein und wandelt diese in mehreren Schritten in eine Gesten-Repräsentation um, die folgende (voneinander unabhängige) Merkmale enthält:

  1. Die Position der Hand im (2D-)Kamera-Koordinatensystem. Dabei wird der jeweilige Handmittelpunkt als Anker benutzt.
  2. Den Winkel der Geste in Grad; 0° entsprechen dabei der Funktion f(x)=0 im zweidimensionalen Kamera-Koordinatensystem.
  3. Eine Zeichenkette, die die erkannte Fingerstellung (siehe oben) repräsentiert, z.B. "Zeigen". Diese Zeichenkette wird aus dem Vergleich der Geste mit bereits abgelegten Mustern ermittelt.
  4. Die Abweichung der erkannten Geste von dem Vergleichsmuster.

Diese Merkmale können nun als Eingabe für verschiedenste Software dienen. Im Rahmen dieses Projektes soll zunächst das Spiel Spellcast (siehe unten) auf Handgestensteuerung umgestellt werden. Je nach verfügbarer Zeit sind auch noch weitere Anwendungen vorstellbar, so z.B. ein Browser-Plugin zur Steuerung von Mozilla Firefox oder ein "Maustreiber", der die Maus als Eingabegerät ersetzt.

Das angefertigte Programmsystem sollte nach Möglichkeit plattformunabhängig (im Sinne von Quellcode-Kompatibilität) sein, zumindest aber unter Linux und Windows kompilierbar. Dies gestaltet sich im Falle von Spellcast etwas schwierig, da die Originalapplikaiton sich stark auf die Schnittstelle des X Window Systems verlässt.

  

 

 

Technische Realisierung:

     

Abb. 2
Nach dem Einlesen der Hand über eine Video-Grabbing-Schnittstelle (Abb. 2) wird durch geeignete Filter und Segmentierungsalgorithmen ein Schwarz-Weiß-Bild erzeugt, das nur noch die Hand als weiße Silhouette auf schwarzem Grund enhält (Abb. 3).


Abb. 3
Zu Entwicklungszwecken sollen mehrere Segmentierungsalgorithmen unterstützt werden:

1.    Handsegmentierung durch die Auswahl von Farbbereichen der Hand im RGB-Farbraum.

2.    Handsegmentierung durch die Auswahl von Farbbereichen im HSV-Farbraum.
       (Damit soll der Helligkeitsfaktor vernachlässigt werden können.)

3.    Subtraktion der Hand von einem vordefinierten Hintergrund (Bluescreen Technik).
       
Die Methoden 1 und 2 bewerten wir als am praktikabelsten, da keine Hilfsmittel, wie z.B. ein blauer Hintergrund,
benutzt werden müssen. Sollten sich jedoch Schwierigkeiten in der Umsetzung ergeben, werden wir auf die 3. Methode zurückgreifen, weil diese in der Praxis sehr häufig und erfolgreich eingesetzt wird.
Um kleinere weiße Pixelgruppen, die sich trotz schon erwähnter Filter immernoch im Bild befinden können, zu entfernen soll ein Schwellenwertfilter oder eine Medianoperationen zum Einsatz kommen. Ein Medianfilter entfernt
kleinere punktförmige Gebilde und dünne Linien ohne das Bild unscharf zu machen und ohne neue Grauwerte zu
erzeugen (Rauschminderung)[RST].
Zeigt die weiße Handfläche nach vorherigen Operationen Lücken auf, wird ein "blur"-Effekt angewandt, um eine zusammenhängende Fläche zu erhalten. Entsprechen nun alle weißen Pixel einer Fläche, kann die Hand rechteckig ausgeschnitten werden. Danach wird der Mittelpunkt der Hand bestimmt. Von diesem Punkt wird dann strahlenförmig

Abb. 4
jeweils die (maximale) Entfernung zum Rand der Handfläche gemessen (Abb. 4).Das Ziel ist es nun, eine Repräsentation der Fingerhaltung zu erhalten, die unabhängig von der Handposition, -Rotation und -Skalierung im zweidimensionalen Kamerakoordinatensystem ist (Abb. 3). Unabhängigkeit von der Position wird erreicht, indem die Messstrahlen stets relativ zur Hand ermittelt werden. Um ebenfalls Unabhängigkeit gegenüber der Skalierung zu erreichen, müssen lediglich die Datenpunkte genormt werden, so dass skalierte Versionen der gleichen Fingerstellung die gleichen (normierten) Entfernungswerte ergeben.


Invarianz gegenüber Rotation ist etwas komplizierter zu erreichen:
Da die Messstrahlen genau vom Zentrum der Hand ermittelt werden, entspricht eine Drehung der Hand einer Phasenverschiebung der Messpunkte, die herausgerechnet werden kann. Dazu bedienen wir uns der Fast Fourier-Transformation (FFT). Für dieses Verfahren werden die gemessenen Werte als Funktion f:N -> R interpretiert.
Die Fourier-Transformation approximiert nun diese Funktion als Überlagerung von Sinusschwingungen verschiedener Frequenzen (Abb 5). 

Abb. 5
Zur FFT gibt es ausreichend Literatur und Online-Erklärungen wie z.B. [CLR:IA]. Da die Werte normiert und phasenunabhängig sind, ist die Geste somit unabhängig gegenüber Handposition, -Rotation und -Skalierung.
Diese Harmonien symbolisieren also eine bestimmte Fingerstellung und können mit vorliegenden Identifizierungsmustern verglichen werden. Dazu werden die Differenzen der eingelesenen Geste G mit den Vergleichsmustern geeignet normiert: Error = || G-G' ||^2. Die Geste mit der kleinsten Abstandsnorm ist dann die erkannte Geste.

 

Anwendung:

Die Verwendung von Handgesten als Input kann das Verhalten verschiedenster Programme steuern. Im Zuge dieses Projektes wird zunächst ein Unix-Spiel namens Spellcast, welches bisher über die Maus bedient wurde, auf eine Steuerung durch Gesten umgestellt. Des weiteren sind - je nach Zeitbudget - ein Browser-Plugin für Mozilla Firefox zur Browsersteuerung oder ein "Maustreiber" (Handgesten als Mausersatz) geplant.

 


Spellcast:

Spellcast ist ein Spiel, bei dem sich 2-8 Spieler mit einem breiten Sortiment an Zaubersprüchen bekämpfen. Die ursprüngliche Papier-und-Bleistift-Version dieses Spiels ist von Richard Bartle entwickelt worden, die X-Implementation wurde 1993 von Andrew Plotkin geschrieben. Das Spiel läuft rundenweise ab, wobei jeder Spieler in jeder Runde je eine Geste für die linke und rechte Hand angibt (bisher mit der Maus). Bestimmte Kombinationen von Gesten entsprechen bestimmten Zaubern, wie z.B. Heilung, Blitzschlag, Verwirrung etc. Besonders interessant wird das Spiel dadurch, dass diese Zauber überlappend gewirkt werden können - die letzten Gesten eines Zaubers können gleichzeitig die ersten Gesten des nächsten Zaubers sein. Ziel ist es, die Lebenspunkte aller Rivalen auf 0 zu reduzieren. Zwei Screenshots [spellcast-01.png] [spellcast-02.png] sowie die Zauberliste [spellcast-list.pdf] sind abrufbar; der Quellcode befindet sich hier.

Die etwas unintuitive Steuerung des Spiels über die Maus soll durch eine Steuerung mittels Handgesten ersetzt werden. Dazu muss das System zwei Gesten gleichzeitig verarbeiten, was mit verschiedenen Bildregionen für die linke und rechte Hand ermöglicht wird. Zusätzlich zu den Zaubergesten werden noch weitere Gesten benötigt, um die im Spiel auftauchenden Fragen zu beantworten und die Runde zu beenden.

 

Verwendete Bibliotheken:


Das Projekt wird in C++ realisiert. Um die Plattformunabhängigkeit zu gewährleisten, werden ausschließlich Bibliotheken verwendet, die zumindest eine Unterstützung für Windows und Linux bieten.
Die Schnittstelle zum Einlesen der Bilder sowie zum Filtern und Segmentieren des Bildes realisiert die openCV-Bibliothek. Für die Anwendung der Fourier-Transformationen auf die Datensätze wird die FFTW3 benutzt. Eine mit der in OpenCV enthaltenen GUI-Bibliothek HighGUI implementierte Oberfläche dient zur Anzeige der Zwischenschritte des Erkennungsprozesses.

Projektfortschritt:

Nachdem unsere Projektgruppe die Aufgabenstellung konkretisiert hatte und Material gesammelt wurde, wählten wir geeignete Software- Bibliotheken/Kamera/Treiber etc. für unser Projekt aus.

Es wurden viele Algorithmen in der Gruppe besprochen und Lösungsansätze für die einzelnen Teilbereiche theoretisch erarbeitet. Wir arbeiteten uns in die openCV Bibliothek (mit all den damit verbundenen Schwierigkeiten) ein und erstellten erste bildverarbeitende Programme, sowie eine kleine Testumgebung, in der verschiedene Funktionen der openCV Bibliothek visualisiert werden können. Außerdem wurde ein gut funktionierendes Programmmodul entwickelt, welches den Mittelpunkt einer beliebig geformten weißen Fläche (Hand) auf schwarzem Hintergrund findet.

Filter:


Wie schon beschrieben, wollen wir die Segmentierung der Hand, also die klare Trennung der Siluette einer Hand vom
restlichen Bildinhalt , durch die Verwendung von Farbfiltern erreichen. Als ersten Ansatz untersuchten wir dazu die Farbwerte einer Hand auf mehreren Fotos (z.b. Abb. 2).  In einem der ersten implementierten Farbfilter dienten diese
Werte zur Klassifizierung von Pixeln. In diesem eher trivialem Ansatz zählten wir alle Pixel zur Handfläche, die RGB Werte besitzen die gar nicht, oder nur wenig, von den vorher gemessenen RGB Werten abweichen.
In Abbildung 6/7 und Video 1/2 ist die Ausgabe eines so
implementierten Farbfilters veranschaulicht. Rechts daneben
(Abbildung 7 und 9) ist der Hintergrund vor dem diese Filter
angewendet wurden, dargestellt. Für die Ausgabe der Pixel die
nach diesem Filter der Hand entsprechen, wurde hier der
ursprüngliche Farbwert beibehalten. In einem nächsten Schritt
werden alle Pixel der Farbe ungleich schwarz, weiß gefärbt. Wie
gut in den Videos 1 und 2 zu erkennen ist, werden zum einen viele
weitere Pixel der Hand als zugehörig erkannt, obwohl diese dem
Hintergrund zugeordnet sind, und zum anderen fällt die große
Abhängigkeit des Filters von der Beleuchtung auf.

Abb. 6 / Video 1

Abb. 7
Verändert sich der Lichteinfall oder auch geringer Schatten in Bereichen der Hand, zieht dies unweigerlich auch eine Verschiebung der RGB-Werte betroffener Pixel nach sich.
Dadurch fallen die betroffenen Hand-Bereiche nicht mehr in den Farbbereich den der Filter einer Hand zuordnet (schwarz gefärbt).

Obwohl bei bestimmten Lichtverhältnissen schon relativ große Flächen einer Hand erkannt werden, sind wir der Meinung, dass sich ohne sehr genaue RGB Werte (Funktion) für verschiedenste
Lichtverhältnisse, der Filter nicht praktikabel weiter verwenden lässt.

Abb. 8  / Video 2

Abb. 9


Der Segmentierungsalgorithmus der Hand vom Hintergrund sollte ursprünglich allein über das Merkmal der Hautfarbe arbeiten. Wie in [RMG98] beschrieben ist, finden  sich die Hautfarben aller ethnischen Gruppen in einem kleinen Gebiet im HS Farbraum. Dies konnte auch durch empirische Studien belegt werden. Stützend auf die oben genannte Arbeit und andere Arbeiten([Braumann2001], [XM200]) ergibt sich der Vorteil, dass der Helligkeitswert
vernachlässigt werden kann.
Der HSV Farbraum (Abb. 10) teilt eine Farbe in 3 Komponenten
auf. Der Helligkeitswert V(vertikale Achse), der Winkel der Farbe Hue(H) und der
Sättigungswert der Farbe S (Horizontale). Der Mittelpunkt des rot-Bereichs markiert der Hue Wert 0°. 
 Der Bericht [YLW97] zeigt das die Variabilität der Hautfarbe verschiedener Menschen hauptsächlich auf Unterschiede in der Intensität der Farbe und weniger auf den 

Abb. 10
Quelle: http://www.hrz.uni-dortmund.de 
Farbwert zurück zu führen ist. Das macht die Arbeit eines Filters in diesem Farbraum erheblich einfacher, da nur noch
2 Veränderliche, Hue und Sättigung, berücksichtigt werden müssen. Nach der Diplomarbeit [Kond03] liegen die 

Farbwerte(Hue) einer Hand im HSV -Farbraum im Bereich von  6 bis 38 Grad. Stüzend auf
diese Untersuchungen implementierten wir erste Handfilter die in diesem Farbraum arbeiteten.
Im Video 3  ist die Ausgabe des Filters dokumentiert der mit Farbwerten im HSV-Raum
arbeitet.  Die Hand wird vollständig erkannt, jedoch auch sehr viele Anteile des Hintergrunds
die den Farbraum der Hand schneiden. Der Hintergrund kann also mit der Ausnahme
bestimmter Farben (die auch in Händen vorkommen) beliebig sein. Im vergleich zu Video 1
wird der Unterschied deutlich: in Video 1 werden, durch eine ungenaue Farbwertbestimmung
verursacht, der Hand mehr Pixel zugeordnet, die vom subjektivem (menschlichem)
Farbverständniss her nicht einer Handfarbe entsprechen (Teile der Wand). In Video 3 werden


Abb. 11 / Video 3
der Hand auch Bereiche aus dem Hintergrund zugeordnet, jedoch sind dies nur solche, die einem der Hand ähnlichen Farbwert (Hue) aufweisen. In Video 4 agiert ein Filter der in dem
Farbbereich arbeitet wie in [Kond03] beschrieben (Hue: 6°- 38°).  Es ist zu erkennen, dass auch
hier die ganze Hand mit Teilen des Hintergrunds als Hand erkannt wird. Als sehr praktikabel erwiesen sich die gewählten HSV Werte nicht, da je nach Hintergrund, mehr oder weniger
Rauschen im Bild vorhanden war. Auch ein Medianfilter der openCV-Bibliothek konnte hier
keine Abhilfe schaffen, aber eine Weiterverwendung dieser Art der Segmentierung in unserem
Programm kann nur erfolgen, wenn der Filter sehr wenig Rauschen  erzeugt. Wenige,
kurzweilige Blöcke von ein bis zwei Pixeln haben noch keine große Ungenauigkeit zur Folge
-dieser Filter erzeugt im Durchschnitt wesentlich mehr. 


Abb. 12 / Video 4




Die vorläufigen Ergebnisse der Brauchbarkeit von Farbfiltern im HSV-Farbraum für unser Programm sind in Tabelle 1 veranschaulicht. Es wurden Versuche unter verschiedenen Lichtverhältnissen durchgeführt, wobei der Hue Wert periodisch verändert wurde.
 
Hue Wert  Ergebnis
6 bis 38 Grad schlecht, keine Segmentierung möglich, auch durch zusätzliche Filter keine Verbesserungen
0 bis 26 Grad nur bei schlechten Lichtverhältnissen besser
-10 bis 40 Grad besser, aber viel Rauschen das sich auch durch weitere Filter nicht beseitigen ließ
10 bis 80 Grad vorteilhafter für bestimmte Lichtverhältnisse, aber insgesamt nicht zufrieden stellend
Tabelle 1

Diese Tests zeigten uns, dass der Hue allein nicht ausreicht, um über das Merkmal Hautfarbe eine Hand zu erkennen.
Der Ansatz einen Farbfilter im HSV-Farbraum zu verwenden erschien aber weiterhin sinnvoll und ausbaufähig. Daraufhin beschlossen wir eigene Messreihen unter Berücksichtigung der Sättigung zu erstellen, um dann mit diesen Werten bessere Ergebnisse zu erzielen. Es wurden Fotos mit der Webcam von Händen vor verschiedenen Hintergründen gemacht die im Anschluss mit einem Bildbearbeitungsprogramm analysiert wurden.

Als Beispiel sei hier der erste Test, unter schlechten Lichtverhältnissen, gegeben:


 
Umgebungs-Bedingungen:                      relativ dunkel, künstliches Licht, wenig Lichtstreuung , variabler und
                                                                    vielfarbiger Hintergrund


                       
Einstellungen der Logitech Quick Cam: kein Weißabgleich, kein Restlichtfilter, ohne Farbverstärkung
                                                                    (automatische Empfindlichkeit ließ sich nicht dauerhaft deaktivieren)
                        


Vorgehensweise:  Am Ende des ersten Schritts waren die meisten Hue Werte erfasst, die in der Hand
                                vorkommen. Hue Werte die relativ selten in der Hand auftreten aber öfter im Hintergrund
                                zu finden sind  wurden nicht in die Menge der erfassten Hue's aufgenommen.
                                Danach wurde festgestellt welche Sättigungswerte in Kombination mit welchen Hue-Werten
                                auftreten. Bestimmte Sättigungswerte treten häufiger in einem bestimmten Intervall von
                                Hue-Werten auf, weshalb fortan nur noch die Kombination von Hue-Bereich mit bestimmten
                                Sättigungswerten betrachtet wurden.


    
Folgende Tabelle veranschaulicht die gemessenen Hue- und Sättigungswerte der Hautfarbe verschiedener Hände.
Die Häufigkeitsverteilung blieb dabei weitestgehend unberücksichtigt.

Hue

8  bis  13

14 bis  17 

18  bis  21

22 bis29

30 bis 39

40 bis 45

46 bis 58

Saturation

38

34

47

33

25

19 bis 22

19 bis 22

 

40

45

40

35

26

25

23

 

37

49

39

37

28

26

18

 

45

37

48

41

30

 

 

 

 

35

50

43

24

 

 

 

 

38

37

34

34

 

 

 

 

42

44

32

35

 

 

 

 

50

 

52

29

 

 

 

 

51

 

51

33

 

 

 

 

47

 

44

27

 

 

 

 

45

 

45

19

 

 

 

 

39

 

 

 

 

 

 

 

49

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

min

37

34

37

33

19

19

18

max

45

49

47

52

34

26

23

 Tabelle 2


Die Spanne von 46° bis 58°  ist dabei besonders sensitiv.  Ohne diesen Bereich ließ sich keine Hand vollständig
erkennen; nur eine Vergrößerung des Sättigungbereichs in diesem Hue-Winkel um 2 bis 3%  verursacht aber sehr starkes Rauschen.


Einige Hue-Winkel besitzen fast gleiche Sättigungswerte, so dass diese Bereiche unter Einbezug von Toleranzen  zusammengefasst werden konnten:

Hue

8 bis 21

22 bis 29

30 bis 39

40 bis 45

46 bis 58

Saturation min

33

30

18

18

18

Saturation max

50

55

36

27

23

Tabelle 3

Diese Werte rechneten wir programmspezifisch um, und wendeten sie im Handfilter an. Aber trotz abgeschalteteter Kamerafeatures regelt die Webcam  zuviel selbst nach (die automatische Empfindlichkeit der Kamera lässt sich mit dem Logitech Tool nicht persistent deaktivieren). Deshalb lieferte das Handsegmentierungssystem immer noch Bilder mit sehr viel Rauschen vor variablen Hintergrund. Die Handerkennung zeigte manchmal, durch die automatische Nachregelung der Kamera, indeterministisches Verhalten. Insgesamt arbeitete das System mit diesen Werten viel besser als vorher. Das 
Rauschen hielt sich in Grenzen, ließ sich aber nicht ganz durch das Anwenden von Schwellwert-, Median- und Blur-Filtern der openCV-Bibliothek beseitigen. Unerwartet ist das Verhalten des Filters unter anderen als bei den Messungen vorhandenen Lichtverhältnissen: Wir erwarteten eigentlich eine Farbbestimmung die bis zu einem gewissem Grad unabhängig von den
Lichtverhältnissen sein würde;stützend auf die Arbeiten [RMG98],[Braumann2001],  [XM200],
[YLW97]
.  Jedoch stellten wir fest, dass unser Filter unter anderen Lichtverhältnissen nicht nur sehr viel Rauschen verursachte, sondern auch die Handsiluette zerklüftete (Video 5).

Abb. 13 / Video 5
Dies könnte unserer Ansicht nach technische Ursachen haben (automat. Empfindlichkeit der
Kamera), oder aber ungeeignete Parameter für die Segmentierung. Gestaltet man die Parameter bezüglich des Farbbereichs toleranter, verursacht dies wiederum mehr Rauschen im Hintergrund. Eventuell ließe sich diese Art der
Handsegmentierung weiter verwenden, wenn man einen eigenen Medianfilter implementiert der kleine punktförmige
Gebilde und kurze dünne Linien entfernt, den Farbbereich toleranter gestaltet und Einschränkungen bezüglich der
Farbvariabilität des Hintergrunds vorgibt.
Bei weiteren Tests stellte sich aber heraus das dieser Filter eine gut segmentierte Hand liefert, wenn der Hintergrund uni-blau ist, weshalb wir uns dazu entschieden einen einfacheres Bluescreen Verfahren zu entwickeln. Der neue Filter (Video 6) macht im ersten Schritt nichts weiter als alle Pixel eines bestimmten Blau-Spektrums schwarz zu färben und die noch verbleibenden Pixel weiß zu färben. Danach werden noch Median- und Blur-Filter angewandt um eine gut segmentierte Hand zu erhalten. Der Blur Filter soll eine gewisse Unschärfe erzeugen um für die Charakteristika der Fingerstellung unrelevante Werte abzuschwächen. Die Wirkungsweise


Abb. 14 / Video 6


Abb. 15 / Video 7

des  Blur-Filters ist in Video 7 veranschaulicht.  Eine  verbesserte Version des Farbfilters (RGB Farbmodell) wie er in Abbildung 6 und 8 dargestellt ist, lässt sich auch gut für die Segmentierung der Hand vor blauem Hintergrund verwenden (Video 8, Video 9). Der Vorteil bei der Verwendung des Blaufilters ist die klar und gut gefilterte Hand, die sich gut in unseren weiteren Programmteilen für Berechnungen eignet.
Die ursprüngliche Vorderung mit dem Softwaresystem ohne weitere Hilfs-mittel interagieren zu können geht jedoch verloren. Es wird ein blauer Hintergrund sowie grüne, dunkelblaue oder blaue Kleidung (Ärmel) vorausgesetzt. Vor einem vielfarbigen Hintergrund erzeugt der Blaufilter sehr viele weiße Flächen die nicht zur Hand gehören, auf dessen Grundlage keine Gestenverarbeitung möglich ist (Video 10).

Abb. 16 / Video 8


Abb. 17 / Video 10


Des weiteren fertiggestellt sind die Kernalgorithmen und Programmteile zum radialen Scannen der Hand, finden des Mittelpunktes der Hand, Berechnung der Harmonien mittels Fourier-Transformation sowie ein Teilsystem zum Vergleichen, speichern und klassifizieren. Als nächstes erfolgt die Integration unseres Teilsystems in den Quellcode des Spiels Spellcast um einen gestengesteurten Spielverlauf zu ermöglichen.

Ein vorläufiges Lernprogramm

In Abbildung 18 ist unser erstes Lernprogramm dargestellt, das aber zum
vorläufigem Abschluss unseres Projektes erweitert wurde. Trotzdem ist es zur
Veranschaulichung der Prozesse geeignet. Die weiße Fläche in der Mitte von
Abbildung 8 stellt die segmentierte Hand dar, die sich vor der Kamera befindet.
Über das schon o.g. Verfahren wird der Mittelpunkt der weißen Fläche
errechnet und als roter Kreis dargestellt. Die Scanlines (blaue Linen im Bild 18)
Verfahren vom äußeren Bildrand nach innen zum ermittelten Mitteltpunkt
und enden beim ersten weißen Pixel. Die dadurch ermittelten Sützvektoren
dienen als Input für die Fouriertransformation, deren Koeffizienten im Bild
durch die roten Linien dargestellt werden. Jedoch schwanken (Video 11) die für
eine Fingerstellung offensichtlich signifikanten Fourierkoeffizienten bei einer
Rotationsbewegung (siehe weiter unten).

Abb. 18 / Video 11

Matching der Geste

Wenn die Fourier-Koeffizienten der Geste ermittelt sind, müssen diese noch mit einem abgelegten Muster verglichen werden. Interessant sind hierbei zwei Aspekte: die Aufnahme und Speicherung der Muster-Gesten sowie die Vergleichsfunktion beim Matching.

Aufnahme und Speicherung der Muster-Gesten

Zu diesem Zweck wurde ein einfaches „Lernprogramm“
geschaffen, dass Mustergesten von der Kamera aufzeichnet und, mit einem Namen versehen, in eine Datei speichert. Um
den Einfluss von Störungen bei der Aufzeichnung zu verringern, wird jede Geste mehrmals aufgezeichnet. Im Moment
werden jeweils n=5 „Proben“ von einer Geste genommen. Alle aufgezeichneten Werte werden dabei normalisiert, so dass
sie zwischen 0 und 1 liegen. Dies macht die Vergleichsmuster unabhängig von der Auflösung der Kamera bei der
Aufzeichnung. Von diesen n Proben [x
1, ..., xn] werden die im Folgenden gelisteten Werte aufgezeichnet. Dabei ist zu
beachten, dass die x
i selber wieder Vektoren darstellen, so dass die o.g. Operationen elementweise durchgeführt werden
müssen.
  • Minimum: min([x1, ..., xn]) = mini=1...n{xi}
  • Maximum: max([x1, ..., xn]) = maxi=1...n{xi}
  • Mittelwert: avg(x1, ..., xn) = 1⁄n ∑(xi)
  • Median: med([x1, ..., xn]) = xn⁄2, wobei [x1, ..., xn] nach Größe geordnet ist
  • Varianz: var([x1, ..., xn]) = 1⁄n ∑(xi-avg(x1, ..., xn))2

Vergleichsfunktion beim Matching

Als letzter Schritt der Gestenerkennung müssen die Fourier-Koeffizienten der Scanline-Funktion mit den abgelegten Mustern verglichen werden, um ein Matching mit einem dieser Muster zu erzielen. Dabei gibt die Vergleichsfunktion einen Wert c zwischen 0 und 1 zurück, der den Unterschied mit dem Vergleichsmuster angeben soll; ein Wert von 0 bezeichnet hier ein ideales Matching, während ein Wert von 1 den größtmöglichen Unterschied darstellt. Das Matching-Verfahren vergleicht die Fourier-Koeffizienten einfach mit allen Mustern und wählt dann jenes mit dem geringsten Unterschied.
Um einen Koeffizientenvektor x mit einem Muster y = mi = (min(xi), max(xi), avg(xi), med(xi), var(xi)) zu vergleichen, gibt es praktisch unzählige Möglichkeiten. Im Grunde genommen handelt es sich um ein „Skalarprodukt“, das aus zwei Vektoren eine positive, reelle Zahl berechnet, die für identische Argumente 0 ist. Jedes der im Folgenden gelisteten Verfahren berechnet den Vergleichswert als Summe von komponentenweisen Vergleichen: c = ∑i=1...nc_i, der Einfachheit halber werden im folgenden nur die komponentenweisen Vergleichsfunktionen ci angegeben.

Das einfachste Verfahren entspricht der euklidische Norm; der Abstand berechnet sich aus cavg = (x-y.avg)2. Leider funktioniert dieses Verfahren nicht so gut wie erwartet, da die häufig vorkommenden „Ausreißer“ unter den Werten zu großen Abständen führen.
Um Fehler bereits bei der Aufzeichnung einzudämmen, kann statt des Mittelwertes auch der Median verwendet werden: cmed = (x-y.med)2 Diese Variante ist etwas unempfindlicher gegen „Ausreißer“. Aber auch hier bleibt das Problem, dass die teilweise starken Schwankungen der Werte den Abstandswert vergrößern.
Als dritte Möglichkeit bleibt die Verwendung von Maximum und Minimum: cminmax = 0, falls y.min<x<y.max; min{(x-y.min)2, (x-y.max)2} sonst. Hier wird der Abstand nur dann erhöht, wenn der Koeffizient außerhalb des durch Minimum und Maximum gegebenen Bereiches liegt; man vergleicht quasi mit dem Intervall [y.min, y.max]. Bereits bei der Aufnahme der Muster auftretende „Ausreißer“ werden dabei natürlich berücksichtigt. In gewissem Maße ist dieser Effekt erwünscht, da die selben Ausreißer natürlich auch bei den in der Erkennung gemessenen Koeffizienten auftreten können. Andererseits führt dieses Verfahren schon bei wenigen Gesten zu einem zu „optimistischen“ Matching, so dass praktisch eine beliebige Geste erkannt wird.
Alle drei Verfahren haben also das selbe Problem; die Schwankungen und unterschiedlichen Größenordnungen der Koeffizienten sowohl bei der Musteraufnahme als auch im Erkennungsprozess bedingen eine zu große Ungenauigkeit, als dass man eindeutig ein Muster zuordnen könnte. Dennoch lassen sich bei den Abbildungen rechts auf den ersten Blick die charakteristischen Koeffizienten für eine bestimmte Geste erkennen. Es gilt also, dieses intuitive Erkennen des menschlichen Betrachters für die Maschine verständlich zu machen, also in mathematische Formeln zu gießen. Die unterschiedlichen Gesten haben charakteristische Koeffizienten.
Abb. 19

Wenn man die Fourier-Koeffizenten bei der Aufzeichnung der Muster eine Zeit lang beobachtet, so fällt einem auf, dass einige Koeffizienten recht stark schwanken, während andere fast konstant bleiben; diese können als „charakteristisch“ für diese Geste angesehen werden. Wählt man die Aufzeichnungszeitpunkte für die Mustergeste geschickt, oder macht sehr viele Aufzeichnungen der gleichen Geste, so schlagen sich diese Schwankungen in der Varianz des Koeffizienten nieder. Charakteristische Werte haben eine niedrige Varianz, während die schwankenden Werte eine hohe Varianz aufweisen: Die Varianz ist umgekehrt proportional zur Wichtigkeit des Koeffizienten bei der Erkennung. Man könnte also die bei der Berechnung der Unterschiede die Varianz mit berücksichtigen: c = ∑i=1..n(1-y.vari)ci. Auf diese Weise kann der Einfluss von Schwankungen der nicht charakteristischen Werte stark reduziert werden.
Was aber, wenn bei allen aufgezeichneten Mustern die gleichen Koeffizienten charakteristisch sind? Schwankungen der charakteristischen Werte sorgen dann immer noch für schlechte Erkennung. Dem kann abgeholfen werden, indem man die Werte einer Mustergeste, in denen sie sich von allen anderen Mustern deutlich unterscheidet, bevorzugt behandelt. Dies wird durch einen Vergleich beim Einlesen der Musterdatei erledigt; jedem Koeffizienten eines Musters wird ein Wert g_izugeordnet, der um so größer ist, je größer der minimale Unterschied dieses Musters im Vergleich zu den anderen ist.
Als endgültige Formel zur Berechnung des Unterschiedes zweier Gesten ergibt sich also: c = ∑i=1..ngiy.varici mit ci=cavg[i] oder ci = cmed[i] oder ci = cminmax[i].

Bedienung des Prototypen wxSpellcast

Der wxSpellcast-Client wurde im Rahmen dieses Projektes um eine Gestensteuerung erweitert. Beim Starten des Programmes wird zusätzlich zum üblichen Steuerungsfenster ein Kamerafenster geöffnet, dass ein bereits gefiltertes Kamerabild anzeigt. Das Fenster ist in 3 Regionen eingeteilt, wobei die linke bzw. rechte Region für die entsprechende Hand genutzt werden. Die untere Region ist für die Steuerung der restlichen Programmfunktionen, wie z.B. Rundenende und das Beantworten von Fragen, vorgesehen. Die zwei Regler am oberen Rand legen zwei Filter-Parameter fest (nämlich die obere respektive untere Grenze der zu ignorierenden Hue-Werte). Um die Erkennung zu kalibrieren, richtet man die Kamera einfach auf eine blaue Fläche aus und hält die Hand auf diese Fläche. Dann kann man mit den Reglern das Bild so einstellen, dass der Hintergrund vollkommen schwarz ist und nur die weiße Hand zu sehen. Da Spellcast ein reines Netzwerk-Multiplayer-Spiel ist, muss ein Server gestartet werden. Dies geschieht mit dem Menüpunkt „File -< Start server“; die Default-Werte können übernommen werden. Danach startet man eine zweite Instanz als Client, idealerweise auf einem anderen Rechner mit Kamera. Sollte nur eine Kamera vorhanden sein, so kann auf den Originalclient zurückgegriffen werden bzw. mit dem Parameter --nocam die Gestenerkennung abgeschaltet werden. Mittels „File -< Join Server“ kann dem Server beigetreten werden; sind mindestens zwei Spieler (einschließlich Server) angemeldet, so kann dieser über den Button „Start Game“ das Spiel starten. Ab diesem Zeitpunkt können in die entsprechenden Regionen des Kamerabildes Gesten eingegeben werden. Die folgenden Gesten werden unterstützt:

empty digit palm fingers wave clap snap knife
Aus naheliegenden Gründen mussten die Gesten „snap“ und „knife“ durch folgende ersetzt werden:
snap   knife
snap   knife

Bedienung des Lernprogramms und des Erkennugsprogramms

Das Lernprogramm (reader. exe) ermöglicht das Aufzeichnen und Abspeichern von Gesten in einer Datei (gesten.dat). Der Gesten-Datenssatz kann im Erkennungsprogramm (tester.exe) und in Spellcast als Grundlage zur Gestenerkennung
dienen.
In diesem Program kommt der o.g. Blaufilter zum Einsatz, dessen Parameter anhand
der Regler (siehe Abbildung 20) verändert werden können (default Werte werden
aber empfohlen). Param1 stellt den unteren,  und Param2 den oberen Schwellwert des
blau-Bereichs dar.  Die blauen Linien am oberen Bildrand des Videofensters bilden
die Scanlines (hier 32) ab. Eine Veränderung der Handgeste oder der Position 
der Hand bewirkt eine Veränderung dieser Indikatoren. Die roten Linien in der Bild-
mitte stellen die Fourier-Koeffizienten dar, die auf Grundlage der Scanlines ermittelt
wurden. Betrachtet man das Video 12, wird unser Problem der Erkennung einer
Handgeste aufgrund der Fourierfunktion deutlich: schon bei einer geringen Änderung
der Fingerstellung/desWinkels der Kamera zur Hand etc. schwanken diese Werte enorm. Dadurch müssen größere Toleranzen gewählt werden welche die Erkennung
ungenau machen. Viel schwerwiegender ist aber das Problem die für verschiedene Gesten signifikanten Fourier-Koeffizienten untereinander zu unterscheiden. Genau diese Koeffizienten sind gegenüber den anderen Werten relativ klein, und schwanken
auch bei verschiedenen Schnappschüssen der selben Geste.      :-(

Abb. 20 / Video 12
Um eine Geste aufzunehmen und im neuen Datensatz zu speichern muss die selbe
Geste 5 mal hintereinander durch das Betätigen der Leertaste aufgenommen werden.
Nun bleibt das Bild im Videofenster eingefroren und es werden zusätzliche Werte  über die Scanlines durch verschieden farbige Balken im Videofenster angezeigt. Alle Werte beziehen sich auf die n'ten Scanlines der 5 Schnappschüsse der
aufgenommenen Geste:

                 orange Balken : Minimum
                 gelbe Balken :   Mittelwert (average)
                 grüne Balken :   Median
                 pinke Balken:    Maximum

Diese Werte werden zur weiteren Gestenerkennung benötigt.  Nun muss in der  Konsole noch ein Name(ohne
Leerzeichen max. 15 Zeichen) für die neue Geste vergeben werden, bevor im Videofenster weiter Gesten aufgenommen
werden können. Das Programm kannn nur ordnungsgemäß durch das Drücken der Taste q im Videofenster-Fokus
beendet werden.

Erkennugsprogramm

Das Programm (tester.exe) zum Erkennen der Gesten (Abbildung 21)  liegt im selben Ordner
wie das Lernprogramm und benutzt die Datei gesten.dat als Wissensbasis um Gesten die
sich vor der Kamera befinden zu erkennen. Auch bei diesem Programm ist die Möglichkeit
gegeben den Blaubereich des Filters über zwei Regler einzustellen. Diese Parameter-
änderung wirkt sich natürlich nur auf den momentanen Filter aus. Die gerade erkannte Geste
wird in einer Konsole zusammen mit den Wahrscheinlichkeiten für das richtige Matching der
Geste ausgegeben. Im  Fokus des Videofensters beendet die Taste q das Programm.

Abb. 21
 

Fazit

Leider konnte das gesteckte Ziel nicht ganz erreicht werden, obwohl die meisten Programmteile innerhalb eines gewissen
Toleranzbereiches korrekt arbeiten. Das Matching der Gesten ist noch zu ungenau, um ein flüssiges und intuitives
Umgehen mit der Gestenerkennung zu ermöglichen. Die Algorithmen funktionieren größtenteils gut, bis auf einige
Ausnahmen, wo noch Forschungsbedarf besteht:
  1. Das Herausfiltern der Hand aus dem Kamerabild funktioniert vor uniform blauen Hintergründen sehr gut. Das Bluescreen-Verfahren versagt jedoch beim Ausfiltern von Hintergrund im rot-gelben Hue-Bereich sowie von reinen Grautönen. Des weiteren ist der Algorithmus bedingt empfindlich bezüglich der Lichtverhätnisse: Wenn die Aufnahme nicht gut und vor allem gleichmäßig ausgeleuchtet ist, zeigen sich teilweise unerwünschte Störungen. Hier wäre durch Erweiterungen der Filter eine Verbesserung möglich, um auch vor nicht-blauem Hintergrund oder bei schlechtem Licht die Hand ohne Fehler identifizieren zu können.
  2. Die Fourier-Transformation unterliegt extrem starken Schwankungen, selbst bei geringfügigen Änderungen der ermittelten Scanlines. Hier muss eine andere rotations- und skalierungsinvariante Transformation als Ersatz gefunden werden. Im wesentlichen verursacht dieses Problem ein Abbildungsproblem von der Geste auf die für die Geste signifikanten Datensätze.Als möglicher Ersatz böten sich sogenannte Hu-invariante Momente an [ Wikipedia:image moments]. 
  3. Ein weiteres großes Problem stellt das Matching der Gesten mit den Mustern dar. Die Schwankungen der Fourier-Transformation verhindern hier leider jede Möglichkeit zu einer gut funktionierenden Erkennug. Eine verbesserte Transformation wirkt sich sicherlich posititv auf das Matching aus. Verbleibende Probleme können dann mit den unter „Vergleichsfunktion beim Matching“ erläuterten Methoden gelöst werden.


Downloads


Für die Nutzung der zum download angebotenen Programme wird eine Logitech QuickCam empfohlen, da diese
problemlos durch die openCV Bibliothek unterstützt wird. Damit die Filter richtig arbeiten können,  müssen vor Programm-
start sämtliche Optimierungsfunktionen (Weißabgleich, Restlichtverstärkung, Farbverstärkung, Automatische Empfindlichkeit) der Kamera abgestellt werden.
Für die Logitech Kamera :
                                                - siehe ->Logitech-Kamerakontrollfeld und
                                                          ->Logitech-Kamerakontrollfeld->Treibereinstellungen
                                                - Weißabgleich auf den höchsten Wert 10 000 setzen (aber die Automatik unbedingt!!      
                                                  abschalten).

Für die korrekte Funktionsweise der Filter/des Programms mit anderen Kameras können wir nicht garantieren.


Einige Filter:

Es werden jeweils .zip Archive zur Verfügung gestellt. Einfach auspacken und .exe Datei ausführen; dafür sollte natürlich
eine Kamera angeschlossen sein. Beenden mit Escape.

Datei Erläuterung
HSV-Filter    Sehr Lichtabhängig. In gut ausgeleuchteter Umgebung benutzen, oder (wenn möglich) die Empfindlichkeit der Kamera erhöhen. Segmentiert die Hand auch vor vielfarbigem Hintergrund. Arbeitet mit den selbst ermittelten Werten, wie sie auch beim Filter des Videos 5 Anwendung fanden.
RGB-Filter    Segmentiert eine Hand gut vor blauem oder grünen Hintergrund; grüne, dunkelblaue oder am besten blaue Kleidung.
Blaufilter       Bedingung: blauer Hintergrund, grüne, dunkelblaue oder am besten blaue Kleidung.

Die Quellen für diese 3 Filter finden Sie hier.


Das Filterlabor:

Zur Veranschaulichung der Wirkungsweise verschiedener verwendeter Filter kann auch das Filterlabor dienen, welches wir seit der ersten Vorstellung im Seminar erweitert haben. Zwei Parameter für den gerade aktiven Filter können zur Laufzeit durch Regler am Videofenster verändert werden. Durch bestimmte Tasten (siehe Konsole nach Programmstart) werden die Filter im Kontext des Videofensters ausgewählt.

Im Archiv befinden sich:Quellcode, binaries, dll's, makefile, und die Projektdateien.


Lernprogramm und Erkennungsprogramm:

Das Lernprogramm befindet sich zusammen mit dem Erkennungsprogramm in einem
Archiv.
Beide teilen sich im entpacktem  Verzeichnis die Gestendefinitions-Datei "gesten.dat", die auch als Wissensbasis der Gesten für Spellcast dienen kann (kopieren). In dem Verzeichnis befinden sich sowohl die binaries, als auch die Quell- und Projektdatein.

Anwendung des Lernprogramms:                 "reader.exe"
Anwendung des Erkennungsprogramms:     "tester.exe"
Hinweise zur Bedienung

Quellen unseres ersten Handlernprogramms (Beta Phase) hier. (anderer Ansatz)



Die Anwendung:  wxSpellcast-gesturized:

Das Spiel Spellcast wurde auf eine Gestensteuerung umgestellt. Falls die Gestenerkennung mal nicht korrekt arbeiten
sollte, ist immernoch die herkömliche Eingabe der Gesten über die Maus möglich.

Eine kurze Anleitung sollte den Einstieg in das modifizierte Spiel erleichtern.
Im Archiv sind wieder Quellen, binaries und benötigte dll's enthalten. Die Datei "gesten.dat"  enthält schon die in der Kurzanleitung beschriebenen Gesten, s.d. gleich "los gezaubert" werden kann. Diese Gestendefinitionen können aber auch durch eigene Definitionen, die mit dem Lernprogramm gemacht wurden, ersetzt werden.

download wxSpellcast-gesturized


Quellen/Links:

[Braumann2001] U.-D. Braumann: Multi-Cue-Ansatz für ein dynamisches Auffälligkeitssystem zur visuellen
Personenlokalisation. Dissertation, Technische Universität Ilmenau, 2001.

[HVU] Vision-based hand gesture interface. http://www.cs.ucsb.edu/%7Ematz/HGI/HandVu.html
Ein Interface zur Verarbeitung von Gesten. Die Hände müssen dabei in einer Initialstellung aufgenommen werden. Interaktion mit virtuell Objekten.

[GRH]The Gesture Recognition Home Page. 15.November 2005. http://www.cybernet.com/~ccohen/
Viele nützliche und weiterführende Links zum Thema Handgestenerkennung.

[Tara04] Leonello Tarabella: Handel, a Free-Hands Gesture Recognition System.
in Wiil, Uffe Kock (Hrsg.): Computer Music Modeling and Retrieval}, Springer-Verlag, 2004. ISBN: 3-540-24458-1.
Dieser Artikel beschreibt das von uns verwendete Verfahren zur Gestenerkennung und war der Anstoß für die Projektidee.

[TaraWeb] Leonello Tarabella: http://cnuce.isti.cnr.it/tarabella/music.html, November 2005.
Die Webseite von Leonello Tarabella. Leider keine Artikel, dafür interessante Beispiele zur künstlerischen Verwendung der Handgestenerkennung.

[CLR:IA] T. Cormen, C. Leiserson,R. Rivest und C. Stein: Introduction to Algorithms, second edition, Kapitel 30
MIT Press, 2001. ISBN: 0-262-53196-8.
Ausführliches Kapitel zur FFT (Fast Fourier Transformation).

[SHS:HGR] Atid Shamaie, Wu Hai und Alistair Sutherland: Hand-Gesture Recognition for HCI.
http://www.ercim.org/publication/Ercim_News/enw46/shamaie.html,November 2005.
Ein anderer Ansatz zur Gestenerkennung, der mit Principal Component Analysis (PCA) und Graph Matching arbeitet. Das System kann auch animierte Gesten erkennen.

[OpenCV] Intel OpenCV Library. http://sourceforge.net/projects/opencvlibrary.
Freie Bibliothek für Bilderkennung. Die Bibliothek enthält eine Vielzahl von nützlichen Algorithmen für Tracking, Segmentierung etc.

[RST] RST-Software: DBV. http://www.rst-software.de/dbv/download.html .
Ein Buch über die computergestützte Bilderkennung.

[RMG98] Y. Raja, S.J. McKenna, and S. Gong: Tracking and segmenting people in varying lighting conditions using colour.
IEEE International Conference on Face & Gesture Recognition, Japan, 1998.

[TRIP01] Prof. Paul Y. Oh: "Template for Real-Time Image Processing Development" 2001  http://www.boondog.com/%5Ctutorials%5CtripodBinarize%5CtripodBinarize.html,
Ein Template welches den Entwurf von Echtzeit Bild-verarbeitenden Programmen erleichtern soll.

[Kond03] Yevgeniya Kondratyuk: Verfolgung und Segmentierung von Händen in Bildsequenzen zur Unterstützung der 3D-Analyse in einem Echtzeit-Videokonferenzsystem.
Diplomarbeit, TU Berlin, 2003. http://www.nue.tu-berlin.de/lehre/sa-da/DA_Kondratyuk.pdf
Arbeit zum Thema Verfolgung/Segmentierung von Händen - Voraussetzungen für die Gestenerkennung. Das Verfahren bedient sich dabei der Hautfarbe als Merkmal zur Segmentierung.

[Fri:MS] Klaus Fritzsch: Maschinelles Sehen. Akademie Verlag, 1991. ISBN: 3-05-001785-6.
Ein etwas älteres Buch, das mathematische Grundlagen von Computer Vision erläutert.

[FFTW3] Fastest Fourier Transform in the West. Matteo Frigo, Stephen G. Johnson. http://www.fftw.org/, November 2005.
Wie der Name schon sagt, eine schnelle Bibliothek zur Fourier-Transformation.

[SC] Andrew Plotkin: Spellcast - A game of duelling wizards. 1993
http://www.eblong.com/zarf/spellcast.html
Spellcast - das oben erwähnte Spiel, das auf Gestensteuerung umgestellt werden soll.

[YLW97] J. Yang, W. Lu, A. Waibel: Skin-Color Modeling and Adaptation.  Carnegie Mellon University, Pittsburgh, 1997.
Technischer Bericht CMU-146

[XM2000] Y. Xiaoming, X. Ming: Finger identification in hand gesture based human-robot interaction.
Proceedings of the 1st IEEE/RAS International Conference on Humanoid Robots, MIT, Boston, USA, 2000.

Zuletzt aktualisiert: 23. Februar 2006 17:03

Zurück Nach oben Weiter