Virtuelles Eingabemedium basierend auf optischen Trackingverfahren



Ähnliche Dokumente
Seminar Seminarname SS 2003

Erstellen einer Collage. Zuerst ein leeres Dokument erzeugen, auf dem alle anderen Bilder zusammengefügt werden sollen (über [Datei] > [Neu])

Flyer, Sharepics usw. mit LibreOffice oder OpenOffice erstellen

Datensicherung. Beschreibung der Datensicherung

SANDBOXIE konfigurieren

Wie halte ich Ordnung auf meiner Festplatte?

Pocket KVM Switches USB + Audio

Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen

Dokumentation IBIS Monitor

Fingerpulsoximeter. A. Wie führt man einen Echtzeitdatentransfer vom PULOX PO-300 zum Computer durch und speichert diese Messdaten auf dem PC?

teischl.com Software Design & Services e.u. office@teischl.com

Word 2010 Grafiken exakt positionieren

Er musste so eingerichtet werden, dass das D-Laufwerk auf das E-Laufwerk gespiegelt

Produktschulung WinDachJournal

Erstellen von x-y-diagrammen in OpenOffice.calc

Tapps mit XP-Mode unter Windows 7 64 bit (V2.0)

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Mit der Maus im Menü links auf den Menüpunkt 'Seiten' gehen und auf 'Erstellen klicken.

Kontakte Dorfstrasse 143 CH Kilchberg Telefon 01 / Telefax 01 / info@hp-engineering.com

Einrichtung des Cisco VPN Clients (IPSEC) in Windows7

Windows 8 Lizenzierung in Szenarien

Primzahlen und RSA-Verschlüsselung

Platinen mit dem HP CLJ 1600 direkt bedrucken ohne Tonertransferverfahren

Eigenen Farbverlauf erstellen

Datenbanken Kapitel 2

Handbuch Fischertechnik-Einzelteiltabelle V3.7.3

Handbuch B4000+ Preset Manager

Erstellen einer digitalen Signatur für Adobe-Formulare

10.1 Auflösung, Drucken und Scannen

PowerPoint: Text. Text

Dieser Ablauf soll eine Hilfe für die tägliche Arbeit mit der SMS Bestätigung im Millennium darstellen.

Zwischenablage (Bilder, Texte,...)

Carolo Knowledge Base

ACHTUNG: Es können gpx-dateien und mit dem GP7 aufgezeichnete trc-dateien umgewandelt werden.

1. Allgemein Speichern und Zwischenspeichern des Designs Auswahl der zu bearbeitenden Seite Text ergänzen Textgrösse ändern 3

Was ist PDF? Portable Document Format, von Adobe Systems entwickelt Multiplattformfähigkeit,

Kapitel 3 Frames Seite 1

Hinweise zum Übungsblatt Formatierung von Text:

Jederzeit Ordnung halten

Kapitel 3 Bilder farblich verändern - Arbeiten mit Objekten

Anleitung über den Umgang mit Schildern

S/W mit PhotoLine. Inhaltsverzeichnis. PhotoLine

Welche Unterschiede gibt es zwischen einem CAPAund einem Audiometrie- Test?

Bilder zum Upload verkleinern

Outlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang

Persönliches Adressbuch

4D Server v12 64-bit Version BETA VERSION

Bildbearbeitung mit dem Programm REGISTAX 5.1 bei Planeten

Tutorial Speichern. Jacqueline Roos - Riedstrasse 14, 8908 Hedingen, jroos@hispeed.ch -

AGROPLUS Buchhaltung. Daten-Server und Sicherheitskopie. Version vom b

Eigene Dokumente, Fotos, Bilder etc. sichern

Lieferschein Dorfstrasse 143 CH Kilchberg Telefon 01 / Telefax 01 / info@hp-engineering.com

Grafikbausatz Overlays Profi. für iphone/pocket Visu & PC Visualisierungen

1. Zuerst muss der Artikel angelegt werden, damit später die Produktvarianten hinzugefügt werden können.

C++ Tutorial: Timer 1

Satzhilfen Publisher Seite Einrichten

Domino Feldplaner 3.3

In 12 Schritten zum mobilen PC mit Paragon Drive Copy 11 und Microsoft Windows Virtual PC

How to do? Projekte - Zeiterfassung

Memeo Instant Backup Kurzleitfaden. Schritt 1: Richten Sie Ihr kostenloses Memeo-Konto ein

Erweitertes Kalkulationsfenster

Leitfaden zur ersten Nutzung der R FOM Portable-Version für Windows (Version 1.0)

Professionelle Seminare im Bereich MS-Office

Comic Life 2.x. Fortbildung zum Mediencurriculum

Artikel Schnittstelle über CSV

Anwendungsbeispiele. Neuerungen in den s. Webling ist ein Produkt der Firma:

SICHERN DER FAVORITEN

Matrix42. Use Case - Sicherung und Rücksicherung persönlicher Einstellungen über Personal Backup. Version September

Inhaltsverzeichnis. Handbuch zur Installation der Software für die Bürgerkarte

EasyWk DAS Schwimmwettkampfprogramm

Handbuch. Artologik EZ-Equip. Plug-in für EZbooking version 3.2. Artisan Global Software

Stift-Karussell in M-Plot einrichten

Advanced Rendering Interior Szene

GEVITAS Farben-Reaktionstest

Step by Step Webserver unter Windows Server von Christian Bartl

Programme im Griff Was bringt Ihnen dieses Kapitel?

SAMMEL DEINE IDENTITÄTEN::: NINA FRANK :: :: WINTERSEMESTER 08 09

Programmierkurs Java

Konzepte der Informatik

Bilder Schärfen und Rauschen entfernen

Navigieren auf dem Desktop

Ich möchte eine Bildergalerie ins Internet stellen

Windows. Workshop Internet-Explorer: Arbeiten mit Favoriten, Teil 1

1. LINEARE FUNKTIONEN IN DER WIRTSCHAFT (KOSTEN, ERLÖS, GEWINN)

Stellen Sie bitte den Cursor in die Spalte B2 und rufen die Funktion Sverweis auf. Es öffnet sich folgendes Dialogfenster

Erste Schritte und Bedienungshinweise mit chiptan (ausführliche Anleitung)

Ein Leitfaden für Anfänger unter Zuhilfenahme frei verfügbarer Software! (bei z.b. Google Microsoft Powertoys suchen, oder diesen Link verwenden )

IBM Software Demos Tivoli Provisioning Manager for OS Deployment

Daten-Synchronisation zwischen dem ZDV-Webmailer und Outlook ( ) Zentrum für Datenverarbeitung der Universität Tübingen

Task: Nmap Skripte ausführen

Zeichen bei Zahlen entschlüsseln

Inhalt. 1 Einleitung AUTOMATISCHE DATENSICHERUNG AUF EINEN CLOUDSPEICHER

Adobe Photoshop. Lightroom 5 für Einsteiger Bilder verwalten und entwickeln. Sam Jost

TrekStor - ebook-reader TrekStor (TS) Edition - Firmware-Update

TeamSpeak3 Einrichten

virtuos Leitfaden für die virtuelle Lehre

Suche schlecht beschriftete Bilder mit Eigenen Abfragen

Nach der Anmeldung im Backend Bereich landen Sie im Kontrollzentrum, welches so aussieht:

Zahlen auf einen Blick

Transkript:

Virtuelles Eingabemedium basierend auf optischen Trackingverfahren Sabine Bamberger DIPLOMARBEIT eingereicht am Fachhochschul-Diplomstudiengang Medientechnik und -design in Hagenberg im Juni 2004

c Copyright 2004 Sabine Bamberger Alle Rechte vorbehalten ii

Erklärung Hiermit erkläre ich an Eides statt, dass ich die vorliegende Arbeit selbstständig und ohne fremde Hilfe verfasst, andere als die angegebenen Quellen und Hilfsmittel nicht benutzt und die aus anderen Quellen entnommenen Stellen als solche gekennzeichnet habe. Hagenberg, am 16. Juni 2004 Sabine Bamberger iii

Inhaltsverzeichnis Erklärung Danksagung Kurzfassung Abstract iii v vi vii 1 Einleitung 1 1.1 Zielsetzung...... 1 1.2 Aufbau der Arbeit...... 2 2 Trackingsysteme 3 2.1 WasistTracking?... 3 2.1.1 MechanischesTracking... 4 2.1.2 Magnetisches Tracking.... 4 2.1.3 AkustischesTracking... 5 2.1.4 InertialTracking... 5 2.1.5 OptischesTracking... 6 2.1.6 HybridesTracking... 6 2.2 OptischeFingertrackingverfahren... 7 2.2.1 TrackingdurchFarb-Segmentierung... 7 2.2.2 Konturbasiertes Tracking......... 8 2.2.3 Detektion durch Korrelation........ 9 2.2.4 Markerbasiertes Tracking......... 9 3 Konzept und Design 11 3.1 AnforderungenundFunktionsumfang... 11 3.1.1 CamShiftBoard... 11 3.1.2 LaserBoard... 12 3.2 Aufbau der Hardware.... 13 3.2.1 CamShiftBoard... 13 3.2.2 LaserBoard... 13 3.3 Aufbau der Software..... 16 iv

INHALTSVERZEICHNIS v 3.4 Keyboard Design... 17 4 Implementierung 20 4.1 VerwendeteBibliotheken... 20 4.1.1 OpenCV... 20 4.1.2 LibXml2... 21 4.2 Initialisierung... 22 4.3 CamShiftBoard... 24 4.3.1 Kalibrierung..... 24 4.3.2 Camshift-Algorithmus.... 24 4.4 LaserBoard... 34 4.4.1 Kalibrierung..... 34 4.4.2 Blobanalyse... 37 4.5 xmlparser... 42 4.6 Auswertung der getrackten Koordinaten..... 45 5 TrackBoard 47 5.1 Bedienung... 47 5.1.1 CamShiftBoard... 47 5.1.2 LaserBoard... 48 6 Verwandte Arbeiten 50 6.1 Keyboards mit Sensoren... 50 6.1.1 Senseboard Virtual Keyboard....... 50 6.1.2 KITTY... 51 6.1.3 Lightglove... 52 6.1.4 InkLink... 53 6.2 Projizierte Keyboards.... 54 6.2.1 VKey - Virtual Keyboard......... 54 6.2.2 Siemens-Smartphone SX1......... 54 7 Weiterentwicklungen 57 7.1 TrackingmitInfrarot... 57 7.2 Alternative Eingabeflächen... 59 8 Resumée 62 Literaturverzeichnis 63

