这是我第一次使用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 :(得分:0)
我明白了。在用户掩码中的某处,数字保存为int但读为char。因此,将用户掩码的像素保存到一个新数组中,但只保留四个条目中的一个就可以了。
基本上这个:
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
对象。