Mousecursorsteuerung mittels Blickerkennung

Aus toolbox_interaktion
Wechseln zu: Navigation, Suche

Im Rahmen der Vorlesung Interaktion wurde im Sommersemester 2010 versucht ein Programm zu schreiben welches es ermöglicht den Mousecursor nur über Blickrichtungserkennung zu steuern.

Vorüberlegungen

Das Programm soll folgende Schritte ausführen können.

  • Kopfposition innerhalb des Bildausschnittes erkennen
  • Kopflage erkennen
  • Augenstellung erkennen
  • Koordinatenberechnung des Blickpunktes

Der zur Realisierung des ersten Punktes wird auf die OpenCV-Funktion Camshift aufgebaut.

Für die Erkennung der Kopflage war angedacht, mehrere markante Gesichtsmerkmale wie Augenbrauen und Mund oder Nase zu detektieren und aus deren die Kopflage zu berechnen. So deutet eine Verkleinerung des Abstandes der Augenbrauen bei gleichzeitiger Verschiebung des Mundes nach Rechts auf eine Rechtsdrehung des Kopfes hin. Würde der Abstand der Augenbrauen konstant bleiben und nur die Position des Mundes sich ändern wäre dies nur eine Änderung des Kopfes innerhalb des Bildausschnittes.

Ist die Kopflage und somit der "Offset" des Kopfes bekannt. Kann über die detektion der Pupillen die Blickrichtung und somit die Cursorposition berechnet werden.

Eyeswebproblem

Zu Anfang war geplant das Projekt mittels EyesWeb durchzuführen allerdings wurde aus nachfolgenden Gründen diese Idee wieder verworfen und eine Realisierung direkt in C vornommen.

  • Kein direkter C-Import in EyesWeb
  • EyesWeb-Block-Erstellung setzt passende EyesWeb-, OpenCV-, MS Visual-Studio- und MS Windows-Version voraus. Und selbst dann ging es immer noch nicht.
  • Handhabung zu kompliziert
  • Zu wenig Arbeitserleichterung

Detektions-Algorithmen

Beim Camshift wird das Gesicht einmal manuell ausgewählt, Camshift ermittelt dann von diesem Ausschnitt das Histogramm und sucht anschließend in allen weiteren Frames nach einer Übereinstimmung mit diesem Histogramm.

Weitere Detektions-Algorithmen sind die sogenanten Haar-Algorithmen. Diese Erkennen Objekte durch Pattern-Matching. Entsprechende Pattern liegen in einem XML-File (Muss man haben oder sehr aufwendig erzeugen). Beispiel: Auge, Augenpaar, Nase, Mund, Gesicht.

Detektion

Version 1: Verfolgung des gewählten Gesichtes mit Camshift Detektion der Augen und Mund mit CV-Haar-geteachtem Camshift.

Konzept: Schneller CamShift mit selbständiger, aber aufwendiger Erkennung kombiniert

PROBLEM: Farbzusammensetzung innerhalb des Gesichtes nicht variant genug. Fläche des Augenweißes gegenüber der umgebenden Gesichtsfarbe zu gering. (Integration).


Version 2: Verfolgung des gewählten Gesichtes mit Camshift Detektion der Augen und Mund mit CV-Haar-Detect

PROBLEM: Wie zu erwarten war auf Grund von Performance nicht sinnvoll realisierbar


Lösungsansätze:

  • CV-Haar nur jeden N-ten Durchlauf ausführen => Glättung und puffern der Cursorbewegung
  • Detektionsbereiche weiter einschränken und einzeln für jedes Objekt definieren. (Augen liegen z.B. immer über Mund) => Merklicher Performance-Zuwachs
  • Farbinformation einschränken => Detektierung nicht mehr optimal
  • Funktionsparameter optimieren (Find-Biggest-Object)

Kameraqualität

Wichtig ist, dass die Kamera keine automatische Vorverarbeitung machen Fixe Parameter (kein autom. Weißabgleich etc.)

Resumeé

Auf Grund der obigen Probleme konnte des Programm nicht zufriedenstellend realisiert werden.

Der C-Code des bisher erstellten Programms ist hier zu finden.

Weblinks