Kinect SDK中的OpenNI2+Nite2 isNew() isLost()方法
OpenNI2+Nite2 isNew() isLost() methods in Kinect SDK
我最近为一个项目从OpenNI2+Nite2配置切换到官方Kinect SDK。在晚上我的代码是这样的:
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*/}
但是,我找不到与 Kinect SDK 中的 isNew 和 isLost 功能相同的方法。我自己实现了isNew方法,但是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;
}
}
}
基本上,如果骨架丢失,我会尝试在骨架框架的每次更新中删除名为 g3D 的地图中骨架的专用插槽。
感谢任何想法或敏锐的眼光。
最后我通过计算没有跟踪骨架的帧数解决了这个问题。骨架数据有 6 个槽,在某些帧中,其跟踪 ID 未设置为 NUI_SKELETON_TRACKED。
因此,如果空骨架插槽的数量超过 20(这意味着大约 3-4 个连续的空帧),我认为用户丢失了。
// 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;
}
}
}
希望对别人有帮助
我最近为一个项目从OpenNI2+Nite2配置切换到官方Kinect SDK。在晚上我的代码是这样的:
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*/}
但是,我找不到与 Kinect SDK 中的 isNew 和 isLost 功能相同的方法。我自己实现了isNew方法,但是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;
}
}
}
基本上,如果骨架丢失,我会尝试在骨架框架的每次更新中删除名为 g3D 的地图中骨架的专用插槽。
感谢任何想法或敏锐的眼光。
最后我通过计算没有跟踪骨架的帧数解决了这个问题。骨架数据有 6 个槽,在某些帧中,其跟踪 ID 未设置为 NUI_SKELETON_TRACKED。 因此,如果空骨架插槽的数量超过 20(这意味着大约 3-4 个连续的空帧),我认为用户丢失了。
// 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;
}
}
}
希望对别人有帮助