EyeTracking (SS11)

Aus toolbox_interaktion
Wechseln zu: Navigation, Suche

Zielsetzung

Entwicklung einer EyeTracking-Software die in Verbindung mit dasher zum Verfassen von Text genutzt werden kann.

Ansatz

  • Erkennen der Augen
  • Ermittlung der Blickrichtung
  • Berechnung des Blickpunkts
  • Weiterreichen via OSC
    • dasher - Schreiben mittels Cursor
    • ...

Von den genannten Punkten konnte leider nur der Erste realisiert werden, daher wurde Ersatzweise die Mundsteuerung implementiert.

Vorverarbeitung

  • Glättung - um das Bildrauschen etwas zu reduzieren, gibt es mehrere Möglichkeiten:
    • Medianfilter (zu langsam, da 500ms pro Bild)
    • Mittelung über zwei aufeinanderfolgende Bilder (Berechnungsdauer < 10ms)
    • Mittelung über drei aufeinanderfolgende Bilder (langsamer und keine große Änderung im vgl. zu 2 Bildmittelung)

Für die Mittelung über mehrere Bilder wird einfach der arithmetische Mittelwert für jede der RGB Farben einzeln gebildet. Die Berechnung wird nacheinander für jedes Pixel ausgeführt.

Vorher:      Nachher:

ET2011 keine glaettung klein.jpg    ET2011 glaettung klein.jpg

Da bei 25 Frames/sec nur alle 40ms ein neues Bild von der Kamara kommt, ist die Mittelung über zwei Bilder am Besten. Die Latenz beträgt somit etwa 90ms.

Erkennung des Kopfes

Kopf marker.png

Eine aufwendigere Analyse zur Erkennung der Augen sollte nur in Bildbereichen durchgeführt werden, die dem Gesicht zugeordnet werden.

Denkbare Ansätze

  • leicht erkennbare Marker anbringen
  • Erkennung über die Hautfarbe
  • Erkennung anhand charakteristischer Muster

Von den genannten Ansätzen wurden die letzten beiden ausprobiert.

Farberkennung

Kopf farbe.png

Hierfür wird das Bild zunächst in den HSV Farbraum umgewandelt, da dort die Farberkennung besser funktioniert. Schließlich wird der gesuchte Farbton aus dem Bild extrahiert, indem alle Pixel, die dem Farbton entsprechen und eine große Sättigung haben, selektiert werden.

Die folgende Grafik zeigt das Spektrum der Farbtonwerte Hue

Hsv farbraum.png


Hinweise zur Implementierung in C#:

  • Umwandlung von RGB- zu HSV-Farbraum mittels der Klasse System.Drawing.Color
  • Anlegen eines BitArray, welches die selbe Größe hat wie Pixelanzahl des Bildes, wobei jedes Bit (boolscher Wert) des Array angibt, ob Pixel zum gesuchten Bildbereich dazugehört oder nicht (Vorteil: schnelle Verarbeitung)

Viola-Jones-Algorithmus

Kopf pattern.png

Der Viola-Jones-Algorithmus dient der Erkennung charakteristischer Muster in Grauwert-Bildern. Im Projekt wurde die Implementierung aus der openCV-Bibliothek für die Erkennung von Gesicht und Augen verwendet.

Die eigentliche Erkennung erfolgt durch voneinander Abziehen der Grauwertsumme in verschiedenen rechteckigen Bereichen des Suchfensters. Über- bzw. unterschreitet die so ermittelte Differenz einen bestimmten Schwellwert gilt das als Indikator zugunsten des gesuchten Musters. Das Finden geeigneter Rechtecke und Schwellwerte für ein bestimmtes Such-Muster (Gesicht, ...) ist ein gesondertes Problem auf das hier nicht eingegangen wird.

Integralbild

Integralbild1.png Integralbild.png

Zuerst wird das Bild in ein Integral-Bild konvertiert. In einen Integral-Bild enthält jeder Bildpunkt die Summe aller Grauwerte links und oberhalb des Punktes. Dank des Integralbilds sind zum Bilden der Grauwertsumme eines Bereichs nur wenige Speicherzugriffe nötig. Um in obigen Bild beispielsweise die Grauwertsumme in D zu ermitteln, muss nur die Summe der Werte 2 und 3 des Integralbilds von der Summe der Werte 1 und 4 abgezogen werden.

Kombination

Kopf pattern combine.png

Die wie oben genannt ermittelten Indikatoren liefern nur schwache Aussagen zugunsten oder gegen das Muster. Ergebnisse mehrerer solcher Indikatoren werden gewichtet und zu stärkeren Tests zusammengefasst.

Kaskadierung

Cascade.png

Damit nicht zu viel Rechenzeit auf ungeeignete Suchfenster verwendet wird, werden nacheinander Test durchgeführt, welche Fenster ohne das gesuchte Muster zwar nur mit mittlerer Wahrscheinlichkeit aussortieren aber von allen Fenstern mit Muster bestanden werden. Besteht ein Fenster einen Test nicht, wird es verworfen und die nachfolgenden Tests nicht durchgeführt.

Realisierung

Ein vollständiges Eyetracking konnte leider nicht realisiert werden. Nachfolgend eine Vorstellung der entwickelten Software.

Gesichtsdetektion

Detect lena.png Detect face.png Detect time.png

Mittels der Qt- und der openCV-Bibliothek wurde ein C++-Programm entwickelt, das unter Verwendung des Viola-Jones-Algorithmus Gesichter und darin vorhandene Augen erkennt.

Die zu hohe Verarbeitungszeit machen eine Echtzeitauswertung leider unmöglich. Augen werden unter realen Bedingungen für Eyetracking nicht ausreichend erkannt.

Munddetektion

Die Mund lässt sich durch die charakteristisch rote Farbe leicht erkennen. Man verwendet oben genannte Farbdetektion mit folgenden Parameter:

  • Farbton: hue <= 15 oder hue => 350 (da Rotbereich sowohl am Anfang als auch am Ende des Hue Spektrums)
  • Sättigung: saturation > 20

Mauscursor - Steuerung

Bei der Steuerung des Mauszeigers müssen folgende Dinge beachtet werden:

  • Steuerung des Mauszeigers ist in X-Richtung zunächst spiegelverkehrt, da Kamarabild auf Person vor dem PC zeigt und somit nicht der Blickrichtung des Auges auf den Bildschirm entspricht.

Berechnung des in X-Richtung gespiegelten Mauszeigers:

mouseX = BildschirmBreiteInPixel - ((int)((MittelpunktDerSelektierteRegionX / BildBreiteInPixel) * BildschirmBreiteInPixel ));

mouseY = (int)((MittelpunktDerSelektierteRegionY / BildHöheInPixel) * BildschirmHöheInPixel );

Mund erkennung.png

  • Hotkey notwendig - zum beenden der mundgestützten Cursor-Steuerung
  • Glättung: Damit die Mauszeigerposition etwas stabiler ist, wird der arithmetische Mittelwert zwischen aktueller Mauscursorposition und vorheriger Position in X- und Y-Richtung berechnet.

Es sollten hierfür auch nur ein alter Positionswert für die Mittelung herangezogen werden, da es sonst zu spürbaren Verzögerungen in der Steuerung kommt. (Bezug: alle 100ms neuer Cursor-Wert)

Links