How to detect the same person using Skeleton technique

edited November 2013 in Kinect

Hi all, Could you please help me about this program.

final year project title: ****To study and develop real time human identification using a high speed Kinect sensor.**** Currently what I'm doing now is using skeleton technique to identify the person using Kinect sensor and the output is a mobile robot. The problem is now the person had being detected by the kinect, but whenever he went out from the frame about 7 sec, and went back into the frame, Kinect have to reset to detect a new person.

My target is, I want to detect and the recognize the same person after he went in and out from the frame.

import processing.serial.*;

import SimpleOpenNI.*; SimpleOpenNI kinect; Serial myPort;

void setup() { kinect = new SimpleOpenNI(this); kinect.enableDepth(); kinect.enableUser(SimpleOpenNI.SKEL_PROFILE_ALL);

size(640, 480); fill(255, 0, 0); String portName = Serial.list()[0]; myPort = new Serial(this, portName, 9600); }

void draw() { kinect.update(); image(kinect.depthImage(), 0, 0);

IntVector userList = new IntVector(); kinect.getUsers(userList);

if (userList.size() > 0) { int userId = userList.get(0);

if ( kinect.isTrackingSkeleton(userId)) {
  drawSkeleton(userId);
  circleForAHead(userId);
}

} }

void circleForAHead(int userId) { //userId=1; // get 3D position of a joint PVector jointPos = new PVector(); kinect.getJointPositionSkeleton(userId,SimpleOpenNI.SKEL_TORSO,jointPos); //println(jointPos.x); // println(jointPos.y); // println(jointPos.z);

 if(jointPos.x > -200 && jointPos.x < 200)
  { 
    if(jointPos.z > 1000) 
  {   
    myPort.write('F'); 
    println("Forward");

  }
    else
    {
     myPort.write('S'); 
    println("Stop");
  }          

  }
  else if (jointPos.x >200 && jointPos.x < 580)  
  {
    myPort.write('R');  
    println("Right");
  }
  else if (jointPos.x <-200 && jointPos.x > -580)
  {
    myPort.write('L'); 
    println("Left");
  }
  else
  {
    myPort.write('S'); 
    println("Stop");
  }

}

void drawSkeleton(int userId) { stroke(0); strokeWeight(5);

kinect.drawLimb(userId, SimpleOpenNI.SKEL_HEAD, SimpleOpenNI.SKEL_HEAD); 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); kinect.drawLimb(userId, SimpleOpenNI.SKEL_RIGHT_HIP, SimpleOpenNI.SKEL_LEFT_HIP);

noStroke();

fill(255,0,0); drawJoint(userId, SimpleOpenNI.SKEL_HEAD); drawJoint(userId, SimpleOpenNI.SKEL_NECK); drawJoint(userId, SimpleOpenNI.SKEL_LEFT_SHOULDER); drawJoint(userId, SimpleOpenNI.SKEL_LEFT_ELBOW); drawJoint(userId, SimpleOpenNI.SKEL_NECK); drawJoint(userId, SimpleOpenNI.SKEL_RIGHT_SHOULDER); drawJoint(userId, SimpleOpenNI.SKEL_RIGHT_ELBOW); drawJoint(userId, SimpleOpenNI.SKEL_TORSO); drawJoint(userId, SimpleOpenNI.SKEL_LEFT_HIP); drawJoint(userId, SimpleOpenNI.SKEL_LEFT_KNEE); drawJoint(userId, SimpleOpenNI.SKEL_RIGHT_HIP); drawJoint(userId, SimpleOpenNI.SKEL_LEFT_FOOT); drawJoint(userId, SimpleOpenNI.SKEL_RIGHT_KNEE); drawJoint(userId, SimpleOpenNI.SKEL_LEFT_HIP); drawJoint(userId, SimpleOpenNI.SKEL_RIGHT_FOOT); drawJoint(userId, SimpleOpenNI.SKEL_RIGHT_HAND); drawJoint(userId, SimpleOpenNI.SKEL_LEFT_HAND); }

void drawJoint(int userId, int jointID) { PVector joint = new PVector();

float confidence = kinect.getJointPositionSkeleton(userId, jointID, joint); if(confidence < 0.9){ return; }

PVector convertedJoint = new PVector(); kinect.convertRealWorldToProjective(joint, convertedJoint); ellipse(convertedJoint.x, convertedJoint.y, 5, 5); }

// user-tracking callbacks! void onNewUser(int userId) { println("start pose detection"); kinect.startPoseDetection("Psi", userId); }

void onLostUser(int userId) { myPort.write('S'); myPort.write('S'); println("Stop"); println("User Lost - userId: "+userId ); myPort.write('S'); myPort.write('S'); }

void onEndCalibration(int userId, boolean successful) { if (successful) { println(" User calibrated !!!"); kinect.startTrackingSkeleton(userId); } else { println(" Failed to calibrate user !!!"); kinect.startPoseDetection("Psi", userId); } }

void onStartPose(String pose, int userId) { println("Started pose for user"); kinect.stopPoseDetection(userId); kinect.requestCalibrationSkeleton(userId, true); }

Sign In or Register to comment.