Versions Compared

Key

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

Information

...

Information

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 der Kinect Kamera.

...

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

import org.openkinect.processing.*;

Danach muss eine Referenz auf das Kinect Objekt gesetzt werden:

Kinect kinect;

Im setup() wird das Objekt dann initialisiert:

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

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

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 bis 2048).

Let’s look at these one at a time. If you want to use the Kinect just like a regular old webcam, you can access the video image as a PImage!

...

  • -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: 

PImage videoImage = kinect.getVideoImage(); 
Gezeichnet werden kann das Bild mit: 
image(imgvideoImage, 0, 0);

You can simply ask for this image in Neben dem zeichnen des Bildes in der draw() , however, if you can also use videoEvent() to know when a new image is available.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:

 

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

...

IR Bild

Um das Infrarotbild der Kamera auszulesen verwenden wir:

kinect.enableIR(true);

With kinect v1 cannot get both the video image and the IR image. They are both passed back via getVideoImage() so whichever one was most recently enabled is the one you will get. However, with the Kinect v2, they are both available as separate methods:

...

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:

 

PImage videoImage = kinect.getVideoImage();
PImage irirImage = kinect2kinect.getIrImage();

Now, if you want the depth image, you can request the grayscale image:

PImage img = kinect.getDepthImage();
image(img, 0, 0);

As well as the raw depth data:

...

Tiefenbild

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

PImage depthImage = kinect.getRawDepthgetDepthImage();

For the kinect v1, the raw depth values range between 0 and 2048, for the kinect v2 the range is between 0 and 4500.

For the color depth image, use kinect.enableColorDepth(true);. And just like with the video image, there's a depth event you can access if necessary.

void depthEvent(Kinect k) {
  // There has been a depth event!
}

Gezeichnet wird es mit:
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:

int[] depth = kinect.getRawDepth();

Angleichung

Unfortunately, b/c the RGB camera and the IR camera are not physically located in the same spot, there is a stereo vision problem. Pixel XY in one image is not the same XY in an image from a camera an inch to the right. The Kinect v2 offers what's called a "registered" image which aligns all the depth values with the RGB camera ones. This can be accessed as follows:

PImage img = kinect2.getRegisteredImage()

Finally, for kinect v1 (but not v2), you can also adjust the camera angle with the setTilt()method.

float angle = kinect.getTilt();
angle = angle + 1;
kinect.setTilt(angle);

So, there you have it, here are all the useful functions you might need to use the Processing kinect library:

...