Dies ist eine alte Version des Dokuments!
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.
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.