/* --------------------------------------------------------------------------
* SimpleOpenNI UserCoordsys Test
* --------------------------------------------------------------------------
* Processing Wrapper for the OpenNI/Kinect library
* http://code.google.com/p/simple-openni
* --------------------------------------------------------------------------
* prog: Max Rheiner / Interaction Design / zhdk / http://iad.zhdk.ch/
* date: 05/06/2012 (m/d/y)
* ----------------------------------------------------------------------------
* This example shows how to setup a user defined coordiate system.
* You have to devine the new nullpoint + the x/z axis.
* This can be also usefull if you work with two independend cameras
* ----------------------------------------------------------------------------
*/
import SimpleOpenNI.*;
final static int CALIB_START = 0;
final static int CALIB_NULLPOINT = 1;
final static int CALIB_X_POINT = 2;
final static int CALIB_Z_POINT = 3;
final static int CALIB_DONE = 4;
SimpleOpenNI context;
boolean screenFlag = true;
int calibMode = CALIB_START;
PVector nullPoint3d = new PVector();
PVector xDirPoint3d = new PVector();
PVector zDirPoint3d = new PVector();
PVector tempVec1 = new PVector();
PVector tempVec2 = new PVector();
PVector tempVec3 = new PVector();
PMatrix3D userCoordsysMat = new PMatrix3D();
void setup()
{
size(640, 480);
smooth();
context = new SimpleOpenNI(this);
context.setMirror(false);
// enable depthMap generation
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;
}
// align depth data to image data
context.alternativeViewPointDepthToImage();
// Create the font
textFont(createFont("Georgia", 16));
}
void draw()
{
// update the cam
context.update();
if (screenFlag)
image(context.rgbImage(), 0, 0);
else
image(context.depthImage(), 0, 0);
// draw text background
pushStyle();
noStroke();
fill(0,200,0,100);
rect(0,0,width,40);
popStyle();
switch(calibMode)
{
case CALIB_START:
text("To start the calibration press SPACE!", 5, 30);
break;
case CALIB_NULLPOINT:
text("Set the nullpoint with the left mousebutton", 5, 30);
break;
case CALIB_X_POINT:
text("Set the x-axis with the left mousebutton", 5, 30);
break;
case CALIB_Z_POINT:
text("Set the z-axis with the left mousebutton", 5, 30);
break;
case CALIB_DONE:
text("New nullpoint is defined!", 5, 30);
break;
}
// draw
drawCalibPoint();
// draw the user defined coordinate system
// with the size of 500mm
if (context.hasUserCoordsys())
{
PVector temp = new PVector();
PVector nullPoint = new PVector();
pushStyle();
strokeWeight(3);
noFill();
context.convertRealWorldToProjective(new PVector(0, 0, 0), tempVec1);
stroke(255, 255, 255, 150);
ellipse(tempVec1.x, tempVec1.y, 10, 10);
context.convertRealWorldToProjective(new PVector(500, 0, 0), tempVec2);
stroke(255, 0, 0, 150);
line(tempVec1.x, tempVec1.y,
tempVec2.x, tempVec2.y);
context.convertRealWorldToProjective(new PVector(0, 500, 0), tempVec2);
stroke(0, 255, 0, 150);
line(tempVec1.x, tempVec1.y,
tempVec2.x, tempVec2.y);
context.convertRealWorldToProjective(new PVector(0, 0, 500), tempVec2);
stroke(0, 0, 255, 150);
line(tempVec1.x, tempVec1.y,
tempVec2.x, tempVec2.y);
popStyle();
}
}
void drawCalibPoint()
{
pushStyle();
strokeWeight(3);
noFill();
switch(calibMode)
{
case CALIB_START:
break;
case CALIB_NULLPOINT:
context.convertRealWorldToProjective(nullPoint3d, tempVec1);
stroke(255, 255, 255, 150);
ellipse(tempVec1.x, tempVec1.y, 10, 10);
break;
case CALIB_X_POINT:
// draw the null point
context.convertRealWorldToProjective(nullPoint3d, tempVec1);
context.convertRealWorldToProjective(xDirPoint3d, tempVec2);
stroke(255, 255, 255, 150);
ellipse(tempVec1.x, tempVec1.y, 10, 10);
stroke(255, 0, 0, 150);
ellipse(tempVec2.x, tempVec2.y, 10, 10);
line(tempVec1.x, tempVec1.y, tempVec2.x, tempVec2.y);
break;
case CALIB_Z_POINT:
context.convertRealWorldToProjective(nullPoint3d, tempVec1);
context.convertRealWorldToProjective(xDirPoint3d, tempVec2);
context.convertRealWorldToProjective(zDirPoint3d, tempVec3);
stroke(255, 255, 255, 150);
ellipse(tempVec1.x, tempVec1.y, 10, 10);
stroke(255, 0, 0, 150);
ellipse(tempVec2.x, tempVec2.y, 10, 10);
line(tempVec1.x, tempVec1.y, tempVec2.x, tempVec2.y);
stroke(0, 0, 255, 150);
ellipse(tempVec3.x, tempVec3.y, 10, 10);
line(tempVec1.x, tempVec1.y, tempVec3.x, tempVec3.y);
break;
case CALIB_DONE:
break;
}
popStyle();
}
void keyPressed()
{
switch(key)
{
case '1':
screenFlag = !screenFlag;
break;
case ' ':
calibMode++;
if (calibMode > CALIB_DONE)
{
calibMode = CALIB_START;
context.resetUserCoordsys();
}
else if (calibMode == CALIB_DONE)
{
// set the calibration
context.setUserCoordsys(nullPoint3d.x, nullPoint3d.y, nullPoint3d.z,
xDirPoint3d.x, xDirPoint3d.y, xDirPoint3d.z,
zDirPoint3d.x, zDirPoint3d.y, zDirPoint3d.z);
println("Set the user define coordinatesystem");
println("nullPoint3d: " + nullPoint3d);
println("xDirPoint3d: " + xDirPoint3d);
println("zDirPoint3d: " + zDirPoint3d);
/*
// test
context.getUserCoordsysTransMat(userCoordsysMat);
PVector temp = new PVector();
userCoordsysMat.mult(new PVector(0, 0, 0), temp);
println("PVector(0,0,0): " + temp);
userCoordsysMat.mult(new PVector(500, 0, 0), temp);
println("PVector(500,0,0): " + temp);
userCoordsysMat.mult(new PVector(0, 500, 0), temp);
println("PVector(0,500,0): " + temp);
userCoordsysMat.mult(new PVector(0, 0, 500), temp);
println("PVector(0,0,500): " + temp);
*/
}
break;
}
}
void mousePressed()
{
if (mouseButton == LEFT)
{
PVector[] realWorldMap = context.depthMapRealWorld();
int index = mouseX + mouseY * context.depthWidth();
switch(calibMode)
{
case CALIB_NULLPOINT:
nullPoint3d.set(realWorldMap[index]);
break;
case CALIB_X_POINT:
xDirPoint3d.set(realWorldMap[index]);
break;
case CALIB_Z_POINT:
zDirPoint3d.set(realWorldMap[index]);
break;
}
}
else
{
PVector[] realWorldMap = context.depthMapRealWorld();
int index = mouseX + mouseY * context.depthWidth();
println("Point3d: " + realWorldMap[index].x + "," + realWorldMap[index].y + "," + realWorldMap[index].z);
}
}
void mouseDragged()
{
if (mouseButton == LEFT)
{
PVector[] realWorldMap = context.depthMapRealWorld();
int index = mouseX + mouseY * context.depthWidth();
switch(calibMode)
{
case CALIB_NULLPOINT:
nullPoint3d.set(realWorldMap[index]);
break;
case CALIB_X_POINT:
xDirPoint3d.set(realWorldMap[index]);
break;
case CALIB_Z_POINT:
zDirPoint3d.set(realWorldMap[index]);
break;
}
}
}
each time i try to run this code i get this error:
Can't load SimpleOpenNI library (SimpleOpenNI64) : java.lang.UnsatisfiedLinkError: C:\Users\maryl\OneDrive\Documents\Processing\libraries\SimpleOpenNI\library\SimpleOpenNI64.dll: Can't find dependent libraries
Verify if you installed SimpleOpenNI correctly.
http://code.google.com/p/simple-openni/wiki/Installation
A library relies on native code that's not available.
Or only works properly when the sketch is run as a 32-bit application.