通过kinect追踪身体骨骼,并在图像上画出来。新奇、有趣。
import SimpleOpenNI.*;
SimpleOpenNI kinect;
public void setup()
{
kinect=new SimpleOpenNI(this);
kinect.setMirror(true);
kinect.enableDepth();
kinect.enableUser(SimpleOpenNI.SKEL_PROFILE_ALL);//启用全部关节
size(kinect.depthWidth(),kinect.depthHeight());
}
public void draw(){
kinect.update();
image(kinect.depthImage(),0,0);
if(kinect.isTrackingSkeleton(1)){
drawSkeleton(1);//在屏幕上打印出1个骨骼
}
}
void drawSkeleton(int userId){//将关节用线段连接在一起
pushStyle();
stroke(255,0,0);
strokeWeight(3);
kinect.drawLimb(userId,SimpleOpenNI.SKEL_HEAD,SimpleOpenNI.SKEL_NECK);
kinect.drawLimb(userId,SimpleOpenNI.SKEL_NECK,SimpleOpenNI.SKEL_LEFT_SHOULDER);
kinect.drawLimb(userId,SimpleOpenNI.SKEL_LEFT_SHOULDER,SimpleOpenNI.SKEL_LEFT_ELBOW);
kinect.drawLimb(userId,SimpleOpenNI.SKEL_LEFT_ELBOW,SimpleOpenNI.SKEL_LEFT_HAND);
kinect.drawLimb(userId,SimpleOpenNI.SKEL_NECK,SimpleOpenNI.SKEL_RIGHT_SHOULDER);
kinect.drawLimb(userId,SimpleOpenNI.SKEL_RIGHT_SHOULDER,SimpleOpenNI.SKEL_RIGHT_ELBOW);
kinect.drawLimb(userId,SimpleOpenNI.SKEL_RIGHT_ELBOW,SimpleOpenNI.SKEL_RIGHT_HAND);
kinect.drawLimb(userId,SimpleOpenNI.SKEL_LEFT_SHOULDER,SimpleOpenNI.SKEL_TORSO);
kinect.drawLimb(userId,SimpleOpenNI.SKEL_RIGHT_SHOULDER,SimpleOpenNI.SKEL_TORSO);
kinect.drawLimb(userId,SimpleOpenNI.SKEL_TORSO,SimpleOpenNI.SKEL_LEFT_HIP);
kinect.drawLimb(userId,SimpleOpenNI.SKEL_LEFT_HIP,SimpleOpenNI.SKEL_LEFT_KNEE);
kinect.drawLimb(userId,SimpleOpenNI.SKEL_LEFT_KNEE,SimpleOpenNI.SKEL_LEFT_FOOT);
kinect.drawLimb(userId,SimpleOpenNI.SKEL_TORSO,SimpleOpenNI.SKEL_RIGHT_HIP);
kinect.drawLimb(userId,SimpleOpenNI.SKEL_RIGHT_HIP,SimpleOpenNI.SKEL_RIGHT_KNEE);
kinect.drawLimb(userId,SimpleOpenNI.SKEL_RIGHT_KNEE,SimpleOpenNI.SKEL_RIGHT_FOOT);
popStyle();
}
public void onNewUser(int userId){//姿态检测
println("onNewUser-userId:"+userId);
if(kinect.isTrackingSkeleton(1)) return;
println("start pose detection");
kinect.startPoseDetection("Psi",userId);
}
public void onLostUser(int userId){//一旦用户丢失,控制台打印
println("onLostUser-userId"+userId);
}
public void onStartPose(String pose,int userId){//检测到一个姿态,就可以停止检测,并要求NITE进行骨骼校准
println("onStartPose-userId"+userId+",pose:"+pose);
println("stop pose detection");
kinect.stopPoseDetection(userId);
kinect.requestCalibrationSkeleton(userId,true);
}
public void onEndPose(String pose,int userId){//完全姿态检测开始校准的时候你还可以把状态显示出来
println("onEndPose-userId:"+userId+",pose:"+pose);
}
public void onStartCalibration(int userId){
println("onStartCalibration-userId:"+userId);
}
public void onEndCalibration(int userId,boolean successfull){
println("onEndCalibration-userId:"+userId+",successfull:"+successfull);
if(successfull){
println("User cailbrated!!!");
kinect.startTrackingSkeleton(userId);
}
else{
println("Failed to cailbrate user!!!");
println("Start pose setection");
kinect.startPoseDetection("Psi",userId);
}
}