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

0

Это мой первый раз, используя 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 должен работать.

Что я делаю не так?

Теги:
openframeworks
openni
nite

1 ответ

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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню