none
OpenNI2+Nite2 isNew() isLost() methods in Kinect SDK RRS feed

  • Question

  • I recently switched from OpenNI2+Nite2 confuguration to official Kinect SDK for a project. In nite my code goes like this:

    const nite::Array<nite::UserData>& users = frame.getUsers();
    
    for (int i=0; i<users.getSize(); i++){
        const nite::UserData& user = users[i]; 
    
    if(user.isNew()){/* do this */}
    if(user.isLost()){/* do that */}
    else {/* update*/}
    

    However, I couldn't find a method that does the same thing as isNew & isLost in Kinect SDK. I implemented my own method for isNew, but I failed in isLost.

        // handle user exit
    map<string,Group3D*> g3D_copy = g3D;
    
    for(map<string,Group3D*>::iterator mit = g3D_copy.begin();mit != g3D_copy.end();mit++){
    
    
        if(mit->second->getType() == "KINECT_SKELETON")
        {
            string groupID = mit->first;
            int countExistance2 = 0;
    
            for (int i = 0; i < NUI_SKELETON_COUNT; i++){
    
                int userID = (int)SkeletonFrame.SkeletonData[i].dwTrackingID;
                char buffer [33];
                sprintf(buffer,"%lu",SkeletonFrame.SkeletonData[i].dwTrackingID);
                string myID2 = buffer;
                cout << "groupID " << groupID << endl;
                cout << "myID2 " << myID2 << endl;
                if(myID2 == groupID){ countExistance2++;}       
    
            }
            // user lost
            if(countExistance2 == 0){
                delete g3D[groupID];
                g3D.erase(groupID);
                cout << "*************deleted*******" << endl;
            }
        }
    
    }
    

    Basicly, I am trying to erase the dedicated slot to a skeleton in a map called g3D in every update of the skeleton frame if the skeleton is lost.

    Any ideas or sharp eyes are appreciated.

    Thursday, March 19, 2015 3:12 PM

Answers

  • Finally I solved the problem by counting the frames which do not have a tracked skeleton. Skeleton data has 6 slots and in some frames its tracking id is not set to NUI_SKELETON_TRACKED. Thus, If the number of empty skeleton slots exceeds 20 (which means appx 3-4 successive empty frames), I assume the user is lost.

        // handle user exit
    // The skeleton is not tracked in every successive frame, so use g3DCounts to count the number of frames
    map<string,Group3D*> g3D_copy = g3D;
    
    for(map<string,Group3D*>::iterator mit = g3D_copy.begin();mit != g3D_copy.end();mit++){
    
        if(mit->second->getType() == "KINECT_SKELETON")
        {
            string groupID = mit->first;
    
            for (int i = 0; i < NUI_SKELETON_COUNT; i++){
                char buffer [33];
                sprintf(buffer,"%lu",SkeletonFrame.SkeletonData[i].dwTrackingID);
                string myID2 = buffer;
                if(myID2 == groupID){ g3DCounts[groupID] = 0;}
                else{ g3DCounts[groupID] += 1;}
            }
    
            if(g3DCounts[groupID] > 20){
                delete g3D[groupID];
                g3D.erase(groupID);
                cout << "*************deleted successfully*******" << endl;
            }
        }
    }
    

    Hope it helps others

    Monday, March 23, 2015 9:34 AM