Danksagung Ich möchte mich bei all jenen Menschen bedanken, die mich in der Zeit während der Diplomarbeit bewusst oder auch unbewusst unterstützt haben. Besonders möchte ich mich bei meinem Betreuer DI Dr. Michael Haller bedanken, der mich zu diesem Thema motivierte. Er stand mir jederzeit mit Rat und Tat zur Seite und gab mir genügend Druck, der mich bis zum ersten Termin im Juli fertig werden ließ und mir so einen schönen Sommer ermöglicht. Weiters gebührt mein Dank meinem Freund Daniel Schwarzenberger, der sehr viel Verständnis zeigte, wenn wieder einmal wegen dieser Arbeit keine Zeit für ihn blieb. Er gab mir stets Rückhalt und hatte in stressigen und von Verzweiflung geprägten Momenten immer aufmunternde Worte für mich parat. Schließlich möchte ich mich noch bei meinen Kollegen des Jahrgangs 2000 bedanken, mit denen ich in den letzten vier Jahren eine wirklich schöne Zeit verbringen durfte. Ich werde mich immer gerne daran erinnern. vi

Kurzfassung In den letzten Jahren ist die Bedeutung von mobilen Kommunikations- und Informationssystemen stetig größer geworden. Dabei sind diese Systeme immer mehr zusammengewachsen. Heutzutage ist z. B. der Persönliche Digitale Assistent (PDA) längst nicht nur noch der verlängerte Arm für den Desktop-PC. Auch dem Mobiltelefon kommt eine weitaus größere Rolle zu, als noch vor ein paar Jahren. Mittlerweile wird das Handy nicht nur zum Telefonieren genutzt, sondern auch zum Surfen im Internet, zum Chatten und für vieles mehr. Nicht zu Vergessen die große Beliebtheit der so genannten SMS (Short Message Service). Doch die Eingabemöglichkeiten sind auf Grund der immer kleiner werdenden Geräte sehr beschränkt, da z. B. der Ziffernblock eines Telefons deutlich weniger Tasten bietet als das Alphabet Buchstaben enthält. Auch bei PDAs, die im Gegensatz zu Mobiltelefonen mit berührungsempfindlichen, stiftgesteuerten Kleinbildschirmen ausgestattet sind, ist die Zeicheneingabe eher mühsam. Im Rahmen dieser Diplomarbeit soll nun die Grundlage zur Lösung dieser Probleme geschaffen werden. Es handelt sich hierbei um die Implementierung eines virtuellen Eingabemediums, das auf optischen Fingertrackingverfahren basiert. Das Hauptaugenmerk liegt dabei auf einer virtuellen Tastatur, die auf jede glatte Oberfläche mittels eines Projektors in Originalgröße projiziert werden kann. Der Benutzer kann nun wie gewohnt mit dem 10- Finger-System seine Texte eingeben, jedoch ohne jeglichen physischen Widerstand der Tasten. Damit soll auch die Basis für weitere Eingabemöglichkeiten, wie z. B. eine Maus, geschaffen werden. vii

Abstract In recent years the importance of mobile communications and information systems has been steadily increasing. Thereby, these systems grew together. Nowadays, the Personal Digital Assistant (PDA) for example is no longer the extended arm for the Desktop PC but merely an independent device. Also, the mobile phone plays a more important role than just a few years ago. Meanwhile, the cell phone is not only used for telephony, but also to surf the web, to chat and much more. Not to forget the large popularity of Short Message Service (SMS). But the input devices are very limited due to the small size. The numerical pad of a telephone for example clearly offers fewer keys than the number of letters in the alphabet. Also, with PDAs, which are equipped with touch-sensitive displays, usually used together with a stylus, typing texts is rather painful. This thesis is an approach to solve these problems by designing a virtual input medium based on optical fingertracking. The main focus lies on a full size virtual keyboard which can be projected on any flat surface. The users are able to type their texts using the 10-finger typing system, but without any physical response from the keys. This approach could also be the basis for exploring further input methods, as for example a virtual mouse. viii

Kapitel 1 Einleitung Der Markt wird immer mehr von mobilen Geräten übersäht. Dazu gehören Pocket PCs, PDAs, Smart Phones und noch vieles mehr. Diese Geräte werden nun immer kleiner und leichter und dadurch wird es aber dem Benutzer mehr und mehr erschwert, Daten bequem und schnell einzugeben, da ja wegen der Größe der Geräte auf eine brauchbare Tastatur z. B. verzichtet wird. Die Texteingabe ist somit meist sehr eingeschränkt bzw. sehr umständlich, da man z. B. jedes einzelne Zeichen mit einem Stift oder anhand eines Zifferblocks eingeben muss. Aber nicht jeder hat so flinke Finger wie mancher Teenager, der eine SMS in Sekundenschnelle in die Handy-Tasten haut. 1.1 Zielsetzung Ziel dieser Arbeit ist es, ein virtuelles Eingabemedium zu implementieren, das auf optischen Fingertrackingverfahren basiert und als Grundlage zur Lösung des oben geschilderten Problems dienen soll. Diese Anwendung trägt den Namen TrackBoard und setzt sich aus zwei Prototypen zusammen, denen jeweils ein anderes optisches Trackingverfahren zur Lokalisierung der Finger zu Grunde liegt. Die Hauptfunktion liegt dabei auf einer virtuellen Tastatur, die mittels eines Projektors auf eine glatte Oberfläche projiziert wird. Die projizierte Fläche hat dieselbe Größe wie eine normale Tastatur. Dem Anwender ist mit etwas Übung möglich, seine Texte wie gewohnt mit dem 10-Finger-System einzugeben. Da bereits ähnliche Produkte am Markt existieren, ist es das Ziel, ein Eingabemedium zu implementieren, das beliebig erweitert werden kann, wie zum Beispiel die Möglichkeit, eigene Keyboardlayouts zu kreieren. Im Rahmen dieser Arbeit sollen die Konzepte und Grundlagen vorgestellt werden, auf denen der funktionierende und ausbaufähige Prototyp aufbaut. Darüber hinaus werden auch Ansätze anderer Projekte vorgestellt. 1

KAPITEL 1. EINLEITUNG 2 1.2 Aufbau der Arbeit Diese Arbeit und der Inhalt der einzelnen Kapitel gliedern sich wie folgt: Kapitel 2 erklärt den Begriff Tracking und gibt einen Überblick über Trackingsysteme, im Speziellen auch über Fingertrackingsysteme. Kapitel 3 stellt die Konzeption und den Systemaufbau von TrackBoard vor. Es werden die einzelnen Komponenten näher erläutert wie auch die dazugehörigen Hardware-Setups. Kapitel 4 stellt den Kern dieser Arbeit dar. Es wird die Implementierung des Konzeptes aus Kapitel 3 dargestellt. Dabei werden die verwendeten Algorithmen, um einen Finger zu tracken, genau erklärt. Kapitel 5 erklärt die Anwendung TrackBoard. Es wird darauf eingegangen, was bei der Bedienung von TrackBoard zu beachten ist. Kapitel 6 gibt einen Überblick über verwandte Arbeiten. Dabei wird zwischen Eingabemedien mit Sensoren und Eingabemedien mit projizierten Interaktionsflächen unterschieden. Kapitel 7 beschreibt die geplanten Weiterentwicklungen der Anwendung TrackBoard. Kapitel 8 bildet den Abschluss dieser Arbeit.

Kapitel 2 Trackingsysteme Im folgenden Abschnitt werden die Grundlagen für das Verständnis dieser Arbeit gelegt. Zunächst wird der Begriff Tracking erläutert, anschließend wird ein Überblick über existierende Trackingsysteme, im speziellen auch Fingertrackingsysteme, gegeben und dieser näher beleuchtet. 2.1 Was ist Tracking? Das Wort Tracking kommt aus dem Englischen und heißt übersetzt verfolgen. Tracking bedeutet das fortlaufende Ermitteln der Position und Orientierung von Benutzern (Körperteilen), Interaktionsgeräten und Objekten. Gerade für virtuelle Eingabemedien ist die Position und Orientierung von Hand/Finger von großer Relevanz. Trackingsysteme werden wie folgt eingeteilt [30]: Mechanisches Tracking Magnetisches Tracking Akustisches Tracking Inertial Tracking Optisches Tracking Hybrides Tracking Diese Trackingsysteme werden in folgenden Abschnitten näher in Betracht genommen. 3

KAPITEL 2. TRACKINGSYSTEME 4 (a) (b) Abbildung 2.1: (a) Mechanische Systeme am Oberkörper, (b) mechanischer Arm [7]. 2.1.1 Mechanisches Tracking Ein mechanischer Tracker ist vergleichbar mit dem haptischen Empfindungssystem beim Menschen. Es muss eine physikalische Verbindung zwischen zu trackendem Objekt und Messinstrument geben (siehe Abbildung 2.1(a)), z. B. einen beweglichen mechanischen Arm, der am Objekt befestigt ist. Bewegt sich nun das Objekt, so tut dies auch der Arm, dessen Positionsveränderung dann gemessen wird. Mechanische Tracker können z. B. genutzt werden um reale Objekte zu digitalisieren [7]. Man fährt dabei mit einem Stift, der an einem mechanischen Gelenkarm befestigt ist (siehe Abbildung 2.1(b)), die Konturen eines Modells nach. Die Bewegung wird aufgezeichnet und auf dem Monitor sichtbar gemacht. Durch die Änderung der Winkel in den Gelenken kann die abgefahrene Strecke rekonstruiert werden. 2.1.2 Magnetisches Tracking Ein solches System besteht aus einem Transmitter, der ein Magnetfeld um sich herum aufbaut und kleinen Sensoren, deren Position und Rotation in diesem Feld von einem Messgerät bestimmt werden kann (vgl. Abbildung 2.2). Die elektromagnetische Senderspule wird von einem Strom I durchflossen, dadurch entsteht ein elektromagnetisches Feld, welches in den Empfängerspulen eine Spannung U induziert. Aus der gemessenen Spannung und der geometrischen Anordnung der Spulen im Empfänger lassen sich Position und Orientierung des Sensorelements berechnen.

