Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

...

...

Die Microsoft Kinect ist eine Kamera, welche für die Spielkonsole Xbox entwickelt wurde. Das Besondere an dieser Kamera ist ihre Möglichkeit, neben einem normalen RGB Bild, ein Tiefenbild ihrer Umgebung zurückzugeben. Damit wird es möglich komplexere Computer Vision Aufgaben zu implementieren. Darüber hinaus bietet das sog. Microsoft Kinect SDK die Möglichkeit das Skelett einer Person zu erkennen. Durch das "Skeleton-Tracking" ist es möglich festzustellen, wo die Gelenke einer Person sind und welche Gesten und Bewegungen sie ausführt. Leider ist dieses SDK nur für Windows erhältlich und wir arbeiten daher vor allem mit dem Titelbild Tiefenbild der Kinect Kamera.

Version 1 und Version 2

Mittlerweile gibt es zwei Versionen der Kinect Kamera: Kinect v1 und Kinect v2. Der wesentliche Unterschied besteht in der Auflösung und der Geschwindigkeit mit welcher die Kameras arbeiten. Hier ein kurzer Vergleich der Spezifikationen:

VersionKinect v1Kinect v2
Auflösung RGB640x4801920x1080
Framerate30fps30fps
Auflösung Tiefenbild320x240

512x424

Entfernung Auflösung20484500
Maximale Distanzca. 450cmca. 450cm
Minimale Distanzca. 40cmca.50 cm
USB InterfaceUSB 2.0USB 3.0

Generell ist also vor allem die Auflösung des RGB Bildes und des Tiefenbilds mit der Version 2 verbessert worden. Ein weiterer kleiner Vorteil der v2 besteht darin, dass sie mit einer Stativschraube befestigt werden kann.

Programmierung

Wir verwenden die Library "OpenKinect" von  von Daniel Shiffman. Es existiert auch eine Library von Max Rheiner (ehem. Dozent am IAD), leider funktioniert diese "seine SimpleOpenNI"  Librar nicht mehr für die neue mit der neuen Version der Kinect Kamera. Wer jedoch die Möglichkeiten des Selektion-Trackings aufprobieren möchte, dem sei ein Blick in die Beispiele empfohlen.

...

Um die Library nutzen zu können, muss diese importiert werden:

Code Block
import org.openkinect.processing.*;

Danach muss eine Referenz auf das Kinect Objekt gesetzt werden:

Code Block
Kinect kinect;

Im setup() wird das Objekt dann initialisiert:

Code Block
void setup() {
  kinect = new Kinect(this);
  kinect.initDevice();
}

Wird eine Kinect Kamera v2 verwendet, muss die Referenz und Initialisierung entsprechend angepasst werden:

Code Block
Kinect2 kinect;

...


void setup() {
  kinect = new Kinect2(this);
  kinect.initDevice();
}

Sind die obigen Schritte erfolgt kann im Weiteren direkt auf die Informationen der Kinect zugegriffen werden. Die Library macht uns fünf Informationen zugänglich:

  • PImage (RGB) der Kinect Videokamera.
  • PImage (grayscale) der Kinect IR Kamera.
  • PImage (grayscale) ein Tiefenbild, in dem die Helligkeit der Pixel für den Abstand steht (Heller = näher).
  • PImage (RGB) ein Tiefenbild, bei dem die Farbe für die Entfernung steht. 
  • int[] (array) ein Array, welches die "Rohdaten" der Entfernung beinhaltet (0-2048 v1 und 0-4500 v2).

RGB Bild

Um das Tiefenbild der Kamera auszulesen kann die gleiche Methode verwendet werden, wie sie schon bei einer normalen Webcam zu Einsatz kam: 

Code Block
PImage videoImage = kinect.getVideoImage();
 

Gezeichnet

...

werden

...

kann

...

das

...

Bild

...

mit:

...

Code Block
image (videoImage, 0, 0);

 

Neben dem zeichnen des Bildes in der draw() Funktion, gibt es auch die Möglichkeit, das Bild asynchron zu zeichnen. Das bedeutet, es wird nur dann ein Bild gezeichnet, wenn ein neues vorhanden ist. Die entsprechende Funktion lautet:

Code Block
void videoEvent(Kinect k) {
  // There has been a video event!
}

IR Bild

Um das Infrarotbild der Kamera auszulesen verwenden wir:

Code Block
kinect.enablIR(true);

...

Ein Nachteil der Kinect v1 ist, dass nur eine Art von Bild auf ein Mal abgerufen werden kann (entweder IR oder RGB). Deshalb wird mit der Funktion getVideoImage() immer das zuletzt gewählte Bildformat zurückgegeben:

Code Block
PImage videoImage = kinect.getVideoImage();
PImage irImage = kinect.getIrImage();

Tiefenbild

Um das Tiefenbild als Graustufen zurückzubekommen wird folgendes gemacht:

Code Block
PImage depthImage = kinect.getDepthImage();
 

Gezeichnet wird es mit:

Code Block
image(depthImage, 0, 0);

Tiefenarray

Der Nachteil des Graustufen-Tiefenbildes ist es, dass alle Entfernungsinformationen auf Werte zwischen 0 bis 255 (Helligkeit) verteilt werden. Tatsächlich kann die Kinect Kamera aber eine viel genauere Auflösung der Tiefeninformationen liefern. Dazu ist es jedoch nötig, das Tiefenarray aufzurufen und auszulesen. Dies geschieht über:

Code Block
int[] depth = kinect.getRawDepth();

Angleichung

Weil bei der Kinect Kamera der Sensor für das RGB Bild und das Titelbild nicht übereinanderliegen stimmen die Positionen in XY Richtung der einen Kamera, nicht mit denen der anderen überein. Um dies zu korrigieren kann ein RGB Bild angefordert werden, welches durch die Library angepasst wird. Dieses Bild bekommt man über:

Code Block
PImage img = kinect2.getRegisteredImage();

Übersicht der Funktionen

Hier eine Übersicht der Funktionen, welche die Library zur Verfügung stellt:

...

Für weitere Informationen: the javadoc reference.