Skip to content

Instantly share code, notes, and snippets.

@tatsuro-ueda
Created January 31, 2012 06:00
Show Gist options
  • Save tatsuro-ueda/1709142 to your computer and use it in GitHub Desktop.
Save tatsuro-ueda/1709142 to your computer and use it in GitHub Desktop.
simple-OpenNI sample AlternativeViewpoint3d
// 深度カメラとRGBカメラの映像を適合させて描画する
import SimpleOpenNI.*;
SimpleOpenNI context;
float zoomF =0.3f;
float rotX = radians(180); // デフォルトでは視界をx軸に対して180度回転させる
// OpenNIのデータは反対から来る
float rotY = radians(0);
void setup()
{
size(1024,768,P3D);
//context = new SimpleOpenNI(this,SimpleOpenNI.RUN_MODE_SINGLE_THREADED);
context = new SimpleOpenNI(this);
// 鏡像にしない
context.setMirror(false);
// 深度カメラを有効にする
if(context.enableDepth() == false)
{
println("Can't open the depthMap, maybe the camera is not connected!");
exit();
return;
}
if(context.enableRGB() == false)
{
println("Can't open the rgbMap, maybe the camera is not connected or there is no rgbSensor!");
exit();
return;
}
// 深度データをRGBカメラデータに合わせる
context.alternativeViewPointDepthToImage();
stroke(255,255,255);
smooth();
perspective(radians(45),
float(width)/float(height),
10,150000);
}
void draw()
{
// カメラ情報を更新する
context.update();
background(0,0,0);
translate(width/2, height/2, 0);
rotateX(rotX);
rotateY(rotY);
scale(zoomF);
PImage rgbImage = context.rgbImage();
int[] depthMap = context.depthMap();
int steps = 3; // 描画速度を上げるため、3点ごとに描画する
int index;
PVector realWorldPoint;
color pixelColor;
strokeWeight(steps);
translate(0,0,-1000); // シーンの回転中心をカメラの1000mm前にする
PVector[] realWorldMap = context.depthMapRealWorld();
for(int y=0;y < context.depthHeight();y+=steps)
{
for(int x=0;x < context.depthWidth();x+=steps)
{
index = x + y * context.depthWidth();
if(depthMap[index] > 0)
{
// 対象の点の色を取得する
pixelColor = rgbImage.pixels[index];
stroke(pixelColor);
// 投射された点を描画する
realWorldPoint = realWorldMap[index];
point(realWorldPoint.x,realWorldPoint.y,realWorldPoint.z); // make realworld z negative, in the 3d drawing coordsystem +z points in the direction of the eye
}
}
}
// Kinectカメラを描画する
context.drawCamFrustum();
}
void keyPressed()
{
switch(key)
{
case ' ':
context.setMirror(!context.mirror());
break;
}
switch(keyCode)
{
case LEFT:
rotY += 0.1f;
break;
case RIGHT:
// zoom out
rotY -= 0.1f;
break;
case UP:
if(keyEvent.isShiftDown())
zoomF += 0.02f;
else
rotX += 0.1f;
break;
case DOWN:
if(keyEvent.isShiftDown())
{
zoomF -= 0.02f;
if(zoomF < 0.01)
zoomF = 0.01;
}
else
rotX -= 0.1f;
break;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment