我目前正在为项目寻找立体摄影机,而Kinect v2似乎是个不错的选择。但是,由于这对我来说是一笔不小的投资,我需要确保它符合我的要求,主要是不同传感器的良好同步。
显然传感器没有硬件同步,我得到了很多关于软件部分的版本:
一些帖子,人们抱怨两个传感器之间的延迟,还有许多其他人要求采用同步传感器的方法。两者似乎都有奇怪的解决方法而且没有#34;官方",这些答案都会出现。
有关MultiSourceFrame
类的一些帖子,它是Kinect SDK 2.0的一部分。根据我的理解,这个类使您能够在给定时间检索所有传感器的帧(或更少,您可以选择要从中获取数据的传感器)。因此,对于给定的时刻t,您应该能够获得不同传感器的输出,并确保这些输出是同步的。
所以我的问题是,这个MultiSourceFrame
课程正是我的意思吗?如果是的话,为什么它从未被提出作为解决方案?看起来第一类的帖子是从2013年开始,所以在SDK 2.0发布之前。但是,MultiSourceFrame
类应该替换以前版本SDK的AllFramesReady
事件,并且AllFramesReady
也不建议作为解决方案。
不幸的是,文档并没有提供有关它如何工作的大量信息,所以我在这里询问是否有人已经使用过它。如果我的问题看起来很愚蠢,我很抱歉,但在购买这样的相机之前我想确定一下。
感谢您的回答!如果需要,可以随时询问更多细节:)
答案 0 :(得分:1)
在libfreenect2 issue进行了讨论,使用MultiSourceFrameReader
时,有人specifically mentioned在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
安装Kinect v2 SDK后,您可以在CoordinateMapping Basic
示例中找到更多详细信息。
答案 1 :(得分:0)
我只使用了MS SDK,但我认为规则适用。上述所有流的相对时间相同的原因是,以上所有流都是在IR帧之外创建的,因此它们都依赖于IR帧。色框不是因为它来自其他相机。 至于RelativeTime,它基本上是一个TimeSpan(用C#来讲),它描述了Kinect自己的运行时时钟中帧之间的增量时间。它可能是由Kinect服务创建的,该服务从传感器获取原始输入,将IR发送到GPU以扩展为Depth(实际上是几帧的平均值),Body和BodyFrame(以及LongExposureIR),然后将它们取回并获取数据返回到CPU中以分发给所有已注册的侦听器(又名不同的Kinect v2应用程序/实例)。 还可以在MSDN论坛上阅读MVP的回复,该回复说MS提醒他们不要将RelativeTime用于除增量时间之外的任何用途。因此,我不知道您是否真的可以自信地将其用于单独的流之间的手动同步(即,不使用MultiSourceFrameReader)。