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