Eye-Tracking mit OpenCV (Emgu C#)

Nico Klinger
Eye-Tracking mit OpenCV (Emgu C#)

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.

[gallery ids=“841,840”]

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.

[caption id=“attachment_845” align=“aligncenter” width=“700”]Übereinstimmung als 3D Grafik Übereinstimmung als 3D Grafik[/caption]

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

Über den Autor

N

Nico Klinger

Full-Stack Entwickler und Elektronik-Enthusiast. Verbindet Software mit Hardware zu smarten Lösungen.

PCB Design Analog Schaltung Node.js Embedded Systems Elektronik Simulation
nico@redlabs.de