KAPITEL 2. TRACKINGSYSTEME 5 U I Quelle Elektromagnetisches Feld Sensor U Abbildung 2.2: Schema eines elektromagnetischen Trackingsystems [6]. Abbildung 2.3: InertiaCube der Firma Intersense [11]. 2.1.3 Akustisches Tracking Bei diesem System wird die Position von Objekten mit Hilfe von Ultraschallwellen ermittelt. Ein Sender strahlt Ultraschallwellen aus, die von einem oder mehreren Mikrophonen registriert werden. Die Position des Anwenders wird durch Laufzeit- und Phasendifferenzmessungen ermittelt. Eine übliche Konfiguration ist, drei Mikrophone in einem Dreieck anzuordnen und aus den Laufzeitdifferenzen die Position des Senders zu errechnen. 2.1.4 Inertial Tracking Dieses System ist ein Tracker, der auf Trägheitssensoren basiert. Zu diesen Sensoren zählen Beschleunigungsmesser, die die Beschleunigung in x-, y- und z-richtung messen, und Gyroskopsensoren, die die Orientierung im Raum ermitteln. Der InertiaCube von Intersense (siehe Abbildung 2.3) ist in der Lage, Orientierung in x, y und z sowie lineare Beschleunigung in diesen drei Richtungen zu messen.

KAPITEL 2. TRACKINGSYSTEME 6 Target Reference Reference Target (a) (b) Abbildung 2.4: (a)inside-out-verfahren: Die Kamera, hier dargestellt als target, bewegt sich um das Objekt herum; (b)outside-in-verfahren: Die Kamera, hier dargestellt als reference, ist fixiert und das Objekt bewegt sich [22]. 2.1.5 Optisches Tracking Beim optischen Tracking wird zwischen zwei Techniken unterschieden. Das Inside-out-Verfahren und das Outside-in-Verfahren unterscheiden sich darin, ob die Sensoren auf dem Objekt und die Signalquellen im Raum angebracht sind oder umgekehrt. Inside-out Systeme: Sensoren werden am Target angebracht und tasten die Verschiebung von Merkmalen (wie z. B. LEDs, reflektierende Marker usw.) in der räumlichen Umgebung ab (siehe Abbildung 2.4(a)). Outside-in Systeme: Sensoren werden im Referenzsystem fixiert und tasten die Bewegung des Targets ab [2] (siehe Abbildung 2.4(b)). Als Sensoren kommen z. B. Kameras oder auch Photodioden zum Einsatz. In Abbildung 2.5 ist je ein Beispiel für das Inside-out und für das Outsidein-Verfahren zu sehen. Optisches Tracking sollte nur dann eingesetzt werden, wenn freie Sichtverbindungen zwischen Objekt und Sensorik möglich ist, da dann die höchste Genauigkeit erzielt werden kann. 2.1.6 Hybrides Tracking Die Bezeichnung hybrides Tracking steht für eine Kombination mehrerer verschiedener Verfahren. Idealerweise versucht man hierbei, dass eine Technik die Nachteile einer weiteren kompensiert oder zumindest abschwächt und umgekehrt.

KAPITEL 2. TRACKINGSYSTEME 7 (a) (b) Abbildung 2.5: (a) stellt ein Beispiel für das Inside-out-Verfahren dar und (b) für das Outside-in-Verfahren, wobei vier Kameras angebracht sind, die die am Handschuh angebrachten reflektierenden Marker tracken [22]. 2.2 Optische Fingertrackingverfahren Die meisten Fingertrackingsysteme haben das Ziel, Eingabegeräte wie Maus oder Tastatur zu ersetzten. Dafür ist es aber nötig eine stabile Lokalisierung der Hand oder des Fingers zu gewährleisten. In den nächsten Abschnitten werden einige Fingertrackingverfahren vorgestellt. 2.2.1 Tracking durch Farb-Segmentierung Das mit am häufigsten genutzte Trackingverfahren zur Lokalisierung der Hand oder des Fingers ist die so genannte Farb-Segmentierung. Hier werden aus einem Farb-Kamerabild Regionen, die der Hautfarbe entsprechen, extrahiert. Diese Segmentierung erfolgt meist mit Hilfe von Farbhistogrammen, die die Verteilung der Farbtöne von Haut wiedergeben. Es erfolgt eine Aufteilung in Hautfarbbereiche und Nicht-Hautfarbbereiche. Die so (a) (b) Abbildung 2.6: (a) Kamerabild (b) und die dazugehörige Segmentierung von Hautfarbe [5]. entstandenen Regionen werden im Kamerabild getrackt. Dieses Tracking-

KAPITEL 2. TRACKINGSYSTEME 8 system setzt jedoch voraus, dass gute Lichtverhältnisse herrschen und dass keine anderen Objekte, die ähnlich der Hautfarbe sind, wie z. B. Möbelstücke aus hellem Holz, sich im Kamerabild befinden. Ein Beispiel für das Tracking mit Farb-Segmentierung ist der Camshift- Algorithmus (vgl. Abschnitt 4.3.2). Oft wird Ansatz der Farb-Segmentierung mit dem nächsten beschriebenen Ansatz, das Konturbasierte Tracking, kombiniert, um so eine höhere Genauigkeit zu erzielen. 2.2.2 Konturbasiertes Tracking In [18] wird ein Trackingsystem beschrieben, das anhand der Konturen einen Finger im Kamerabild trackt. Mit der beschriebenen Anwendung ist es möglich, ein einfaches Blatt Papier als Graphiktablett zu nutzten. Mit der Fingerspitze des Zeigefingers wird gezeichnet. Dabei kann sogar die Liniendicke kontrolliert werden (vgl. Abbildung 2.7(b)), indem der Winkel des Zeigefingers relativ zur Hand ermittelt wird. Der Daumen kann Mausklicks generieren. (a) (b) Abbildung 2.7: (a) Konturbasiertes Tracking der Finger, (b) mit dem Winkel des Zeigefingers kann die Dicke der zu zeichnenden Linie bestimmt werden [18]. Es wird zuerst die Anfangsposition der Hand im Kamerabild mittels Farb-Segmentierung bestimmt. Die Konturen der Hand werden anhand von Übereinstimmungen von vordefinierten Kontursegmenten, z. B. die Konturen eines einzelnen Fingers, mit dem Ergebnis des mit einem Kantendetektor- Filters neu berechneten Kamerabildes gefunden. Die so ermittelten Konturen werden mit dem so genannten Condensation-Algorithmus getrackt. Condensation steht für Conditional Density Propagation. Der Algorithmus verfolgt mit Hilfe eines probabilistischen Ansatzes, der die konkurrierende Betrachtung verschiedener Handlungshypothesen erlaubt, ein Objekt in einer Videoszene. Genauere Informationen zu diesem Algorithmus sind unter [12] zu finden.

KAPITEL 2. TRACKINGSYSTEME 9 2.2.3 Detektion durch Korrelation Zur Auffindung von Hand- oder Gesichtspositionen ist das Wissen um deren Farbe bei der Einschränkung des Suchraums hilfreich. In diesem Suchraum kann dann per Template Matching nach einem bekannten Muster, z. B. die zuletzt beobachtete Handform, gesucht werden. Unter Template Matching versteht man den Vergleich ( Matching ) eines in Rasterform vorliegenden Prototypen eines Musters ( Template ) mit einem zu untersuchenden Rasterbild. Für jede Position im Rasterbild wird die Korrelation (wechselseitige Beziehung) zwischen dem Prototyp und dem korrespondierenden Bildbereich ermittelt [8]. (a) (b) (c) Abbildung 2.8: (a) ist das Kamerabild, (b) ist das Template der Hand und (c) zeigt das Ergebnis der 2D-Korrelation von Template und Kamerabild, die hellen Bereiche zeigen Positionen mit hoher Übereinstimmung an, in diesem Fall die Hand [4]. Eine Anwendung dieses Trackingverfahrens wird in [4] beschrieben. Es handelt sich hierbei um die Steuerung des Fernsehers mit Hilfe von Handbewegungen. 2.2.4 Markerbasiertes Tracking Eine weitere Möglichkeit, um einen Finger in einem Kamerabild zu lokalisieren, ist die Zuhilfenahme von Markern. In [3] wird so ein System beschrieben. Es handelt sich hierbei um reflektierende Marker, die an einem Handschuh angebracht sind (siehe Abbildung 2.9(a)) und von einer Infrarot- Diode beleuchtet werden. Das System besteht aus zwei Kameras an denen auch die Infrarot-Dioden angebracht sind, damit die Marker in die Richtung der Kameras reflektieren.

KAPITEL 2. TRACKINGSYSTEME 10 Die Kameras sind mit Infrarot-Filtern ausgestattet, um so den störenden Hintergrund herauszufiltern (vgl. Abbildung 2.9(b)). (a) (b) Abbildung 2.9: (a) Handschuh mit reflektierenden Markern, (b) Kamerabild mit durch IR-Dioden reflektierende Marker und herausgefiltertem Hintergrund [3].

Kapitel 3 Konzept und Design Ziel dieser Arbeit ist es, ein Eingabemedium für einen Personal Computer zu entwerfen auf der Basis von verschiedenen optischen Fingertrackingverfahren. In diesem Kapitel wird die Gesamtstruktur dieser Anwendung in Betracht genommen. Es werden die einzelnen Komponenten näher erläutert wie auch die dazugehörigen Hardware-Setups. 3.1 Anforderungen und Funktionsumfang Das im Rahmen dieser Arbeit entwickelte Programm TrackBoard ermöglicht dem Benutzer die Zeicheneingabe mit seinen Fingern ohne Verwendung einer Tastatur. Um die Finger des Anwenders zu tracken, werden Webcams eingesetzt. Im Laufe der Implementierung sind verschiedene Prototypen entstanden, die jeweils auf einem anderen Trackingverfahren basieren. In den folgenden Abschnitten werden die Prototypen CamShiftBoard und LaserBoard im Einzelnen näher erläutert. 3.1.1 CamShiftBoard Der Ausdruck CamShiftBoard bezeichnet den ersten Prototyp. Der Name leitet sich vom verwendeten Trackingverfahren ab. Es handelt sich hierbei um den so genannten Camshift-Algorithmus, der in Abschnitt 4.3.2 ausführlich erklärt wird. Mit diesem Algorithmus ist es möglich, ein Objekt einer bestimmten Farbe im Kamerabild zu tracken. Der Camshift-Algorithmus ist also nur im Stande, einen Finger im Kamerabild zu verfolgen. Durch diese Einschränkung und der etwaigen Ungenauigkeiten beim Tracking sieht auch das Layout der Eingabefläche sehr einfach aus. Der Benutzer hat die Möglichkeit, die Zahlen von 1 bis 9 an eine Applikation, deren Fenster gerade aktiv ist, anhand einer quadratischen Eingabefläche zu senden. Die Fläche ist dabei in 3x3 Felder unterteilt. Dieses Layout ist in Abbildung 3.1 zu sehen und wird mittels einer XML-Datei definiert (vgl. Abschnitt 3.4). 11

