Eine Person im Raum zeigt mit ausgestrecktem Arm auf eine Lampe oder einen Projektor, und das Gerät geht an oder aus. Diese Szene stammt keineswegs aus einem Science-Fiction-Film, sondern ist bereits heute mit freier Software realisierbar .
Digitale Bildverarbeitung mit Linux spielt auch in Wissenschaft und Forschung eine immer größere Rolle. Am Institut FORWISS der Universität Passau [1] entwickelten Mitglieder des Forschungsprojekts FORSIP/SIKOWO [2] ein System zur Gerätefernbedienung unter Linux.
Das Team setzte sich zum Ziel, die Mensch-Maschine-Schnittstelle in typischen Sitzungssituationen mit Kurzvorträgen zu verbessern. Der Referent soll sich ganz auf seinen Vortrag konzentrieren und die elektronischen Einrichtungen wie Lampen, Jalousien oder Projektoren durch bloße Zeigegesten bedienen können, ohne an unbekannten Regelungskonsolen herumhantieren zu müssen.
Eine gute Verbindung
Die technischen Geräte waren über das Haus-Bus-System KNX/EIB [3] mit einem Linux-PC verbunden. An der Decke befanden sich zwei Indus-trievideokameras im Abstand von ungefähr drei Metern im Raum, sodass sich der Vortragende etwa zwei Meter in der Tiefe bewegen konnte, ohne aus dem vollen Sichtbarkeitsbereich herauszulaufen (Abbildung 1).

Abbildung 1: Szene von oben: Zwei Kameras mit überlappenden Sichtbarkeitsbereichen, eine Person, vier Zeigeziele (dunkle Kreise) und die lokalen Koordinatensysteme (rot).
Die Kameras kommunizierten über ihre Firewire-Schnittstellen (IEEE 1394) mit dem Linux-Rechner. Diese Anschlusstechnik ist neben USB und neuerdings auch Gigabit-Ethernet etabliert. Sowohl für Firewire als auch für Ethernet existieren im Gegensatz zu USB Standards, an die sich die meisten Hersteller halten. Kameras mit analogem Ausgangssignal und einer Cameralink-Schnittstelle benötigen eine separate Framegrabber-Karte.
Für die meisten dieser Karten und auch für Kameras mit USB-Schnittstelle existieren proprietäre Linux-Treiber. Diese hinken jedoch in Bezug auf Aktualität meist den Windows-Pendants hinterher. Anders sieht es für die Firewire-Variante aus. Das Open-Source-Projekt Libdc1394 [4] setzt seit Juli 2000 die IIDC/DCAM-Spezifikation für die IEEE-1394-Schnittstelle unter Linux um. Mittlerweile unterstützt die Bibliothek in der Version 2 alle gängigen Firewire-Kameras nativ unter Linux, das Ansprechen einiger herstellerspezifischer Features ist aber manchmal nur durch Setzen von Registern möglich.
Die neueste und vielversprechendste Verbindungsmöglichkeit zwischen Kamera und Rechner bietet Gigabit-Ethernet. Im eigens dafür entwickelten GigE-Vision-Standard [5] steht für jede Kamera eine XML-Beschreibungsdatei mit den Geräteeigenschaften zur Verfügung. Das Format der XML-Datei, den Transport-Layer und die Programmierer-API definiert der Genicam-Standard [6]. Dieser ist so allgemein gehalten, dass er in Zukunft neben Ethernet- auch Firewire- und USB-Kameras ansteuern kann. Leider bieten viele GigE-Vision-Kamerahersteller allerdings nur Treiber mit eigener API für Windows und Linux an, mit der man, gegen Aufpreis, ebenso Fremdherstellerkameras betreiben kann.
Im Auge des Betrachters
Bei einem solchen Stereosetup erscheint die zu beobachtende Person im linken Kamerabild aus einer anderen Perspektive als im rechten Bild. Ist etwa die Position der Nase bekannt, lassen sich in beiden Bildern die dreidimensionalen Koordinaten der Nase im Raum berechnen. Voraussetzung dafür ist eine so genannte Systemkalibrierung, das heißt die Kali-brierung der einzelnen Kameras und die Bestimmung der Positionen der Kameras zueinander.
Eine entsprechende Bildverarbeitungs-Bibliothek stellt sowohl Funktionen für die Einzel- als auch für die Stereokamerasystem-Kalibrierung bereit. Die Passauer Wissenschaftler setzten auf eine eigene Implementierung. Als Alternative bietet sich aber auch OpenCV [7] an, die wohl umfangreichste und beliebteste quelloffene Library. Sie wurde von Intel entwickelt und steht unter einer BSD-Lizenz zur Verfügung.
Zur Kalibrierung verwendeten die Projektmitglieder eine Platte, von denen sie die genauen Maße der aufgedruckten Muster kannten. Nach dem Abschluss der Systemkalibrierung war es möglich, für jeden Punkt im aufgenommenen Bild einen Sichtstrahl bezüglich eines Referenz-Koordinatensystems zu berechnen. Die Mitarbeiter brachten die Kalibrierplatte an den technischen Geräten an und ermittelten korrespondierende Punkte in einem Bilderpaar. Anschließend bestimmten sie aus den beiden Sichtstrahlen deren dreidimensionale Koordinaten der als Quader modellierten Geräte, also der Zeigeziele (Abbildung 2).

