OpenNI подсчитывает пользователей и отправляет данные через OSC - PullRequest
0 голосов
/ 25 декабря 2011

не очень знаком с с ++, но я пытаюсь отправить некоторые данные в эскиз Java / обработки. Проблема в том, что я не знаю, каково количество пользователей для Open Frameworks ofOpenNI. Я хочу посчитать до 3 пользователей через мою камеру Kinect. Рассчитайте среднее значение для каждого пользователя и отправьте данные в мой эскиз обработки для дальнейшего использования.

Проблема в том, что иногда я получаю бесконечное число второго пользователя. Может кто-нибудь сказать мне, почему?

Использование 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 голосов
/ 05 августа 2012

Насколько я понимаю, вы просматриваете пиксель каждого пользователя и пытаетесь добраться до центра?Если у вас есть пользователь, вы можете использовать метод 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;

Обратите внимание, что это даст вам координаты в трехмерном пространстве.Если вам нужна позиция на экране, вам нужно преобразовать координаты, используя ConvertRealWorldToProjective

Не уверен, поможет ли это, но вы можете сделать это непосредственно в Обработка с использованием SimpleOpenNI

...