【问题标题】:OpenNI missing frames from Kinect when reading from ".oni" file从“.oni”文件读取时,OpenNI 从 Kinect 中丢失帧
【发布时间】:2015-10-29 12:48:13
【问题描述】:

我有一个关于 OpenNI 的简单问题:

如果我使用基本示例来读取 Kinect(或“.oni”文件),如下所示:

// Missing init
while(true) {
    // Read a new frame
    rc = g_context.WaitAnyUpdateAll();

    g_depth.GetMetaData(g_depthMD);

    mystuff();
}
// Missing close

如果 mystuff() 操作需要 100 毫秒,是否会跳过下一帧(因为 Kinect 是 30FPS,所以每帧 33 毫秒)我会错过它们,或者是否有任何缓冲区可以将它们保存在 Kinect 或 OpenNI 中?假设我将一些 JPEG 保存到磁盘,但我没有得到所有图像(时间戳:0,33,66,133,200,...)

另一个问题:

每当我保存到“.oni”文件然后从中读取时,都会丢失帧,这是因为写入磁盘会使程序跳过帧(与上述相同的情况,但在 Record() 方法内)?当我从实时 Kinect 读取所有帧时(时间戳:0,33,66,100,133,166,200,...)

【问题讨论】:

  • 我可以回答你的第二个问题。 Kinect 可能会达到 30 fps,但如果你用它做一些事情(包括保存到磁盘中),那么你会消耗时间。如果在这段时间你得到另一个帧,并且你的程序很忙,那么这个帧将被省略,你会得到下一个......所以最后你会有 20 fps。我的建议是不要使用 ONI,将信息保存为图像或 PCD 文件并以您需要的速度加载它们......另外我建议先保存在内存中,然后如果你有足够的 RAM 将其转储到硬盘中
  • 谢谢,这正是我需要知道的,在其他地方还没有找到。如果您有一些更详细地讨论这个问题的来源,请随时分享。就我而言,我必须将其另存为 .oni,因为我需要将我的测量结果链接到我的结果,以便任何人都可以重做它们,而我没有时间实施自定义方法来保存信息。
  • 我不会推荐 ONI。你也可以看看openni2他们有一些你可以选择你想使用的框架,虽然openni 1和2的ONI不兼容......我为我的工作创建了一个捕获工具,以不同的格式保存数据如果您愿意,可以使用github.com/cvlabbonn/tools_openni2

标签: kinect frames openni


【解决方案1】:

OpenNI 似乎默认设计为根据每帧存储的时间戳以记录的速率播放帧。这意味着默认情况下,如果在两次读取帧之间进行了某些处理,则可能会跳过某些帧。

如果使用 OpenNI2,请将播放速度设置为 -1。这会导致所有帧都被手动读取,即每一帧都要通过VideoStream::readFrame()一帧一帧地读取,不会有跳帧或漏帧。

device.getPlaybackControl()->setSpeed(-1);

请注意,OpenNI 1(据我所知为 1.5.7)不允许将播放速度设置为 -1,因此可能需要一种不同的方式来逐帧读取。

【讨论】:

  • 谢谢,但我当时被 OpenNI 1 卡住了,但很高兴知道其他人是否需要这些信息
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-10
  • 2019-09-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多