Kinect v2 -同步深度和颜色帧



我目前正在为一个项目寻找一个立体相机,Kinect v2似乎是一个不错的选择。然而,由于这对我来说是一笔相当大的投资,我需要确保它符合我的要求,主要是不同传感器的良好同步。

显然没有传感器的硬件同步,我得到了很多版本关于软件部分:

  1. 一些帖子,人们抱怨两个传感器之间的延迟,还有许多人要求同步传感器的方法。两者似乎都有奇怪的变通方法,没有"官方的",共同的解决方案从答案中浮现。

  2. 一些关于MultiSourceFrame类的帖子,这是Kinect SDK 2.0的一部分。据我所知,这个类使您能够在给定时间检索所有传感器的帧(或更少,您可以选择希望从中获取数据的传感器)。因此,对于给定的瞬间t,您应该能够获得不同传感器的输出,并确保这些输出是同步的。

所以我的问题是,这个MultiSourceFrame类做的正是我所说的吗?如果是的话,为什么它从来没有被作为一种解决方案提出?第一类的帖子似乎是从2013年开始的,所以在SDK 2.0发布之前。但是,MultiSourceFrame类应该取代以前版本SDK的AllFramesReady事件,AllFramesReady也不建议作为解决方案。

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

谢谢你的回答!如果需要,请随时询问更多细节:)

在libfreenect2问题中有一个关于这个问题的讨论,有人特别提到当使用MultiSourceFrameReader:

时RGB和深度帧之间有6.25毫秒的延迟。

ColorFrame的RelativeTime似乎总是比DepthFrame, InfraredFrame, BodyFrame, BodyIndexFrame的RelativeTime滞后6.25或6.375 ms。同时,RelativeTime总是在DepthFrame, InfraredFrame, BodyFrame和BodyIndexFrame之间匹配。

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

所以,虽然深度和RGB帧之间有延迟,即使使用MultiSourceFrameReader,它很可能足够小,所以你可以忽略它。

至于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。

我只使用了MS SDK,但我认为规则适用。上述所有流的相对时间都是相同的原因是因为上述所有流都是在红外帧之外创建的,因此它们都依赖于它。彩色帧不像它来自不同的相机。至于RelativeTime,它基本上是一个TimeSpan(用c#术语来说),它描述了类似于Kinect运行时时钟中帧与帧之间的增量时间。它可能是由Kinect服务创建的,它从传感器获取原始输入,将IR发送给GPU以扩展为Depth(实际上是几帧的平均值),Body和BodyFrame(以及LongExposureIR),然后将它们获取回来,并将数据返回CPU以分发给所有注册的监听器。不同的Kinect v2应用/实例)。另外,在MSDN论坛上看到一个MVP的回复,他说微软警告他们不要使用RelativeTime来做delta时间以外的任何事情。所以我不知道你是否真的可以使用它来手动同步不同的流(即不使用MultiSourceFrameReader)与信心。

最新更新