
This program uses the depth and RGB sensors together to create a 3D color image. You can use the arrow keys to move the image around. The vectorShading variable controls the “quality” of the image. The higher the value, the less pixels the program writes to the image and the less processing power the overall program takes.
import processing.opengl.*;
// import kinect library
import SimpleOpenNI.*;
// kinect object
SimpleOpenNI kinectObject;
// to store current kinect image
PImage rgbImage;
// default zoom of z axis
int ZoomAxisZ = 1000;
// change Z axis zoom
float zoomZAxis = 1;
// starting point for XY veiwing - in middle
float rotateXAxis = 1023/2;
// storage for all of the kinect depth data
PVector[] depthPoints;
// the current point that we will be drawing
PVector currentPoint;
// sets how many pixels to process and draw
int vectorShading = 10;
/*---------------------------------------------------------------
Setup method. Draws a window 1024 x 768 and enables kinect
depth and RGB sensor. Redraws both images to line up
with each other
----------------------------------------------------------------*/
void setup() {
// creates a window 1024*768
// and uses OPENGL 3D rendering
size(1024, 768, OPENGL);
// start a new kinect object
kinectObject = new SimpleOpenNI(this);
// enable the kinect depth sensor
kinectObject.enableDepth();
// enable the kinect color camera
kinectObject.enableRGB();
// align RGB and depth pictures together
kinectObject.alternativeViewPointDepthToImage();
}
/*---------------------------------------------------------------
Draw method. Updates kinect image, gets it, and translates the
image to view in draw window.
----------------------------------------------------------------*/
void draw() {
// draw the back ground black
background(0);
// update the kinect image
kinectObject.update();
// get the current image from the kinect
rgbImage = kinectObject.rgbImage();
// recrop image to half width size
// half height size and zoom back ZoomAxisZ
translate(width/2, height/2, -ZoomAxisZ);
// flip X axis around
rotateX(radians(180));
// map rotateXAxis variable from -180 to 180
// then convert to radians and input to rotateY
rotateY(radians(map(rotateXAxis, 0, width, -180, 180)));
// after rotating X/Y rotate Z on center axis
// by pressing up and down
translate(0,0,zoomZAxis*-ZoomAxisZ);
// get all depth vector points from kinect
depthPoints = kinectObject.depthMapRealWorld();
// for each depth point from the kinect get the
// current vector of that point and draw it
for (int i=0; i<depthPoints.length; i+=vectorShading) {
// get current depth point to draw
currentPoint = depthPoints[i];
// set the stroke color based on the color pixel
stroke(rgbImage.pixels[i]);
// color a point in the current vectors position
point(currentPoint.x, currentPoint.y, currentPoint.z);
}
}
/*---------------------------------------------------------------
Event driven method that moves image on X or Z axis to view
and prints keyCode for any key pressed for debugging.
----------------------------------------------------------------*/
void keyPressed(){
// if up is pressed then zoom in Z axis
if(keyCode == 38){
zoomZAxis = zoomZAxis + 0.01;
}
// if down is pressed then zoon out Z axis
if(keyCode == 40){
zoomZAxis = zoomZAxis - 0.01;
}
// if left is pressed then turn image left
if(keyCode == 37){
rotateXAxis = rotateXAxis + 1;
}
// if right is pressed then turn image right
if(keyCode == 39){
rotateXAxis = rotateXAxis - 1;
}
// print the current keyCode for the
// key you are pressing
println(keyCode);
}
/*---------------------------------------------------------------
If mouse is clicked in window then save image to where this
file is saved
----------------------------------------------------------------*/
void mousePressed(){
// save image
save("3D_Kinect_Image.png");
// print saved
println("saved!");
}