0

我很难理解当 kinect 与慢速计算机一起使用或需要大量逐帧计算时真正发生的情况。

让我们考虑用于恢复深度的C# 示例代码。

运行时动态由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
  • 如果我的操作花费的时间比标称的帧间时间(33 毫秒)长,会发生什么?
  • kinect里面有缓冲吗?

任何帮助表示赞赏。

4

2 回答 2

1

根据这里的教程:

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

于 2013-09-27T13:30:02.250 回答
0

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

他们可能在后台引发线程,指针指向新缓冲区,然后通过更改缓冲区指针(新帧加载完成)他们只交换指针,有效地导致旧线程和旧数据的空指针而新线程具有新数据(只要该线程处于活动状态,数据就会保持不变)。但是已经排队的线程不包含数据(指针已交换),因此对于您的应用程序,胎面队列不会建立。并且旧线程图像数据也不会排队。

嗯,这就是我认为它的工作原理,但我没有他们的源代码,没有人有。

于 2016-03-25T14:58:51.570 回答