Abbildung 2: Virtuelle Szene aus Sicht der linken und rechten Kamera: Die Person zeigt auf das rot markierte Objekt. Weitere Zeigeziele sind die Stablampe, der Ventilator und das Flipchart.
Bewegte Bilder
Um eine Bewegung zu verfolgen und Zeigehandlungen zu erkennen, war es zunächst nötig, den Kopf und die Arme der Person in den Bilderpaaren zu identifizieren. Danach konnten die Wissenschaftler durch Schätzung der ungefähren Positionen von Augen und Finger die 3D-Zeigerichtung berechnen. Diese ergab sich aus dem Schnitt der durch die beiden 2D-Halbgeraden durch Auge und Finger gegebenen Ebenen des Bilderpaares. Durch einen weiteren Schnitt des Zeigeziels von der 3D-Halbgeraden ließ sich das assoziierte Gerät aktivieren.
Ecken und Kanten
Ein oft verwendetes Verfahren zur Analyse von digitalen Bildern ist die so genannte Kantendetektion, bei der man Stellen im Bild mit abruptem Grauwertübergang als Kanten markiert. Das Auffädeln benachbarter Kantenpunkte zu Konturen leistet etwa der Canny-Edge-Detector. Dieser ist unter anderem in der bereits erwähnten Bibliothek OpenCV, aber auch in der LTI-Lib [8], implementiert.
Diese ursprünglich am Lehrstuhl für Technische Informatik der RWTH-Aachen entwickelte Bibliothek heißt seit 2007 CVR-Lib [9] und steht nun unter der 3-Klausel-BSD-Lizenz. Listing 1 zeigt die Anwendung des Kantendetektors in der OpenCV-Variante: Zeile 11 lädt mit »cvLoadImage« das als Argument angegebene Bild, danach extrahiert »cvSplit« den ersten Kanal und Zeile 19 wendet darauf dann den Canny-Algorithums »cvCanny« an. Zum Schluss stellt »cvShowImage« das Ergebnisbild auf dem Bildschirm dar.
|
Listing 1: |
|---|
01 // compile with:
02 // g++ `pkg-config opencv --libs` `pkg-config opencv --cflags` -o canny canny.c
03 // start with
04 // canny some_image.png
05
06 #include <cv.h>
07 #include <highgui.h>
08
09 int main(int argc, char* argv[])
10 {
11 IplImage* pImg = cvLoadImage(argv[1]) ;
12 if (!pImg)
13 exit(EXIT_FAILURE);
14
15 IplImage* pGVImg = cvCreateImage(cvGetSize(pImg), IPL_DEPTH_8U, 1);
16 cvSplit(pImg, pGVImg, NULL, NULL, NULL );
17
18 IplImage* pCannyImg = cvCreateImage(cvGetSize(pImg), pImg->depth, 1);
19 cvCanny(pGVImg, pCannyImg, 40, 130);
20
21 cvNamedWindow("Canny", CV_WINDOW_AUTOSIZE) ;
22 cvShowImage("Canny", pCannyImg);
23
24 cvWaitKey(0);
25
26 cvDestroyWindow("Canny");
27 cvReleaseImage(&pCannyImg) ;
28 cvReleaseImage(&pGVImg) ;
29 cvReleaseImage(&pImg) ;
30
31 return EXIT_SUCCESS;
32 }
|
Darüber hinaus entwickelten die Wissenschaftler eine Methode, um Konturen herauszufiltern, die sich über mehrere Bilder hinweg örtlich nicht ändern. Im Idealfall blieben so lediglich die Konturen der Person übrig. Für den Kopf suchten sie dann etwa Konturstücke, die eine gleichmäßig verlaufende Krümmung besaßen, und für die Arme einen geradlinigen Verlauf. Durch die in Frage kommenden Konturstücke führten sie dann eine Kreis- beziehungsweise Geradenpassung durch.
Für die Berechnung solcher linearer Ausgleichsprobleme eignet sich etwa die Numerikbibliothek GNU Scientific Library [10] oder die in Fortran implementierte Bibliothek LAPACK [11]. Nachdem eine Menge von Kreismittelpunkten beziehungsweise 2D-Geraden in einem Bilderpaar vorlagen, konnten die Mitarbeiter paarweise die dreidimensionalen Koordinaten beziehungsweise die 3D-Geraden rekonstruieren.
Mit Plausibilitätstests entfernten sie nicht zusammengehörende Punkte- und Geradenpaare, falls sich etwa der potenzielle Kopf in drei Metern Höhe oder außerhalb des Raums befunden hätte. Ebenso filterten sie Zeigegeraden heraus, die entlang des Fußbodens verliefen. Zusätzlich überprüften die Teammitglieder, ob sich eine etwaige Gerade in der Nähe eines bereits erkannten Kopfes befand (Abbildung 3) und entwickelten weitere Methoden, um etwa Kopf und Armbewegungen über mehrere Bilder hinweg zu verfolgen. Trifft eine 3D-Zeigehalbgeraden ein Zeigeziel über mehrere Sekunden, löst sie einen Schaltvorgang aus.

