OpenNI через OpenFrameworks показывает скелет, но не маску пользователя

Я впервые использую OpenFrameworks. Я использую его, чтобы заставить оптический поток OpenCV работать с маской пользователя из OpenNI. Так что мне не нужен скелет. Что мне нужно, так это пользовательская маска от OpenNI.

я использую OpenNI версия 1.5.4.0 а также NITE версия 1.5.2.21 и я на Ubuntu Trusty.

Большинство частей работают, кроме одной: я не вижу маски пользователя. Работают нативные примеры OpenNI: в них я могу видеть пользовательские контуры. Но из OpenFrameworks я не могу получить маску пользователя.

Для каждого пользователя в моем коде OpenFrameworks я могу сделать это:

// "user" is an object returned from ofxOpenNI::getTrackedUser

// This actually displays a skeleton:
user.drawSkeleton();
// These two do nothing:
user.drawMask();
user.drawPointCloud();

Я думаю, что это также верно для представления отладки устройства OpenNI:

// openNiDevice is an instance of ofxOpenNI
openNiDevice.drawDebug();

Это показывает RGB камеру и камеру глубины со скелетом, но я не думаю, что это показывает маску пользователя. Это не совсем ясно, потому что пользовательский контур может быть принят за однородное чтение глубины, но я не думаю, что это так. Я думаю, что даже на экране отладки маска пользователя будет отличаться от цвета глубины.

Я печатаю количество пользователей на экране и могу сказать, что ofxOpenNI действительно обнаруживает пользователей. Кроме того, он показывает скелеты, поэтому он должен видеть что-то.

Опять же, пример приложения OpenNI Sample-NiUserTracker дает мне идеальный план, так что OpenNI должен работать.

Что я делаю неправильно?

0

Решение

Я понял. Где-то в коде маски пользователя число сохраняется как int, но читается как символ. Таким образом, сохранение пикселей пользовательской маски в новом массиве с сохранением только одной из четырех записей дало результат.

В основном это:

const unsigned char * userPix = user.getMaskPixels().getPixels();
int dataSize = user.getMaskPixels().getWidth() * user.getMaskPixels().getHeight() * 4;
unsigned char goodGray[dataSize / 4];
for (int i = 0; i < dataSize; i += 4) {
goodGray[i / 4] = userPix[i];
}

goodGray теперь содержит правильные пиксели и может быть использован для ofImage объект.

0

Другие решения


По вопросам рекламы [email protected]