【问题标题】:OpenNI through OpenFrameworks shows skeleton but not user maskOpenNI 通过 OpenFrameworks 显示骨架但不显示用户掩码
【发布时间】:2016-11-22 05:43:19
【问题描述】:

这是我第一次使用 OpenFrameworks。我正在使用它来让 OpenCV 的光流与来自 OpenNI 的用户掩码一起工作。所以我不需要骨架。我需要的是来自 OpenNI 的用户掩码。

我正在使用 OpenNI 版本 1.5.4.0NITE 版本 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 一定可以工作。

我做错了什么?

【问题讨论】:

    标签: c++ openni openframeworks nite


    【解决方案1】:

    我想通了。在用户掩码代码的某处,一个数字被保存为 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 对象。

    【讨论】:

      猜你喜欢
      • 2017-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-06
      • 2014-05-05
      • 1970-01-01
      相关资源
      最近更新 更多