Abbildung 3: Die Person zeigt auf eine Deckenlampe. Die Kontur des Kopfes ist grün eingezeichnet, und die erkannten Armkonturen sind rot markiert.
Mit Hilfe eines Industriepartners implementierte die Forschungsgruppe Treiber für Linux, um die Geräte schlussendlich über das KNX/EIB-Hausbussystem anzusteuern. Unter idealen Beleuchtungsbedingungen konnte eine Person das System zuverlässig bedienen.
Ausblick
Auch dieses Beispiel zeigt: Linux ist in Forschung und Entwicklung nicht mehr wegzudenken. Fortlaufende Arbeiten in der digitalen Bildverarbeitung beschäftigen sich mit der Stabilisierung bei verschiedenen Hintergrundmustern und wechselnden Lichtverhältnissen. Weitere Informationen über die eingesetzten Verfahren liefert die Dissertation des Autors unter [12].
Neben den erwähnten Bibliotheken existieren weitere Linux-Libraries von mehreren Herstellern, die effiziente Methoden zur Kamerakalibrierung, Kantenextraktion, Kreis- und Geradenpassung sowie zur Lösung von (nicht-)linearen Optimierungsproblemen bieten. So ist es etwa möglich, Intels proprietäre Softwarebibliothek IPP zusammen mit OpenCV zu verwenden, um die Algorithmen erheblich zu beschleunigen. Die IPP lässt sich für viele Bildverarbeitungsaufgaben aber auch eigenständig verwenden.
Eine Alternative bietet die quelloffene Bibliothek Framewave von AMD [13], die API-kompatibel zur IPP ist, in puncto Geschwindigkeit aber bislang nicht mithalten kann. Entscheidungskriterien für die jeweilige Bibliothek sind letztendlich Stabilität, Genauigkeit, Geschwindigkeit und Lizenzkosten. (hej)
|
Infos |
|---|
|
[1] FORWISS-Institut: [http://www.forwiss.uni-passau.de] [2] Forschungsprojekt FORSIP/SIKOWO: [http://www.forsip.de] [3] KNX-Website: [http://www.knx.de] [4] Freie Bibliothek libdc1394: [http://damien.douxchamps.net/ieee1394/libdc1394] [5] GigE-Vision-Standard: [http://www.machinevisiononline.org/public/articles/index.cfm?cat=167] [6] GenICam-Standard: [http://www.genicam.org] [7] Open Computer Vision Library: [http://sourceforge.net/projects/opencvlibrary] [8] LTI-Bibliothek: [http://ltilib.sourceforge.net] [9] CVR-Lib: [http://cvrlib.sourceforge.net] [10] GNU Scientific Library: [http://www.gnu.org/software/gsl] [11] Bibliothek LAPACK: [http://www.netlib.org/lapack] [12] Michael Kellner, “Zeitliche Konturgraphverfolgung”, WiKu-Verlag [13] Framewave: [http://developer.amd.com/cpu/libraries/framewave] |






