|
| |
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
Kritiken:
-
Kritik
-
Kritik
-
Kritik
-
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:
- Die
Position der Hand im
(2D-)Kamera-Koordinatensystem. Dabei wird der jeweilige Handmittelpunkt
als Anker benutzt.
- Den Winkel
der Geste in Grad; 0° entsprechen
dabei der Funktion f(x)=0 im zweidimensionalen
Kamera-Koordinatensystem.
- 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.
- 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 [x1, ..., xn]
werden die im Folgenden gelisteten Werte aufgezeichnet. Dabei ist zu
beachten, dass die xi 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. |

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:
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:
- 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.
- 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].
- 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
|