Download our Code here: icontact_code.zip
Welcome to iContact !
Hier findet ihr die Dokumentation unseres Semesterprojekts iContact - einem Setup für eine Eingabe ohne Hände und Stimme.
Inspiriert wurde unser Projekt durch den Künstler Jason Becker, einem Musiker und Komponisten, der seit seinen 20. Lebensjahr an ALS leidet und er seitdem nur äußerst schwer seiner Leidenschaft weiter folgen konnte. Mithilfe einer Zeichensprache, die Freunde und Familie von seinen Augen ablesen können, ist er allerdings trotzdem immer noch in der Lage zu komponieren.
Unser Ziel ist es, ein Programm zu entwickeln, dass es dem Benutzer ermöglicht, mithilfe von Augenbewegungen Text einzugeben. Dies soll Menschen mit ALS (Krankheit, die zu einer Ganzkörperlähmung und zum Stimmverlust führt) helfen zu kommunizieren. Die Erfassung der Bewegung soll also automatisch geschehen.
Dazu soll mittels einer WebCam die Position der Augen ermittelt und die Bewegung der Pupillen aufgezeichnet und ausgewertet werden. Durch eine spezielle Zeichensprache sollen die Bewegungen in Buchstaben bzw. Befehle übersetzt werden. Optional können Bewegungen mit z.B. den Augenbrauen oder dem Mundwinkeln mit Sensoren wahrgenommen werden. Das werden wir bei ausreichender Zeit hinzufügen.
WebCam und Sensor anschließen, Programm starten, auf Kalibrierung warten und es kann losgehen.
Der Nutzer blickt in verschiedene Richtungen und gibt mit jeweils einem Paar aus zwei Augenbewegungen einen Buchstaben ein.
Eine zusätzliche Bildschirm-„Tastatur“ für Zahlen und Symbole, die Möglichkeit Dateien zu speichern (und Öffnen) sowie einige Optionen zur Konfiguration erweitern die Flexibilität.
Programm abgestürzt, oder versehentlich beendet? Kein Problem, denn eine automatische Sicherung kann den Verlust wiederherstellen. Bei einer Schreibgeschwindigkeit von nur einigen Wörtern pro Minute kommt es auf jeden Absatz an!
Übrigens:
Diese Zeile wurde mit unserem Programm geschrieben (und hierher kopiert)!
Viele Probleme haben wir erst auf die eine, dann auf eine andere Weise gelöst. Am Anfang haben wir z.B. noch keine Gesichtserkennung von OpenCV verwendet, später nur noch Augenerkennung, dann sogar die Nase und zuletzt gar nicht mehr.
Mittlerweile arbeitet unser Programm fast gänzlich ohne externe Libraries, außer Serial und Video für das Einlesen der Daten vom USB-Port und der WebCam.
Stattdessen hat es sich als nützlich erwiesen, selbst einige Klassen und eine Library zu schreiben - eigentlich sogar unbedingt notwendig, da unser Code schon nach anderthalb Monaten unglaublich lang und unübersichtlich zu werden drohte. Besonders kritisch sind natürlich die Aktionen in setup() und draw(), da manche Einstellungen hier kollidieren können und beide Methoden mittlerweile wahrscheinlich weit über 300 Zeilen hätten.
Ein paar Klassen sind hauptsächlich Wrapper für die vereinfachte und abgeschlossene Bedienung der Kamera und der Kommunikation mit dem Arduino. Andere, wie GData, der ECScreen (Eye-Control-Screens) und der EyeTracker sind viel umfangreicher: Sie dienen der Echtzeitbearbeitung der Kameradaten, der Darstellung der Eingabeanweisungen bzw. dem gewaltigen Prozess der Augenkalibrierung und -erkennung sowie dem Auswerten der resultierenden Daten. Die eigene Library ProcessingGUI ist entstanden, weil existierende GUI-Libraries uns nicht ausgereicht haben und generell zum Teil eher weniger zufriedenstellend und flexibel sind (unten mehr dazu).
Unser Projekt lässt sich zwar deutlich in verschiedene Phasen gliedern, aber an vielen Dingen haben wir parallel gearbeitet und einige Aspekte nebenher weiterentwickelt. So sind die Übergänge in den Projektphasen oft eher fließend.
Hier ein genauerer Überblick in unseren Arbeitsprozess und die einzelnen Schritte und Maßnahmen:
<abschnitt> <part> </part> <part> <inhalt> </inhalt> </part> </abschnitt>Damit lassen sich sowohl Listen als auch Baumstrukturen realisieren, nur sind bei den vielen <>>-Tags mit nur wenig Inhalt die ‘<’, ‘>’-Zeichen sehr verschwenderisch, daher sieht unser Ansatz deutlich anders aus: Aus der langen Struktur (hier ohne "Eisenach")...
|<E> | <i> | |<s> | | <e> | | <n> | | <b> | | <a> | | <h> | | <n> | | </n> | | </h> | | </a> | | </b> | | </n> | | </e> | | <b> | | <e> | | <i> | | <n> | | </n> | | </i> | | </e> | | </b> | |</s> | </i> |</E>....wird:
E i s e n b a h n ////// b e i n ///////Dabei schließt ein ‘/’ je einen Tag. Die Zahlen werden je hinter den Buchstaben geschrieben.
E0 i0 s1 e0 n1 b0 a0 h0 n1 ////// b0 e0 i0 n1 ///////Auch das lässt sich noch weiter komprimieren, zum Beispiel können alle Leerzeichen weggelassen werden, wenn die Zahlen durch Steuerzeichen ersetzt werden, die man nicht in normalem Text verwendet (So bleit die Möglichkeit erhalten, auch Ziffern in den "Wörtern" mitzuspeichern). Auch die Nullen (sind am häufigsten) können weggelassen werden, wobei unser Parser stets eine 0 annimmt, wenn keine Zahl dasteht.