Я впервые использую 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 должен работать.
Что я делаю неправильно?
Я понял. Где-то в коде маски пользователя число сохраняется как 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
объект.