KAPITEL 3. KONZEPT UND DESIGN 12 4 cm 1 2 3 4 cm 4 5 6 7 8 9 Abbildung 3.1: Eingabefläche für den Prototyp CamShiftBoard. Da ein Kamerabild keine Tiefeninformation des von vorne getrackten Fingers liefert, wird eine zweite Webcam benötigt, die den Finger seitlich erfasst, um so die zweite Koordinate ermitteln zu können. 3.1.2 LaserBoard Nachdem das Fingertracking mit dem Camshift-Algorithmus nicht sehr exakt funktioniert, da der Algorithmus stark von den Lichtverhältnissen abhängig ist, war die nächste Überlegung das Fingertracking mit Hilfe von Infrarotlicht zu realisieren. Dieser Ansatz wird in Abschnitt 7.1 genauer beschrieben. Man braucht aber für dieses Trackingverfahren spezielle Hardware, wie Infrarotkamera, optischer Filter und leistungsstarke IR-Dioden. Daher benötigte die Hardwareanschaffung mehr Zeit, als der Zeitrahmen für diese Arbeit zugelassen hätte. Aus diesem Grund wird anstatt der Infrarotdiode ein Linienlaser eingesetzt, daher auch die Bezeichnung Laser- Board. Das Lasermodul projiziert eine dünne rote Linie, die ca. 2mm über der Tischoberfläche verläuft. Berührt der Anwender die Tischoberfläche mit seinem Finger, wird der Fingernagel vom roten Laserstrahl beleuchtet. Diese rote Region wird im Kamerabild extrahiert (siehe Abschnitt 4.4.2) und die Koordinaten dieses Flecks werden mit Hilfe einer Blobanalyse ermittelt. Bei diesem Algorithmus können beliebig viele Finger getrackt werden. Weiters ist die Genauigkeit des Trackingalgorithmus viel höher als beim Camshift-Algorithmus. Dadurch ist ein Layout mit einer viel höheren Anzahl an Unterteilungen für die Eingabefläche möglich, wie zum Beispiel eine gesamte Tastatur. In Abbildung 3.2 ist ein Layout für diesen Prototyp zu sehen. Das Layout wird ebenfalls in einer XML-Datei definiert.

KAPITEL 3. KONZEPT UND DESIGN 13 28 cm 2 cm 2 cm 10 cm Abbildung 3.2: Eingabefläche für den Prototyp LaserBoard. 3.2 Aufbau der Hardware Beide Anwendungen wurden mit Webcams der Marke Philips ToUCam Pro II getestet. Bei manchen Systemen tritt jedoch das Problem auf, dass es abstürzt, sobald zwei Webcams derselben Art angeschlossen werden. Der Grund hierfür ist leider unbekannt. Wird eine dieser Webcams mit einem anderen Modell (z. B. Philips ToUCam Pro I) ersetzt, tritt dieses Problem nicht mehr auf. Für jeden Prototyp ist natürlich ein eigenes Hardware-Setup nötig, die in den folgenden Abschnitten beschrieben werden. 3.2.1 CamShiftBoard Für den ersten Prototyp kommen, wie zuvor erwähnt, zwei Webcams zum Einsatz. Wie in Abbildung 3.3 dargestellt, werden die beiden Webcams im rechten Winkel platziert. Die erste Kamera ermittelt dabei die x-koordinate und die zweite die y-koordinate des getrackten Fingers. Die Webcams werden ca. 18cm von der Eingabefläche entfernt so angebracht, damit die Seitenlänge dieser Fläche das gesamte Kamerabild einnimmt (siehe Abbildung 3.4). Die Eingabefläche befindet sich auf einen 1cm hohen Sockel, da sonst die Kameras diese Fläche nicht erfassen können. 3.2.2 LaserBoard Das Hardware-Setup für den zweiten Prototyp ist schon etwas aufwendiger als beim ersten. Hierfür werden auch zwei Webcams benötigt, da das Blickfeld einer Webcam zu klein ist (ca. 30 ), um die ganze Tastatur zu erfassen. Wie in Abbildung 3.5 ersichtlich, erfasst die erste Kamera also den linken Teil und die zweite den rechten Teil der Tastatur. Die beiden Kameras befinden sich auf kleinen Stativen und zeigen somit von schräg oben auf die Tastatur (siehe Abbildung 3.6(a)), dadurch ist

KAPITEL 3. KONZEPT UND DESIGN 14 18 cm Webcam 1 1 2 3 4 7 5 6 8 9 Webcam 2 18 cm Abbildung 3.3: Hardware-Setup für den Prototyp CamShiftBoard. (a) (b) Abbildung 3.4: (a) Positionierung der Webcams für den Prototyp Cam- ShiftBoard, (b) Kamerabild einer Webcam. es möglich, neben der x-koordinate auch die y-koordinate des getrackten Fingers zu ermitteln. Zusätzlich wird auch ein Lasermodul benötigt. Dabei handelt es sich um einen Laserpointer mit integrierter Linienoptik und einer Laserdiode mit einer Wellenlänge von 635nm (brillantrot). Dieses sehr kleine Lasermodul erzeugt bei ca. 1m Abstand eine ca. 1.5m lange und 1mm breite Linie, die auch bei normaler Raumbeleuchtung gut sichtbar ist. Bei kürzeren Abständen ist die Linie entsprechend kürzer und schmaler. Das Lasermodul ist an einer

KAPITEL 3. KONZEPT UND DESIGN 15 30 cm Webcam 1 Laser Webcam 2 19 cm 28 cm Abbildung 3.5: Hardware-Setup für den Prototyp LaserBoard. (a) (b) Abbildung 3.6: Hardware-Setup für den zweiten Prototyp mit (a) zwei Webcams und einem Lasermodul (b) und einem Projektor vertikal über dem Tisch. weißen Holzplatte so angebracht (vgl. Abbildung 3.6(a)), dass die Laserlinie knapp über der Oberfläche verläuft. Die Tastatur selbst wird mit Hilfe eines Projektors, der vertikal über dem Tisch angebracht ist, projiziert (vgl. Abbildung 3.6(b)).

KAPITEL 3. KONZEPT UND DESIGN 16 3.3 Aufbau der Software Bei der Konzeption der Software-Architektur ist ausschlaggebend, dass der Aufbau sehr modular gehalten ist, um die Applikation entsprechend erweitern zu können. In Abbildung 3.7 ist der schematische Aufbau der Software dargestellt. Initialisierung der Kameras XML-Datei einlesen Kamerabilder '1' Kommandozeilen Argumente '2' CamShiftBoard Kalibrierung LaserBoard Kalibrierung Tracking mit CamShift Algorithmus Tracking mit Blobanalyse Algorithmus x-, y-koordinaten Auswertung der getrackten Koordinaten Tastaturereignisse an aktive Applikation versenden Abbildung 3.7: Schematischer Aufbau der Applikation TrackBoard. Wie aus diesem Blockschaltbild hervorgeht, erfolgt als erster Schritt die Initialisierung der Kameras. Als nächstes wird die XML-Datei, die das Layout für die Eingabefläche definiert, mittels eines XML-Parsers eingelesen. Die eingelesenen Daten werden zur Auswertung weitergegeben. Die Ka-

