OpenNI计算用户并通过OSC发送数据

时间:2011-12-24 21:51:56

标签: c++ openframeworks

不太熟悉c ++,但我正在尝试将一些数据发送到java /处理草图。问题是我不知道用户计算xOpenNI的Open Frameworks是多少。我想通过我的kinect相机计算多达3个用户。计算每个用户的平均值并将数据发送到我的处理草图以供进一步使用。

问题是,我有时会得到第二个用户的无穷大数字。有人可以告诉我为什么吗?

使用OpenNISample007.xcodeproj

我已将其改编成剧本:

        if (isMasking) drawMasks();
        for (int i=1; i< recordUser.getNumberOfTrackedUsers()+1; i++){
        if (isCloud) drawPointCloud(&recordUser, i);    // 0 gives you all point clouds; use userID to see point clouds for specific users
        }

然后我使用pointCloud信息通过OSC发送平均值

 float  positionsX ;
float positionsBegin;
int counter = 0;
for(int y = 0; y < h; y += step) {
    for(int x = 0; x < w; x += step) {
        ofPoint pos = user_generator->getWorldCoordinateAt(x, y, userID);
        if (pos.z == 0 && isCPBkgnd) continue;  // gets rid of background -> still a bit weird if userID > 0...
        ofColor color = user_generator->getWorldColorAt(x,y, userID);
    //  glColor4ub((unsigned char)color.r, (unsigned char)color.g, (unsigned char)color.b, (unsigned char)color.a);
        glVertex3f(pos.x, pos.y, pos.z);

        positionsX+=pos.x;
        if (x == 1){

            positionsBegin = pos.x;
        }
        counter++;


    }
}


float average = positionsX/counter;

cout<<"Average:"<<average<<endl;
//cout<<"positionsBegin:"<<positionsBegin<<endl;



ofxOscMessage m;
m.setAddress( "/persons" );
m.addIntArg( userID );

m.addFloatArg(average);


sender.sendMessage( m );

1 个答案:

答案 0 :(得分:0)

据我所知,你是在循环每个用户的像素并试图到达中心? 如果您拥有该用户,则可以使用getCoM()方法获取每个用户的质心,因此您无需遍历用户像素:

float positionX = 0;
int numUsers = user_generator.getNumberOfTrackedUsers();
for(int i = 0 ; i < numUsers; i++){
  XnPoint3D userPos;
  user_generator.getXnUserGenerator().GetCoM(i, userPos);
  positionX += userPos.X;
}
positionX /= numUsers;

请注意,这将为您提供3D空间中的坐标。如果您想在屏幕上显示位置,则需要使用ConvertRealWorldToProjective

转换坐标

不确定是否有帮助,但您可以使用SimpleOpenNI

直接在处理中执行此操作