Kinect机制:丢帧会去哪里? - 帧率事件

时间:2013-09-26 13:08:29

标签: c# kinect kinect-sdk

我很难理解当kinect与慢速计算机一起使用时会发生什么,或者需要进行大量的逐帧计算。

让我们考虑C# sample code来恢复深度。

运行时动态由DepthFrameReady事件驱动。在触发此类事件时,将调用此处报告的函数DepthImageReady

 private void DepthImageReady(object sender, DepthImageFrameReadyEventArgs e)
 {
    using (DepthImageFrame depthFrame = e.OpenDepthImageFrame())
    {
        if (depthFrame != null)
        {
           depthFrame.CopyDepthImagePixelDataTo(this.depthPixels);

           //MY OPERATIONS BLABLABLA...
        } 
        else
        {
         // depthFrame is null because the request did not arrive in time
        }
    }
 }

我的互相关问题是:

  • 这个功能实际上是每帧调用的吗?
  • depthFrame怎么可能Null
  • 如果我的操作时间超过标称帧间时间(33ms),会发生什么?
  • kinect里面有缓冲区吗?

任何帮助表示感谢。

2 个答案:

答案 0 :(得分:1)

根据这里的教程:

根据该教程,每个帧都会触发事件(即在事件队列中排队),但是如果处理前一帧的时间过长,您会发现在处理下一帧时OpenDepthImageFrame()方法将返回null,表示帧数据不再可用。

答案 1 :(得分:0)

我认为机制是它只是一个缓冲区 当有数据时,会引发事件(图像检索的开始)。 由于数据未存储(它没有排队),因此每次启动的新线程都会再次擦除和写入数据。所以有检查!= null

他们可能在后台提升线程,指针指向新的缓冲区,然后通过更改缓冲区指针(一个新的帧加载完成),它们只交换指针,有效地导致旧线程的空指针新线程具有新数据时的旧数据(只要该线程处于活动状态,数据就会保留)。但已经排队的线程然后不包含数据(指针被交换),所以对你的应用程序然后胎面队列不会累积。和旧线程图像数据也不会排队。

这就是我认为它的工作方式,但我没有源代码,没有人拥有。