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

时间:2014-07-06 14:51:16

标签: kinect frames openni

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

如果我使用基本示例来读取Kinect(或#34; .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 :(得分:0)

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

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

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

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