2016-11-16 114 views
2

我目前正在寻找一个立体摄像机的项目和Kinect的V2似乎是一个不错的选择。然而,由于这对我来说是一笔相当大的投资,我需要确保它符合我的要求,主要的是不同传感器的同步。的Kinect V2 - 同步颜色的深浅和帧

显然有传感器的无硬件同步,和我得到的软件部分很多版本:

  1. 一些帖子,人们抱怨的两个传感器之间的滞后,以及许多其他要求的方式同步传感器。这两种方法似乎都有奇怪的解决方法,没有“官方”的解决办法。

  2. MultiSourceFrame类,这是超高动力学SDK 2.0的一部分的一些文章。据我了解,这个类可以检索所有传感器的框架(或更少,你可以选择你想从数据哪些传感器)在给定时间。因此,您应该能够在给定的瞬间t得到不同传感器的输出并确保这些输出同步。

所以我的问题是,这是MultiSourceFrame类做正是我的意思吗?如果是的话,为什么它从未被提议为解决方案?看来第一类的帖子是从2013年开始的,所以在SDK 2.0发布之前。然而,MultiSourceFrame类应该更换AllFramesReady事件SDK的以前版本,并AllFramesReady不建议作为一个解决办法。

不幸的是,文档没有提供很多关于它是如何工作的信息,所以我在这里问,以防有人会使用它。如果我的问题看起来很愚蠢,我很抱歉,但我想在购买这样的相机之前确定。

谢谢你的回答!而且如果需要的话:)随意询问更多细节

+0

...但Kinect v2的更大问题是硬件要求,尤其是USB 3.0控制器。除非你尝试过,否则你永远不会知道你的工作是否正常。 – HenningJ

+0

@HenningJ非常感谢您的回答!从来没有发现过这个问题,所以这里真的很有帮助。你能详细介绍一下这个USB 3.0的问题吗? –

+0

根据官方要求,您需要英特尔或瑞萨USB 3.0控制器。但即使如此,很难预测它的工作能力,也就是说它是否能够工作,或者如果能够工作,那么您将获得多少FPS。要知道的唯一方法就是尝试一下。如果它不能与你内置的USB 3控制器一起工作,那么应该有很多USB 3 PCIe扩展卡。 – HenningJ

回答

1

有在libfreenect2 issue,有关的讨论,其中有人specifically mentioned使用MultiSourceFrameReader时RGB和深度框架之间的6.25毫秒延迟:

的在ColorFrame的RELATIVETIME似乎总是落后于DepthFrame,InfraredFrame,BodyFrame,BodyIndexFrame的RELATIVETIME 6.25或6.375毫秒。同时,RelativeTime总是匹配DepthFrame,InfraredFrame,BodyFrame和BodyIndexFrame。

在我自己的实验中,我得到了相同的结果。但这只是基于帧的时间戳。这些时间戳直接来自Kinect v2设备,所以它不太可能,但仍然有可能它们不是100%正确的。

因此,即使在使用MultiSourceFrameReader时,深度和RGB帧之间存在滞后,但它很可能足够小,因此您可以忽略它。

至于MultiSourceFrame/MultiSourceFrameReader的使用,这是很简单的,一旦你习惯了Kinect的V2 SDK:

m_pKinectSensor->OpenMultiSourceFrameReader(
    FrameSourceTypes::FrameSourceTypes_Depth | FrameSourceTypes::FrameSourceTypes_Color, 
    &m_pMultiSourceFrameReader); 

// get "synced" frame 
IMultiSourceFrame* pMultiSourceFrame = NULL; 
m_pMultiSourceFrameReader->AcquireLatestFrame(&pMultiSourceFrame); 

// get depth frame 
IDepthFrameReference* pDepthFrameReference = NULL; 
pMultiSourceFrame->get_DepthFrameReference(&pDepthFrameReference); 
IDepthFrame* pDepthFrame = NULL; 
pDepthFrameReference->AcquireFrame(&pDepthFrame); 

// get RGB frame 
IColorFrameReference* pColorFrameReference = NULL; 
pMultiSourceFrame->get_ColorFrameReference(&pColorFrameReference); 
IColorFrame* pColorFrame = NULL; 
pColorFrameReference->AcquireFrame(&pColorFrame); 

// ... now use both frames 

您可以CoordinateMapping Basic样品中发现更多的细节,一旦你安装了Kinect的V2 SDK 。

+1

你好。我是该GitHub问题的作者。为了澄清,我不认为RelativeTime来自Kinect V2设备。 libfreenect2的作者已经对USB数据包进行了反向设计,并且这些数据包的时间戳具有错误的分辨率。 RelativeTime具有0.1微秒的分辨率,但USB数据包只有0.1毫秒分辨率的时间戳。所以我的猜测是RelativeTime是在PC上计算的,而不是在Kinect V2设备上计算的。 – Kal