Kinect v2 - 同步深度和颜色帧

Kinect v2 - Synchronize depth and color frames

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

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

  1. 一些帖子中人们抱怨两个传感器之间存在延迟,还有许多其他帖子要求同步传感器的方法。两者似乎都有奇怪的解决方法并且没有"official",常见的解决方案从答案中出现。

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

所以我的问题是,MultiSourceFrame class 是否完全按照我的意思行事?如果是,为什么从未提出将其作为解决方案?第一类的帖子似乎是 2013 年的,所以在 SDK 2.0 发布之前。然而,MultiSourceFrame class 应该取代旧版本SDK的 AllFramesReady 事件,并且 AllFramesReady 也没有被建议作为解决方案。

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

感谢您的回答!如果需要,请随时询问更多详细信息:)

有人讨论过 libfreenect2 issue, where someone specifically mentioned 使用 MultiSourceFrameReader 时 RGB 和深度帧之间有 6.25 毫秒的延迟:

The RelativeTime of the ColorFrame seems to always lags 6.25 or 6.375 ms behind the RelativeTime of the DepthFrame, InfraredFrame, BodyFrame, BodyIndexFrame. Meanwhile, the RelativeTime always matches among DepthFrame, InfraredFrame, BodyFrame, and 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

安装 Kinect v2 SDK 后,您可以在 CoordinateMapping Basic 示例中找到更多详细信息。

我只使用过 MS SDK,但我认为规则适用。上述所有流的相对时间相同的原因是因为上述所有流都是在 IR 帧之外创建的,因此它们都依赖于它。彩色框不是因为它来自不同的相机。 至于 RelativeTime,它基本上是一个 TimeSpan(在 C# 术语中),它描述了类似于 Kinect 自己的运行时时钟中帧之间的增量时间。它可能是由 Kinect 服务创建的,它从传感器获取原始输入,将 IR 发送到 GPU 以扩展到 Depth(实际上是几个帧的平均值)、Body 和 BodyFrame(以及 LongExposureIR),然后将它们取回并获取返回 CPU 中的数据分发给所有已注册的侦听器(a.k.a。不同的 Kinect v2 apps/instances)。 另请阅读 MSDN 论坛中一位 MVP 的回复,他说 MS 告诫他们不要将 RelativeTime 用于增量时间使用以外的任何用途。所以我不知道您是否真的可以放心地将它用于不同流之间的手动同步(即不使用 MultiSourceFrameReader)。