Kinect SimpleOpenNI和处理范围

时间:2012-07-12 10:09:24

标签: range kinect processing openni

我需要找到一种方法让kinect只识别某个范围内的对象。问题是,在我们的设置中,场景中的观众可能会干扰跟踪。因此,我需要将kinect设置为几米的范围,这样它就不会受到超出该范围的物体的干扰。我们正在使用SimpleOpenNI库进行处理。

有没有可能以任何方式实现这样的目标?

非常感谢你。

利玛

1 个答案:

答案 0 :(得分:1)

你可以获得用户的质心(CoM),它可以为没有骨架检测的用户检索x,y,z位置:

OpenNI user CoM

根据z位置,您应该能够为范围/阈值使用基本的if语句。

import SimpleOpenNI.*;

SimpleOpenNI context;//OpenNI context
PVector pos = new PVector();//this will store the position of the user
ArrayList<Integer> users = new ArrayList<Integer>();//this will keep track of the most recent user added
float minZ = 1000;
float maxZ = 1700;

void setup(){
  size(640,480);
  context = new SimpleOpenNI(this);//initialize
  context.enableScene();//enable features we want to use
  context.enableUser(SimpleOpenNI.SKEL_PROFILE_NONE);//enable user events, but no skeleton tracking, needed for the CoM functionality
}
void draw(){
  context.update();//update openni
  image(context.sceneImage(),0,0);
  if(users.size() > 0){//if we have at least a user
    for(int user : users){//loop through each one and process
      context.getCoM(user,pos);//store that user's position
      println("user " + user + " is at: " + pos);//print it in the console
      if(pos.z > minZ && pos.z < maxZ){//if the user is within a certain range
        //do something cool 
      }
    }
  }
}
//OpenNI basic user events
void onNewUser(int userId){
  println("detected" + userId);
  users.add(userId);
}
void onLostUser(int userId){
  println("lost: " + userId);
  users.remove(userId);
}

您可以在我发布的这些workshop notes中找到更多解释和希望有用的提示。