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