//---------------------------------------- void ofxOpenNITracker::update(){ vector<XnUserID> userIds(MAX_NUMBER_USERS); XnUInt16 nUsers = userIds.size(); xn::UserGenerator& user_generator = openNI->getUserGenerator(); user_generator.GetUsers(&userIds[0], nUsers); userIds.resize(nUsers); unsigned int stateHasMask = (ofxOpenNIUser::Found | ofxOpenNIUser::NeedsPose | ofxOpenNIUser::Calibrating | ofxOpenNIUser::StartTracking | ofxOpenNIUser::Tracking ); for(int i = 0; i < nUsers; ++i) { unsigned int nID = userIds[i]; ofxOpenNIUser& user = users[nID]; if((user.state & stateHasMask)) { user.id = nID; XnPoint3D center; user_generator.GetCoM(nID, center); user.center = toOf(center); if (usePointClouds) updatePointClouds(user); if (useMaskPixels) updateUserPixels(user); } if(user.state & ofxOpenNIUser::HasSkeleton) { for(int j=0;j<ofxOpenNIUser::NumLimbs;j++){ XnSkeletonJointPosition a,b; user_generator.GetSkeletonCap().GetSkeletonJointPosition(nID, user.limbs[j].start_joint, a); user_generator.GetSkeletonCap().GetSkeletonJointPosition(nID, user.limbs[j].end_joint, b); user_generator.GetSkeletonCap().GetSkeletonJointOrientation(nID, user.limbs[j].start_joint, user.limbs[j].orientation); if(a.fConfidence < 0.3f || b.fConfidence < 0.3f) { user.limbs[j].found = false; continue; } user.limbs[j].found = true; user.limbs[j].begin = openNI->worldToProjective(a.position); user.limbs[j].end = openNI->worldToProjective(b.position); user.limbs[j].worldBegin = toOf(a.position); user.limbs[j].worldEnd = toOf(b.position); } } } map<XnUserID, ofxOpenNIUser>::iterator it; for(it=users.begin();it!=users.end();it++){ if(std::find(userIds.begin(), userIds.end(), it->first)==userIds.end()){ users.erase(it); } } }
//---------------------------------------- void ofxOpenNITracker::update(){ vector<XnUserID> users(MAX_NUMBER_USERS); XnUInt16 max_users = MAX_NUMBER_USERS; user_generator.GetUsers(&users[0], max_users); set<XnUserID> current_tracked_users; for(int i = 0; i < MAX_NUMBER_USERS; ++i) { if(user_generator.GetSkeletonCap().IsTracking(users[i])) { ofxOpenNIUser & user = tracked_users[users[i]]; user.id = users[i]; XnPoint3D center; user_generator.GetCoM(users[i], center); user.center = toOf(center); for(int j=0;j<ofxOpenNIUser::NumLimbs;j++){ XnSkeletonJointPosition a,b; user_generator.GetSkeletonCap().GetSkeletonJointPosition(user.id, user.limbs[j].start_joint, a); user_generator.GetSkeletonCap().GetSkeletonJointPosition(user.id, user.limbs[j].end_joint, b); user_generator.GetSkeletonCap().GetSkeletonJointOrientation(user.id,user.limbs[j].start_joint, user.limbs[j].orientation); if(a.fConfidence < 0.3f || b.fConfidence < 0.3f) { user.limbs[j].found = false; continue; } user.limbs[j].found = true; user.limbs[j].begin = openNI->worldToProjective(a.position); user.limbs[j].end = openNI->worldToProjective(b.position); user.limbs[j].worldBegin = toOf(a.position); user.limbs[j].worldEnd = toOf(b.position); } if (usePointClouds) updatePointClouds(user); if (useMaskPixels) updateUserPixels(user); current_tracked_users.insert(user.id); } } set<XnUserID>::iterator it; for(it=prev_tracked_users.begin();it!=prev_tracked_users.end();it++){ if(current_tracked_users.find(*it)==current_tracked_users.end()){ tracked_users.erase(*it); } } prev_tracked_users = current_tracked_users; tracked_users_index.assign(prev_tracked_users.begin(),prev_tracked_users.end()); //if (useMaskPixels) updateUserPixels(); }