首页 文章

从“.oni”文件读取时,OpenNI从Kinect丢失帧

提问于
浏览
1

我对OpenNI有一个简单的问题:

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

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

    g_depth.GetMetaData(g_depthMD);

    mystuff();
}
// Missing close

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

另一个问题 :

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

1 回答

  • 0

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

    如果使用OpenNI2,请将播放速度设置为-1 . 这将导致所有帧都被手动读取,即每个帧将逐个通过VideoStream :: readFrame()读取,并且不会跳过或丢失任何帧 .

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

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

相关问题