Eye-Tracking mit OpenCV (Emgu C#)

eyetrackerlogo

In diesem Beitrag beschäftigen wir uns mit einem Spannenden Thema welches ich schon lange mal behandeln wollte. Eye-Tracking mit einer handelsüblichen Webcam. Ziel ist es die Augenbewegung eines Probanden in Realtime zu erkennen und auf dem PC darzustellen.

Die Erkennung habe ich mit dem Visual Studio 2010 und Emgu C# entwickelt. Emgu C# ist ein Wrapper für das allseits bekannte OpenCV Framework. OpenCV ist eine freie Programmbibliothek mit Algorithmen für die Bildverarbeitung und maschinelles Sehen. Man kann das Projekt natürlich auch ohne „fremdes“ Framework umsetzten. Das geht jedoch meistens zu lasten der Performance eures Projekts.

eyetrackerlogo

Fangen wir an, im Grunde besteht mein Programm aus 2 wesentlichen Operationen.

1. Ein vorher festgelegtes Pattern in dem aktuellen Frame wiederfinden.

2. Pupille im Auge finden und entsprechenden Koordinaten zuordnen.

main

Zuerst rechne ich das Bild auf Graustufen runter um Rechenleistung zu sparen. Danach wird das Pattern im Frame gesucht dazu schneide ich aus dem Original Frame kleine Stücke heraus und vergleiche diese mit dem Pattern auf Differenzen. Wenn man sich jetzt die Stelle mit den wenigsten Differenzen merkt hat man sein Pattern mit großer Wahrscheinlichkeit im Frame wiedergefunden.

In der folgenden Grafik sieht man die Übereinstimmung der Einzelnen Ausschnitte aus dem Original Bild mit dem Pattern wobei das Ergeniss welches am nähsten an der Z-Achse 0 (Oben) ist, die beste Übereinstimmung liefert.

Übereinstimmung als 3D Grafik

Übereinstimmung als 3D Grafik

Um nun die Pupille zu finden habe ich verschiedene Möglichkeiten ausprobiert. Die zuverlässig und zugleich einfachste ist so banal das ich erst gar nicht darauf gekommen bin. Man such sich einfach die dunkelste Stelle im Bildausschnitt. Davon berechne ich jetzt noch die X und Y Koordinaten.

pupille

Das Kalibrieren und die Ausgabe ist jetzt nur noch Spielerei. Noch als kleine Info für das Kalibrieren zeichne ich mehrere Koordiaten-Werte auf und mittel diese so bekommt man ein relativ aussagekräftiges Ergebnis.

Fazit:

Es funktioniert! Als exakte Maussteuerung allerdings nicht zu gebrauchen. Wer jedoch feststellen möchte auf welche X-Achsen Position der Benutzer schaut kann ich das Projekt jedoch wärmstens empfehlen.

Feedback & Fragen in den Kommentaren.

Nico

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.