KAPITEL 3. KONZEPT UND DESIGN 17 merabilder werden abhängig von den Kommandozeilen-Argumenten an den jeweiligen Prototyp übergeben. D. h., wenn das Argument den Wert 1 hat werden die Kamerabilder an den Prototyp CamShiftBoard übergeben und bei einem Wert von 2 an den Prototyp LaserBoard. Beim Prototyp CamShiftBoard wird bei der Kalibrierung die Farbe ermittelt, die im Anschluss mit Hilfe des Camshift-Algorithmus im Kamerabild getrackt wird. Der Prototyp LaserBoard besteht ebenfalls aus Kalibrierung und Tracking- Algorithmus. Bei der Kalibrierung werden die Kameras richtig ausgerichtet und die perspektivisch verzerrten Bilder korrigiert. Der Trackingalgorithmus filtert den Laserstrahl, der sich am Finger abzeichnet, aus dem Bild und ermittelt die Koordinaten dieser Region. Die getrackten Koordinaten werden ausgewertet, d. h. einer Taste zugeordnet, und das richtige Tastaturereignis wird an eine aktive Anwendung verschickt. 3.4 Keyboard Design Um sich von ähnlichen Arbeiten abzuheben, ist der große Vorteil dieser Arbeit, dass das Keyboard Design kein fixes Layout besitzt. Das Layout wird in einer XML-Datei eingelesen. Durch Verändern dieser Datei, kann das Layout nach Belieben angepasst werden. Die Gründe für XML sind: die zugrunde liegende Syntax ermöglicht eine äußerst flexible Datenstrukturierung, Daten können durch Parser leicht ausgelesen werden und XML ist einfach zu implementieren. Der XML-Parser (beschrieben in Abschnitt 4.5) liest die XML-Dateien mit folgender Struktur ein. <?xml version= 1.0 encoding= ISO-8859-1?> <!DOCTYPE keyboard [ <!ENTITY keyboard (size, unitsize, matrix)> <!ELEMENT size (width, height)> <!ELEMENT width (#PCDATA)> <!ELEMENT height (#PCDATA)> <!ELEMENT unitsize (#PCDATA)*> <!ELEMENT matrix (row+)> <!ELEMENT row (numofkeys?, key+)> <!ELEMENT numofkeys (left, right)> <!ELEMENT left (#PCDATA)> <!ELEMENT rigth (#PCDATA)> <!ELEMENT key (unit, character)> <!ELEMENT unit (#PCDATA)> <!ELEMENT character (#PCDATA)> ]>

KAPITEL 3. KONZEPT UND DESIGN 18 Das obenstehende Codefragment beschreibt die Document Type Definition (DTD). Die Aufgabe der DTD ist es, den genauen Aufbau eines XML- Dokuments zu definieren. Es wird angegeben, wo welche Elemente auftreten, in welcher Hierarchie und in welcher Menge. Diese DTD beschreibt, dass ein keyboard die Elemente size, unitsize und matrix enthält. Das Element size enthält die Elemente width und height, welche die Dimensionen des Arrays, indem die eingelesenen XML-Daten gespeichert werden, darstellen. Das Element width gibt also die maximale Anzahl der Tasten in einer Reihe an und height die Anzahl der Tastenreihen. Da die Größe der Tasten in Einheiten angeben werden, definiert das Element unitsize die Größe einer Einheit in Pixel, also die Größe im Kamerabild. Das Element matrix enthält das Element row, welches eine Tastenreihe definiert. Das + gibt hier an, dass das Element matrix 0 bis n Elemente vom Typ row enthalten kann. Dieses Element wiederum enthält die Elemente numofkeys und key. Das Zeichen? bedeutet, dass das Element numofkeys optional ist. Dieses Element enthält left und right, welche angeben, wie viele Tasten einer Reihe (ausgehend vom äußeren Rand der Tastatur) von der linken bzw. rechten Webcam getrackt werden. Dies ist für den Prototyp LaserBoard von großer Relevanz. Jedes Element key, das auch wieder 0 bis n Mal enthalten ist, besteht aus den Elementen unit und character und beschreibt eine Taste. Das Element unit gibt die Breite einer Taste in Einheiten an, so z. B. hat eine Zahlentaste die Breite 1 und die rechte Shifttaste dagegen die Breite 2. Das letzte Element character enthält den so genannten virtual keycode für eine Taste. Virtual keycodes haben einen Wert von 1 bis 254 und dienen dazu, Tastaturereignisse an andere Applikationen zu verschicken. Nachstehend ist ein Auszug aus der XML-Datei für den Prototyp LaserBoard zu sehen: Abbildung 3.8: Die gelben Tasten werden von der linken Webcam erfasst und die blauen Tasten von der rechten.

KAPITEL 3. KONZEPT UND DESIGN 19 <keyboard> <size> <width>14</width> <height>5</height> </size> <unitsize>42</unitsize> <matrix> <row> <numofkeys> <left>8</left> <right>6</right> </numofkeys> <key> <unit>0.5</unit> <character>220</character> </key> <key> <unit>1.0</unit> <character>49</character> </key> <key> <unit>1.0</unit> <character>50</character> </key>... </row>... </matrix> </keyboard> Dieser XML-Code gibt an, dass die Tastatur aus 5 Tastenreihen mit je maximal 14 Tasten besteht und dass eine Einheit 42 Pixel groß ist. D. h., dass z. B. die Taste mit dem Buchstaben z, die eine Einheit groß ist, im Kamerabild 42 Pixel breit und hoch ist. Diese Daten sind relevant, um später die getrackten Koordinaten einer Taste zuordnen zu können. Weiters definiert dieser Codeauszug, dass bei der ersten Tastenreihe die linke Webcam die 8 links äußeren Tasten trackt und die rechte Webcam die 6 rechts äußeren Tasten. Diese Aufteilung ist bei jeder Tastenreihe etwas anders (siehe Abbildung 3.8). Zuletzt werden hier für die ersten drei Tasten der ersten Zeile die Größe und der dazugehörige Keycode definiert. Der Keycode 49 beispielsweise steht für die Ziffer 1. Die XML-Dateien für beide Prototypen sind auf der CD-ROM zu finden.

Kapitel 4 Implementierung Das folgende Kapitel beschreibt die Implementierung des Konzeptes aus Kapitel 3. Es handelt sich hierbei um das Programm TrackBoard, welches in zwei Prototypen umgesetzt wurde, dem CamShiftBoard und dem Laser- Board. Die Implementierung erfolgt in den Programmiersprachen C/C++ unter Verwendung der beiden Bibliotheken OpenCV 1 und libxml2 2, die in den folgenden Abschnitten näher beschrieben werden. 4.1 Verwendete Bibliotheken 4.1.1 OpenCV OpenCV ist die Kurzform für Intel r Open Source Computer Vision Library und ist eine Sammlung von C Funktionen und C++ Klassen, die bekannte Algorithmen im Bereich der Bildverarbeitung und Computer Vision enthalten. Das Softwarepaket wurde von Intel für die Betriebssysteme Linux und Windows entwickelt und wurde erstmals im Jahr 2000 vorgestellt. Für die Implementierung der Applikation, die diese Arbeit beschreibt, wurde die Version 3.1 verwendet, die bei [27] zum Download bereit steht. OpenCV ist kompatibel mit der Intel r Image Processing Library (IPL), die low-level Bildoperationen beinhaltet und bei der mehr als die Hälfte der Funktionen auf Assembler-Ebene optimiert wurden. Dagegen bietet OpenCV neben vielen Grundfunktionen wie zum Beispiel die Binarisierung von Bildern vor allem high-level Funktionen wie [10]: 3D Rekonstruktion Objekterkennung Finden und Manipulieren von Konturen 1 http://www.intel.com/research/mrl/research/opencv/ 2 http://www.xmlsoft.org/ 20

KAPITEL 4. IMPLEMENTIERUNG 21 Distanz-Transformation Kamera-Kalibrierung Histogramme Gesten-Erkennung Matrix-Rechnungen Bewegungsanalyse und Objektverfolgung Zielsetzung dieser Bibliothek ist, die Grundlage für einen breiten Einsatz von Personal Computern im Bereich der Computer Vision zu schaffen. Intel proklamiert als spezielles Einsatzgebiet besonders den Bereich der Echtzeit- Anwendungen. Um alle Funktionen von OpenCV nutzen zu können, muss im Falle eines Windowssystems auch Microsoft DirectX SDK installiert sein. Im Rahmen dieser Arbeit wurde die Version DirectX 9.0 SDK Update (Summer 2003) verwendet. 4.1.2 LibXml2 LibXml2 ist eine freie Programmbibliothek und entstand im Rahmen des GENOME-Projekts 3. Es handelt sich dabei um einen XML-Parser, der vorwiegend auf UNIX-Plattformen Verwendung findet, aber kann auch auf anderen Plattformen benutzt werden. Der Parser liegt als C-Bibliothek vor und der Zugriff erfolgt über Schnittstellen. Vor der Benutzung muss der Parser erst für das Betriebssystem kompiliert werden. Es gibt jedoch auch schon bereits für Windows kompilierte Versionen, die bei [32] zum Download bereit stehen. Es sind mehrere Softwarepakete erhältlich, die in Abhängigkeiten stehen wie in Abbildung 4.1 ersichtlich. Für die Anwendung TrackBoard xmlsec xsldbg libxslt libxml openssl iconv zlib Abbildung 4.1: libxml Package-Abhängigkeiten. sind folgende Softwarepakete notwendig: 3 http://www.gnome.org/

KAPITEL 4. IMPLEMENTIERUNG 22 Iconv: zur Zeichenkodierung Zlib: zur Komprimierung Libxml2: XML Parser und Prozessor Die Implementierung des XML-Parsers (siehe Abschnitt 4.5) erfolgte mit der Version libxml2-2.6.7win32 (ist auf beiliegender CD-ROM enthalten). 4.2 Initialisierung Bei Start der Applikation werden die Kameras initialisiert. Dafür ist nötig, dass für jede Kamera gewisse Eigenschaften gesetzt werden. Die wichtigsten Eigenschaften sind in folgender Liste zu finden: CVCAM PROP ENABLE: selektiert die Kamera, CVCAM PROP RENDER: rendert die Kamera, CVCAM PROP WINDOW: selektiert ein Fenster für den gerenderten Videostream, CVCAM PROP CALLBACK: definiert eine Callback-Funktion, die bei jedem Frame einer Kamera aufgerufen wird, CVCAM STEREO CALLBACK: definiert eine Callback-Funktion, die bei jedem synchronen Frame zweier Kameras aufgerufen wird. Diese Eigenschaften werden mit der Funktion cvcamsetproperty() gesetzt. Der nachstehende Programmcode beschreibt das Initialisieren einer Kamera. //returns the number of available cameras in the system int numofcameras = cvcamgetcamerascount(); if (numofcameras < 1) { printf("unable to attach a camera...\n"); exit(1); } Als erstes wird die Anzahl der zu Verfügung stehenden Kameras im System mit der Funktion cvcamgetcamerascount() abgefragt. Ist die Anzahl der Kameras kleiner als 1, wird die Applikation wieder beendet, da keine angeschlossene Webcam im System gefunden wurde. //selects the first found camera cvcamsetproperty(0, CVCAM_PROP_ENABLE, CVCAMTRUE); // renders the stream from this source cvcamsetproperty(0, CVCAM_PROP_RENDER, CVCAMTRUE);

KAPITEL 4. IMPLEMENTIERUNG 23 Als nächster Schritt werden die ersten zwei Eigenschaften für die Webcam gesetzt, um die Kamera zu selektieren bzw. zu rendern. Dabei steht das erste Argument der Funktion cvcamsetproperty() für die Nummer der Webcam, für die die Eigenschaft gesetzt werden soll. Das zweite Argument definiert den Namen der Eigenschaft, welche gesetzt werden soll und beim dritten Argument wird CVCAMTRUE, was für die Zahl 1 steht, übergeben, um die Eigenschaft zu aktivieren. //creates a window to display the left camera char *winnamel = "Left"; int leftwin = cvnamedwindow (winnamel, CV_WINDOW_AUTOSIZE); HWND HLeft = (HWND)cvGetWindowHandle(winnameL); //selects the window for rendering camera s stream cvcamsetproperty(0, CVCAM_PROP_WINDOW, &HLeft); Nun wird ein Fenster mit dem Namen Left erzeugt. Um anzugeben, dass in diesem Fenster das Kamerabild gerendert werden soll, muss die Eigenschaft CVCAM PROP WINDOW mit einem Zeiger auf den Window-Handler des Fensters gesetzt werden. if (numofcameras == 1) { //this callback is processed every frame cvcamsetproperty(0, CVCAM_PROP_CALLBACK, callback); } Wenn eine Kamera im System gefunden wurde, muss der Name der Callback- Funktion, die nach jedem Frame aufgerufen wird, mit der Kameraeigenschaft CVCAM PROP CALLBACK gesetzt werden. In diesem Fall heißt die Funktion callback. //makes the settings, set by cvcamsetproperty active //and does the final step of cvcam initialization cvcaminit(); cvcamstart(); //The application is working Nach dem Aufruf der Funktionen cvcaminit() und cvcamstart() arbeitet die Applikation (die Funktion callback() oder stereocallback() wird automatisch immer wieder aufgerufen), d. h. jeder Kameraframe wird zur Auswertung abhängig von den Kommandozeilen-Argumenten an die jeweilige Prototyp-Klasse übergeben. cvwaitkey(0); cvcamstop(); //frees all resources used by cvcam cvcamexit(); Die Funktion cvwaitkey() wartet auf ein Tastaturereignis, d. h. die Applikation arbeitet so lange in einem anderen Thread, bis eine Taste gedrückt wird. Aus diesem Grund ist es wichtig, dass beim Schreiben auf der projizierten Tastatur immer ein anderes Fenster als die Applikation selbst aktiv

KAPITEL 4. IMPLEMENTIERUNG 24 ist, da sich sonst die Applikation schließt, wenn an diese ein Tastaturereignis verschickt wird. Nach Initialisierung der Kameras wird abhängig von den Kommandozeilen-Argumenten das Keyboardlayout des jeweiligen Prototypen mit Hilfe des XML-Parsers (siehe Abschnitt 4.5) eingelesen. 4.3 CamShiftBoard Der Name CamShiftBoard bezeichnet den ersten Prototyp. Dem Anwender ist es möglich anhand einer Eingabefläche, die in 3x3 Felder unterteilt ist, die Zahlen von 1 bis 9 mittels seines Fingers an eine Applikation zu versenden. 4.3.1 Kalibrierung Nach dem einlesen des Keyboardlayouts für den ersten Prototyp wird der Benutzer aufgefordert seinen Finger innerhalb des im Kamerabild für zehn Sekunden dargestellten Rechtecks (siehe Abbildung 4.2) zu positionieren. Dieses Rechteck wird in Abschnitt 4.3.2 als Berechnungsfenster bezeichnet. So wird die Farbe, die getrackt werden soll, ermittelt. Nach Verstreichen dieser Zeit wird der Trackingvorgang gestartet. Das Fingertracking wird mit Hilfe des Camshift-Algorithmus, der von OpenCV zu Verfügung gestellt wird, realisiert. (a) (b) Abbildung 4.2: (a) Linkes (b) und rechtes Kamerabild mit eingezeichnetem Berechnungsfenster, aus dem die zu trackende Farbe ermittelt wird. 4.3.2 Camshift-Algorithmus Wie in Kapitel 3 erklärt, wird beim ersten Prototyp der Camshift-Algorithmus verwendet, um einen Finger zu tracken. Camshift heißt in diesem Zu-

KAPITEL 4. IMPLEMENTIERUNG 25 sammenhang Continuously Adaptive Mean Shift und ist eine Weiterentwicklung des Meanshift-Algorithmus, um ein farbiges Objekt zu tracken. Der Meanshift-Algorithmus findet den Schwerpunkt (mean) von farbigen Objekten, indem er den Schwerpunkt eines zu untersuchenden Fensters (wird als Suchfenster bezeichnet) in einem Bild so lange mit dem Schwerpunkt eines Objekts vergleicht, bis diese beinahe übereinstimmen. Die Genauigkeit der Übereinstimmung lässt sich mit einem Schwellwert einstellen. Die Objekte werden anhand einer Farbwahrscheinlichkeitsverteilung bestimmt. Je deutlicher das Objekt sich also farblich vom Hintergrund unterscheidet, desto besser ist es zu tracken. Choose initial search window size and location HSV Image Set calculation region at search window center but larger in size than the search window Use (X,Y) to set search window center 2*area 1/2 to set size. Color histogram lookup in calculation region Color probability distribution image Find center of mass within the search window Center search window at the center of mass and find area unter it Report X, Y, Z and Roll YES Converged? NO Abbildung 4.3: Blockschaltbild des Camshift-Algorithmus, der Meanshift- Algorithmus ist im grauen Fenster dargestellt [1]. Anders gesagt, wird beim Camshift-Algorithmus eine Farbe bestimmt und im Bild eine rechteckige Fläche gesucht, die mit dieser (oder ähnlichen) Farbe gefüllt ist. Von nun an wird versucht, diese einmal bestimmte Farbfläche in jedem Kamerabild neu zu identifizieren. Continuously Adaptive bedeutet, dass die Wahrscheinlichkeitsverteilung sich über der Zeit verändern kann, d. h., dass der Camshift-Algorithmus für Videoströme ge-

KAPITEL 4. IMPLEMENTIERUNG 26 eignet ist. Beim Fingertracking wird also die Hautfarbe in diesem Fenster gesucht und dabei die Position, die Größe und die Neigung des Objekts ermittelt. Der Ablauf des Camshift-Algorithmus erfolgt wie in Abbildung 4.3 dargestellt. Um mit dem Camshift-Algorithmus ein farbiges Objekt zu tracken, ist es zuerst nötig, das Kamerabild vom RGB-Farbraum in einen anderen Farbraum zu konvertieren, da nur der Farbton und nicht Helligkeit oder Farbintensität relevant ist und diese Separation der RGB-Farbraum nicht bietet. Aus diesem Grund ist das HSV-Farbsystem ideal dafür geeignet. Im HSV- Farbraum wird jede Farbe nach folgenden drei Komponenten beurteilt: Farbton (Hue): wird durch den Farbwinkel angegeben, Sättigung (Saturation): gibt an, wie stark der jeweilige Farbton ausgeprägt ist, Helligkeit (Value): gibt die Helligkeit an. Grün H=120 Cyan H=180 Blau H=240 Helligkeit V Weiß V=1 Schwarz V=0 (a) Gelb H=60 Magenta H=300 Rot H=0 Sättigung S Farbtonwinkel H Farbton H Weiß H e l l i g k e i t V Schwarz Farbton H Sättigung S (b) Grün Gelb Cyan Rot Magenta Blau Sättigung S H e l l i g k e i t V Abbildung 4.4: (a) HSV-Farbraum als Pyramide (b) HSV-Farbraum als Kegel (mit Querschnitt) [15]. Wie in Abbildung 4.4 dargestellt, ist die Skala für den Farbton zyklisch, d. h. er wird durch einen Winkel zwischen 0 und 360 um die vertikale Achse beschrieben. Dabei liegt Rot bei 0,Grün bei 120 und Blau bei 240.DieSättigung ist der horizontale Anteil von der Mittelachse bis zum Randpunkt und nimmt Werte zwischen 0 (Graustufe) und 1 (voll gesättigte Farbe) an. Die Helligkeit ist der vertikale Anteil entlang der Mittelachse und läuft von Schwarz (V=0) bis zu den Farben mit maximaler Helligkeit, inkl. Weiß (V=1). Je niedriger der V-Wert (je dunkler also die Farbe),

KAPITEL 4. IMPLEMENTIERUNG 27 desto weniger Sättigung kann noch erreicht werden. Dadurch entsteht die typische Zylinderform des HSV-Farbraums [16]. Um nun ein farbiges Objekt zu tracken, muss man zuerst ein Farbmodell mittels eines 1D-Histogramms erstellen. Dieses Histogramm wird aus dem H-Kanal für das Berechnungsfenster, in dem der Benutzer seinen Finger positionieren muss (siehe Abbildung 4.2), berechnet. Unter einem Histogramm versteht man die statistische Analyse eines Bildes. Es werden die Häufigkeiten der einzelnen Graustufen (in diesem Fall Farbtöne) des Bildes als Säulendiagramm dargestellt, d. h. je häufiger der Tonwert vorkommt, desto höher der Balken im Histogramm. Ein Histogramm für Hautfarbe ist in Abbildung 4.5 zu sehen. Abbildung 4.5: Histogramm aus dem H-Kanal für Hautfarbe. Mit diesem Histogramm wird nun eine Farbwahrscheinlichkeitsverteilung für das gesamte Kamerabild erstellt (siehe Abbildung 4.6). Die Wahrscheinlichkeitswerte reichen hierbei von 0 bis 255. In Abbildung 4.7 sind alle Schritte zur Berechnung der Wahrscheinlichkeitsverteilung dargestellt. (a) (b) Abbildung 4.6: (a) Kamerabild (b) und die dazugehörige Wahrscheinlichkeitsverteilung für Hautfarbe.

KAPITEL 4. IMPLEMENTIERUNG 28 6 Farbwahrscheinlichkeitsverteilung mittels Histogramm 1 RGB-Kamerabild 5 2 Konvertierung in HSV-Farbraum 3 Histogramm 4 H - Kanal mit Berechnungsfenser für Histogramm S - Kanal V - Kanal Abbildung 4.7: Blockschaltbild zur Berechnung der Wahrscheinlichkeitsverteilung. 1. RGB-Bild einer Kamera 2. Konvertierung des Kamerabildes in den HSV-Farbraum 3. Aufteilung in die einzelnen Kanäle des HSV-Farbraums 4. Berechnung des Histogramms aus dem Berechnungsfenster des H-Kanals, dieser Schritt wird nur einmal beim Start des Trackingvorgangs durchgeführt 5. Berechnung der Wahrscheinlichkeitsverteilung aus dem H-Kanal und dem gespeichertem Histogramm (berechnet in Schritt 4) 6. Start des Meanshift-Algorithmus Der Meanshift-Algorithmus ermittelt nun den Schwerpunkt im zuerst angegebenen Suchfensters anhand der Wahrscheinlichkeitsverteilung. Die Reihenfolge des Meanshift-Algorithmus sieht folgendermaßen aus: 1. Wähle die Größe und die Anfangsposition des Suchfensters (entspricht im ersten Schritt dem Berechnungsfenster, das die zu trackende Farbe ermittelt),

KAPITEL 4. IMPLEMENTIERUNG 29 2. Berechne den Schwerpunkt im Suchfenster, d. h. den Punkt mit der größten Dichte an hohen Wahrscheinlichkeitswerten, 3. Zentriere das Suchfenster am Schwerpunkt (berechnet in Schritt 2), 4. Wiederhole Schritt 2 und 3 bis zur Konvergenz (oder bis die Bewegung der Position des Schwerpunktes kleiner ist als der voreingestellte Schwellwert) und speichere das nullte Moment (Bereich oder Größe) sowie die Position der Mitte. Um nun den Schwerpunkt des Suchfensters zu ermitteln, sind das nullte und erste Moment 4 zu berechnen [1]: M 00 = I(x, y) (4.1) (x,y) R Das nullte Moment berechnet die Fläche des Objekts (vgl. in Abbildung 4.8 die Region G). M 10 = (x,y) R xi(x, y) M 01 = (x,y) R yi(x, y) (4.2) Das erste Moment enthält Informationen über den Schwerpunkt des Objekts, d. h. es wird die Summe der Pixelwerte aller x-koordinaten und die Summe der Pixelwerte aller y-koordinaten ermittelt. Der Schwerpunkt (x c,y c ) wird durch x c = M 10 M 00 y c = M 01 M 00 (4.3) berechnet. Dabei ist I(x, y) der Pixelwert an der Position (x, y) im Bild, und x und y verlaufen über das Suchfenster. D. h. um den Schwerpunkt des Suchfensters R in Abbildung 4.8 zu berechnen, wird die Summe der Pixel-Spalten und die Summe der Pixel-Reihen jeweils durch die Anzahl aller Pixel des Suchfensters R (entspricht der Fläche G) geteilt. Der Meanshift-Algorithmus alleine würde als Tracker bei Videosequenzen nicht funktionieren, da sich Objekte annähern und entfernen können. D. h., zu kleine Suchfenster können das Objekt nicht richtig in der Videoszene verfolgen und zu große Suchfenster können auch andere Objekte derselben Farbe enthalten, wie zum Beispiel eine Person im Hintergrund. Darum ist es wichtig, dass sich die Suchfenstergröße dem Objekt immer anpasst. Für den nächsten Videoframe zentriert man das Suchfenster an der Position die im 4. Schritt des Meanshift-Algorithmus gespeichert wurde und setzt die

7 4 1 KAPITEL 4. IMPLEMENTIERUNG 30 G y c R x c Abbildung 4.8: Ermittlung des Massemittelpunkt(x c,y c ): Suchfenster dar und G das zu trackende Objekt. R stellt das Step 1 250 200 150 100 50 0 10 13 16 19 22 10 13 16 19 22 1 3 5 7 9 7 4 1 Step 2 250 200 150 100 50 0 Step 3 250 200 150 100 50 0 11 13 15 17 19 21 23 11 13 15 17 19 21 23 1 3 5 7 9 1 3 5 7 9 Step 4 250 200 150 100 50 0 Step 5 250 200 150 100 50 0 11 13 15 17 19 21 23 11 13 15 17 19 21 23 1 3 5 7 9 Step 6 250 200 150 100 50 0 Abbildung 4.9: Querschnitt einer Farbverteilung von Hautfarbe aus einem Bild mit Kopf und einer Hand [1]. Fenstergröße auf den Wert, den das nullte Moment bestimmt hat. Es wird wieder eine Farbwahrscheinlichkeitsverteilung für diesen Frame errechnet. In Abbildung 4.9 wird der Suchprozess im linken oberen Bild gestartet und im rechten unteren Bild beendet. Bei diesen Bildern handelt es sich beim roten Graph um einen 1D-Querschnitt der aktuellen Wahrscheinlichkeitsverteilung von Hautfarbe aus einen Bild mit einem Gesicht und einer 4 Momente sind Objektmerkmale, die eine geometrische Rekonstruktion von Objekten ermöglichen [13].

KAPITEL 4. IMPLEMENTIERUNG 31 sich links daneben befindenden Hand. Die gelbe Farbe stellt das Camshift Suchfenster dar und blau den aktuellen Schwerpunkt des Fensters. Die y- Achse gibt den Wahrscheinlichkeitswert an und die x-achse die horizontal räumliche Position innerhalb des Originalkamerabilds. Das Suchfenster wird im 1. Bild mit der Größe 3 initialisiert und wird bei jedem Schritt breiter, bis das Suchfenster das gesamte Gesicht beinhaltet, jedoch nicht die Hand. Nach sechs Wiederholungen ist der Schwerpunkt des Gesichts gefunden. Hier wird das typische Verhalten des Camshift-Algorithmus gezeigt. Der Algorithmus findet das Zentrum der naheliegensten Verteilungsfläche (Gesicht) und ignoriert benachbarte Flächen (Hand). Abbildung 4.10 zeigt den nächsten Kameraframe, indem sich Hand und Gesicht etwas nach links bewegt haben. Das Suchfenster startet an der vorher berechneten Position und nähert sich in einer Wiederholung dem neuem Zentrum des Gesichts an. Step 1 Step 2 250 200 150 100 50 0 1 4 7 250 200 150 100 50 0 10 13 16 19 22 1 4 7 10 13 16 19 22 Abbildung 4.10: Nächster Videoframe. Wie schon bereits erwähnt, ermittelt der Camshift-Algorithmus neben der x- und y-koordinate auch die Neigung und die Größe des getrackten Objekts. Dafür muss das zweite Moment errechnet werden. Nähere Informationen sind in [1] zu finden. M 20 = x 2 I(x, y) M 02 = y 2 I(x, y) M 11 = xyi(x, y) (x,y) R Neigung des Objekts wird durch arctan (x,y) R ( M11 2 ( M20 M 00 x 2 c x c y c M ) 00 ) ( M02 M 00 y 2 c Ø= 2 ermittelt. Um die Größe des Objekts zu bestimmen, legt man fest a = M ( ) 20 x 2 M11 c b =2 x c y c M 00 M 00 ) (x,y) R (4.4) (4.5) c = M 02 M 00 y 2 c (4.6)

KAPITEL 4. IMPLEMENTIERUNG 32 und daraus ergibt sich für die Länge l und die Breite w des Objekts (a + c)+ b l = 2 +(a c) 2 (a + c) b w = 2 +(a c) 2. (4.7) 2 2 OpenCV bietet für den Camshift-Algorithmus eine in C++ implementierte Klasse namens CvCamShiftTracker an. Der folgende Codeauszug zeigt die Verwendung dieser Klasse: CvCamShiftTracker m_ccamshift; CvCamShiftParams m_params; CvRect m_object; Die Variable m ccamshift ist eine Instanz der Klasse CvCamShiftTracker und m params ist eine Struktur, in der die Parameter für m ccamshift definiert werden. m object stellt zu Beginn das Berechnungsfenster dar und nach Berechnung des Histogramms das Suchfenster des Camshift-Algorithmus. void CamShift::track_finger(IplImage* image){ if (IsTracking) { ApplyCamShift(image, false); } else { CvSize size = cvgetsize(image); if (IsInit) { m_object.x = cvround(size.width * m_params.x); m_object.y = cvround(size.height * m_params.y); m_object.width = cvround(size.width * m_params.width); m_object.height = cvround(size.height * m_params.height); } } } ApplyCamShift(image, true); IsTracking = true; Die Funktion track finger wird bei jedem Kameraframe, nach Verstreichen der Kalibrierungszeit (beschrieben in Abschnitt 4.3.1) aufgerufen. Beim ersten Aufruf wird der else-zweig betreten, wobei m object zu diesem Zeitpunkt das Berechnungsfenster darstellt, für das nun das Histogramm für den H-Kanal des Kamerabildes mittels der Funktion ApplyCamShift() berechnet wird. Bei jedem weiteren Kameraframe wird nun der if-zweig betreten, in dem das Objekt wieder mittels der Funktion ApplyCamShift() getrackt wird.

KAPITEL 4. IMPLEMENTIERUNG 33 void CamShift::ApplyCamShift(IplImage* image, bool initialize) { m_ccamshift.set_window(m_object) if (initialize) { m_ccamshift.reset_histogram(); m_ccamshift.update_histogram((cvimage*)image); } } m_ccamshift.track_object((cvimage*)image); m_object = m_ccamshift.get_window(); In dieser Funktion wird, wie bereits erwähnt, beim Start des Trackingvorgangs das Histogramm für die zu trackende Farbe mit Hilfe der Funktion update histogram() der Klasse CvCamShiftTracker berechnet, nachdem das Berechnungsfenster m object an diese Klasse übergeben wurde. Schließlich wird das Objekt mitder Funktiontrack object() getrackt und das nun neu berechnete Suchfenster wieder in m object gespeichert. Mit dem Camshift-Algorithmus ist es also möglich, die Größe, Position und Ausrichtung farbiger Objekte zu bestimmen. Jedoch ist das Tracking- Ergebnis sehr vom Umgebungslicht und dem Bildhintergrund abhängig. Des weiteren war festzustellen, dass der Finger zwar getrackt wird, jedoch wenn die gesamte Hand ins Bild kommt, liegt der Schwerpunkt nicht beim Finger sonder am Handrücken (siehe Abbildung 4.11(a)). Für die Applikation ist aber die Position der Fingerspitze relevant. Daher ist die ideale Lösung ein farbiger Fingerhut, der sich vom Hintergrund stark abhebt (siehe Abbildung 4.11(b)). (a) (b) Abbildung 4.11: Kamerabild (a) mit Schwerpunkt am Handrücken und (b) mit Schwerpunkt an der Fingerspitze mit Hilfe eines farbigen Fingerhuts.

KAPITEL 4. IMPLEMENTIERUNG 34 4.4 LaserBoard Die Bezeichnung LaserBoard stellt den zweiten Prototyp dar. Der Benutzer kann auf einer projizierten Eingabefläche alle Zeichen einer Tastatur an eine Anwendung versenden. 4.4.1 Kalibrierung Zuerst müssen die beiden Kameras richtig ausgerichtet werden, um ein exaktes Fingertracking sicherzustellen. Um die Ausrichtung zu erleichtern, wird ein Viereck ins Kamerabild gezeichnet, an dem man sich orientieren kann, d. h. die Eckpunkte des Vierecks entsprechen den Eckpunkten der projizierten Tastatur. Wie in Abbildung 4.12 ersichtlich, wird für jede Kamera ein (a) (b) Abbildung 4.12: Linkes (a) und rechtes (b) Kamerabild mit eingezeichnetem Ausrichtungsviereck. eigenes Viereck benötigt. Die Kameras müssen nun so ausgerichtet sein, dass sich ca. die Hälfte der Tastatur, das schließt auch die Taste mit der Ziffer 7 mit ein, in dem gezeichneten Viereck befindet. In der Applikation selbst ist das Ausrichtungsviereck in blau eingezeichnet, da rote Linien im Kamerabild getrackt und somit falsche Tastaturereignisse verschickt werden würden. Aber aus Gründen der besseren Sichtbarkeit sind in Abbildung 4.12 die Ausrichtungsvierecke in rot eingezeichnet. Da die Tastatur durch die Position der Kameras perspektivisch verzerrt wird, wäre es um einiges schwieriger die getrackten Koordinaten einer Taste zuzuordnen. Aber OpenCV bietet Funktionen, die es ermöglichen perspektivisch verzerrte Bilder zu entzerren. Der nachfolgende Programmcode implementiert diesen Vorgang.

KAPITEL 4. IMPLEMENTIERUNG 35 //points of the quad without distortion CvPoint2D32f srcquad[4]; srcquad[0].x = 0; srcquad[0].y = 0; srcquad[1].x = 0; srcquad[1].y = 213; srcquad[2].x = 320; srcquad[2].y = 213; srcquad[3].x = 320; srcquad[3].y = 0; //points of the quad with distortion CvPoint2D32f dstquad[4]; dstquad[0].x = 3; dstquad[0].y = 32; dstquad[1].x = 1; dstquad[1].y = 135; dstquad[2].x = 234; dstquad[2].y = 161; dstquad[3].x = 318; dstquad[3].y = 83; Zuerst werden in der Variable CvPoint2D32f srcquad[4] die vier Eckpunkte der Tastatur ohne jeglicher Verzerrung angeben und in CvPoint2D32f dstquad[4] die vier Eckpunkte der Tastatur mit perspektivischer Verzerrung, die den Punkten des Ausrichtungsvierecks entsprechen (siehe Abbildung 4.13). Man könnte die Punkte für die Variable CvPoint2D32f dstquad[4] auch mit Hilfe des Mauszeigers angeben, sprich die Punkte werden im Kamerabild per Maus automatisch ermittelt. Jedoch war diese Verbesserung aus Zeitmangel leider nicht mehr möglich. y y 1/135 234/161 0/213 320/213 318/83 3/32 x 0/0 320/0 x Abbildung 4.13: Links: Tastatur mit perspektivischer Verzerrung; Rechts: Tastatur ohne Verzerrung.

KAPITEL 4. IMPLEMENTIERUNG 36 double coeffs[3][3]; //Computes perspective coeffs for transformation from src to dst quad icvcomputeperspectivecoeffs(srcquad, dstquad, coeffs); //creates a 240x320 32-bit float matrix with 2 channel CvMat* perspectivemap = cvcreatemat(240,320,cv_32fc2); //computes a perspective map using previously calculated coeffs cvcomputeperspectivemap(coeffs, perspectivemap); Aus den zwei Arrays srcquad[4] und dstquad[4] wird eine 3x3 Matrix (double coeffs[3][3]) mit Hilfe von icvcomputeperspectivecoeffs() berechnet, die die Transformationsmatrix zwischen dem perspektivisch unverzerrten Viereck und dem verzerrten Viereck ist. Mit dieser Transformationsmatrix wird nun eine perspektivische Abbildung für das gesamte Bild mittels der Funktion cvcomputeperspectivemap() errechnet und in einer 240x320 Matrix mit zwei Kanälen gespeichert. Es wird also für jeden Bildpunkt die Verzerrung für die x-koordinate (Kanal 1) und für die y-koordinate (Kanal 2) berechnet. IplImage* undistortimage = cvcreateimage(cvsize(320,240), 8, 3); //creates a 240x320 32-bit signed matrix with 3 channels CvMat* rectmap = cvcreatemat(240,320,cv_32sc3); //converts floating-point map to a faster fixed-point map cvconvertmap(image, perspectivemap,rectmap,1); //corrects distortion using previously calculated rectmap cvundistort(orgimage, undistortimage, rectmap, 1); Nach der Konvertierung der Matrix perspectivemap mit Hilfe der Funktion cvconvertmap() wird mit cvundistort() aus dem Originalkamerabild ein neues perspektivisch entzerrtes Bild berechnet (siehe Abbildung 4.14) (a) (b) Abbildung 4.14: Neu berechnete Bilder der (a) linken und (b) rechten Kamera ohne perspektivische Verzerrung.

KAPITEL 4. IMPLEMENTIERUNG 37 (a) (b) (c) (d) (e) Abbildung 4.15: (a) Originalkamerabild (b) und in den HSV-Farbraum konvertiertes Kamerabild; Die einzelnen Kanäle des HSV-Bildes: (c) H- Kanal, (d) S-Kanal und (e) V-Kanal. Die neu berechneten Bilder, die für den Anwender nicht sichtbar sind, werden an dem Trackingalgorithmus Blobanalyse übergeben, um die Anzahl der Tastenanschläge und die dazugehörigen Koordinaten zu ermitteln. Dieser Vorgang wird im nächsten Abschnitt ausführlich erläutert. 4.4.2 Blobanalyse Um einen Finger zu tracken, muss die rote Laserlinie, die sich bei einem Tastenanschlag am Fingernagel abzeichnet, aus dem Kamerabild gefiltert und die Koordinaten ermittelt werden. Zuerst sind nun einige Bildoperationen nötig, um den roten Laserstrahl aus dem Bild zu extrahieren. Als erster Schritt wird das Kamerabild in den HSV-Farbraum konvertiert (siehe Abbildung 4.15(b)), ausführliche Informationen über den HSV-Farbraum findet man in Abschnitt 4.3.2. Das konvertierte Bild wird dann in seine einzelnen Kanäle aufgeteilt(vgl. Abbildung 4.15(c) bis 4.15(e)). Die Konvertierung in den HSV-Farbraum und die Aufteilung in die einzelnen Kanäle beschreibt das nun folgende Codefragment.

KAPITEL 4. IMPLEMENTIERUNG 38 IplImage* hsv = cvcreateimage(cvsize(320, 240), 8, 3); IplImage* h_plane = cvcreateimage(cvsize(320, 240), 8, 1); IplImage* s_plane = cvcreateimage(cvsize(320, 240), 8, 1); IplImage* v_plane = cvcreateimage(cvsize(320, 240), 8, 1); cvcvtcolor(sampleimage, hsv, CV_BGR2HSV); cvcvtpixtoplane(hsv, h_plane, s_plane, v_plane, 0); Zunächst werden 8-bit Bilder von der Größe 320x240 erzeugt. Davon hat ein Bild drei Kanäle und die anderen jeweils einen Kanal. Mit der Funktion cvcvtcolor() wird das Kamerabild SampleImage in den HSV-Farbraum konvertiert und in der Variable hsv gespeichert. Dieses Bild wird mittels der Funktion cvcvtpixtoplane() in seine einzelnen Kanäle aufgeteilt. Es erfolgt eine Binarisierung der Bilder der einzelnen Kanäle. Bei der Binarisierung von Bildern wird ein Schwellwert festgelegt. Liegt der Grauwert über dem Schwellwert, zählt das Pixel zum Objekt, andernfalls zum Hintergrund. IplImage* ThresholdedImage = cvcreateimage(cvsize(320, 240), 8, 1); cvthreshold(h_plane, ThresholdedImage, 60, 255, CV_THRESH_BINARY); cvthreshold(h_plane, h_plane, 130, 255, CV_THRESH_BINARY_INV); cvthreshold(s_plane, s_plane, 90, 255, CV_THRESH_BINARY_INV); cvthreshold(v_plane, v_plane, 150, 255, CV_THRESH_BINARY_INV); Mit der Funktion cvthreshold() werden in OpenCV Bilder binarisiert. Die ersten beiden Parameter geben das Quell- und das Zielbild an, der dritte den Schwellwert und der vierte Parameter den maximalen Grauwert, den ein Pixel haben kann. Der letzte Parameter gibt den Typ der Binarisierung an. Bei CV THRESH BINARY erhält das Pixel den maximalen Grauwert, wenn der Pixelwert über dem Schwellwert liegt, und bei CV THRESH BINARY INV wird das Pixel schwarz, falls der Wert über dem Schwellwert liegt. In diesem Fall werden für den H-Kanal zwei Schwellwerte festgelegt (siehe Abbildung 4.16(b) und 4.16(c)) und für den S- und V-Kanal jeweils einer (siehe Abbildung 4.16(e) und 4.16(g)). Die Schwellwerte sind genau den Lichtverhältnissen eines abgedunkelten Raums mit eingeschaltetem Projektor angepasst. Sollten sich die Lichtverhältnisse ändern, z. B. es steht kein Projektor für die Projektion der Tastatur zur Verfügung, so müssen die Schwellwerte dieser Situation angepasst werden. Mit der Binarisierung wird Speicherplatz gespart und die spätere Auswertung wird erheblich erleichtert, da das Bild nur noch aus schwarz (Laserlinie) und weiß (Hintergrund) besteht. Um die aus der Binarisierung erhaltenen Bilder wieder zu einem einzigen zusammenzufügen, werden eine UND-Verknüpfung und zwei Additionen angewendet.

KAPITEL 4. IMPLEMENTIERUNG 39 (a) (b) (c) (d) (e) (f) (g) Abbildung 4.16: Mit Schwellwert binarisierte Bilder: (a) zeigt den H- Kanal, (b) und (c) sind die binarisierten Bilder davon, (d) zeigt den S-Kanal, (e) das binarisierte Bild davon, (f) zeigt den V-Kanal und (g) das binarisierte Bild davon.