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

...

Code Block
PImage depthImage = kinect.getDepthImage();

Gezeichnet wird es mit:

Code Block
image(depthImage, 0, 0);
Code Block
titleBeispiel
collapsetrue
import org.openkinect.freenect.*;
import org.openkinect.freenect2.*;
import org.openkinect.processing.*;

Kinect2 kinect2;

void setup() {
  size(512, 424, P2D);

  kinect2 = new Kinect2(this);
  kinect2.initDepth();
  
  kinect2.initDevice();
}

void draw() {
  background(0);
  image(kinect2.getDepthImage(), 0, 0);
  println(kinect2.depthWidth +" "+ kinect2.depthHeight);
}


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();
Code Block
titleBeispiel
collapsetrue
import org.openkinect.processing.*;
import peasy.*;

Kinect2 kinect2;
PeasyCam cam;

void setup() {
  size(512, 424, P3D);
  cam = new PeasyCam(this, 1000);
  cam.setMaximumDistance(5000);
  
  kinect2 = new Kinect2(this);
  kinect2.initDepth();
  
  kinect2.initDevice();
}

void draw() {
  background(0);
  
  int[] depthMap = kinect2.getRawDepth();
  int stepSize = 2;
  
  for(int x=0; x<kinect2.depthWidth; x+=stepSize) {
    for(int y=0; y<kinect2.depthHeight; y+=stepSize) {
      int loc = x+y*kinect2.depthWidth;
      
      PVector point = depthToPointCloudPos(x,y,depthMap[loc]);
      
      stroke(255);
      point(point.x, point.y, point.z);
    }
  }
}

PVector depthToPointCloudPos(int x, int y, float depthValue) {
  PVector point = new PVector();
  point.z = (depthValue);
  point.x = (x - CameraParams.cx) * point.z / CameraParams.fx;
  point.y = (y - CameraParams.cy) * point.z / CameraParams.fy;
  return point;
}


static class CameraParams {
  static float cx = 254.878f;
  static float cy = 205.395f;
  static float fx = 365.456f;
  static float fy = 365.456f;
  static float k1 = 0.0905474;
  static float k2 = -0.26819;
  static float k3 = 0.0950862;
  static float p1 = 0.0;
  static float p2 = 0.0;
}


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();
Code Block
titleBeispiel
collapsetrue
import org.openkinect.freenect.*;
import org.openkinect.freenect2.*;
import org.openkinect.processing.*;

Kinect2 kinect2;

void setup() {
  size(512, 424, P2D);

  kinect2 = new Kinect2(this);
  kinect2.initRegistered();
  
  kinect2.initDevice();
}

void draw() {
  background(0);
  image(kinect2.getRegisteredImage(), 0, 0);
  println(kinect2.depthWidth +" "+ kinect2.depthHeight);
}


Übersicht der Funktionen

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

...