我对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 回答
OpenNI似乎默认设计为根据每帧存储的时间戳以它们记录的速率回放帧 . 这意味着默认情况下,如果在两个帧读取之间进行某些处理,则可能会跳过某些帧 .
如果使用OpenNI2,请将播放速度设置为-1 . 这将导致所有帧都被手动读取,即每个帧将逐个通过VideoStream :: readFrame()读取,并且不会跳过或丢失任何帧 .
请注意,OpenNI 1(据我所知1.5.7)不允许将播放速度设置为-1,因此可能需要一种不同的方式逐个读取帧 .