Kinect红外视图与Kinect深度视图是否存在偏移?

5

我正在进行一个基于Kinect的项目,使用红外视图和深度视图。在红外视图中,使用CVBlob库,我能够提取一些2D感兴趣点。我想找到这些点的深度。所以我想直接使用深度视图,像这样:

coordinates3D[0] = coordinates2D[0];
coordinates3D[1] = coordinates2D[1];
coordinates3D[2] = (USHORT*)(LockedRect.pBits)
[(int)coordinates2D[1] * Width + (int)coordinates2D[0]] >> 3;

我认为这不是获取深度的正确公式。 我能够在深度视图中可视化感兴趣的二维点。如果我在红外视图中得到一个点(x, y),那么我会在深度视图的(x, y)处绘制一个红色点。
我注意到红色点的位置与我的预期不符(在物体上)。它们的位置存在系统性误差。
我认为深度视图和红外视图具有一一对应关系,不像彩色视图和深度视图之间的对应关系。
这是否确实如此,还是红外和深度视图之间存在偏移?如果存在偏移,我能否以某种方式获取正确的深度值?
4个回答

3

深度和颜色流不是从同一点取得的,因此它们不能完美地对应。此外,它们的FOV(视野)也不同。

  1. cameras

    • IR/Depth FOV 58.5° x 45.6°
    • Color FOV 62.0° x 48.6°
    • distance between cameras 25mm
  2. my corrections for 640x480 resolution for both streams

    if (valid depth)
     {
     ax=(((x+10-xs2)*241)>>8)+xs2;
     ay=(((y+30-ys2)*240)>>8)+ys2;
     }
    
    • x,y are in coordinates in depth image
    • ax,ay are out coordinates in color image
    • xs,ys = 640,480
    • xs2,ys2 = 320,240

    as you can see my kinect has also y-offset which is weird (even bigger then x-offset). My conversion works well on ranges up to 2 m I did not measure it further but it should work even then

  3. do not forget to correct space coordinates from depth and depth image coordinates

    pz=0.8+(float(rawdepth-6576)*0.00012115165336374002280501710376283);
    px=-sin(58.5*deg*float(x-xs2)/float(xs))*pz;
    py=+sin(45.6*deg*float(y-ys2)/float(ys))*pz;
    pz=-pz;
    
    • where px,py,pz is point coordinate in [m] in space relative to kinect

    I use coordinate system for camera with opposite Z direction therefore the negation of sign

提示:我的旧型号为1414,因此较新的型号可能具有不同的校准参数


2
“IR View” 和 “Depth View” 之间没有偏移。这主要是因为它们是相同的东西。
Kinect有两个摄像头。一个是RGB彩色摄像头,另一个是深度摄像头,使用红外发射器生成用于处理数据的光场。这些给您提供了一个彩色视频流和一个深度数据流;没有单独的“IR视图”,与深度数据分离。

enter image description here

更新:
实际上它们是同一件事。你所说的“深度视图”只是“IR视图”的彩色版本;黑白图像是“原始”数据,而彩色图像是相同数据的处理版本。
Kinect for Windows Toolkit中,查看KinectWpfViewers项目(如果您安装了KinectExplorer-WPF示例,则应该在那里)。在那里有KinectDepthViewerDepthColorizer类。它们将演示如何创建彩色的“深度视图”。
更新2:
根据下面的评论,我上面所说的几乎全部都是废话。我可能会在不久的将来编辑或完全删除我的答案,在此之前,它将作为我曾经对从哪里来的东西持有的无效信仰的证明。
无论如何...看一下CoordinateMapper类,作为另一个可能的解决方案。该链接将带您进入托管代码文档(这是我熟悉的),我正在查找等效的C++文档。
我已经使用它来映射标准的颜色和深度视图。它也可以很好地映射红外视图(我不知道为什么不能),但我不确定这一点。

感谢回复。实际上,与深度视图分开的独立IR视图是存在的。我将发布标准Kinect Explorer应用程序的屏幕截图,显示两个视图。通过将图像并排查看,它们似乎具有一对一的对应关系,没有偏移;我想确认这一点是事实,而不仅仅是观察结果。 - Aparajith Sairam
深度视图可用于推断位置(x,y)处的深度,而IR视图不能直接用于执行相同的操作。通过将IR图像与标准斑点模式进行比较来推断深度,然后显示为深度视图中的像素强度描绘物理深度。因此,将深度视图称为IR视图的彩色版本是不准确的。此外,IR视图是由Kinect的IR接收器捕获的真实图像,并可用于计算机视觉算法,而深度视图主要用于推断深度。 - Aparajith Sairam
有趣的是,我发现偏移量为23可以使得这两个视图对齐。这完全是通过试验得出的,但它适用于沿X、Y和Z方向上不同距离的Kinect。请参见下面的注释以获取我的新代码: - Aparajith Sairam
实际上,在深入挖掘并审查ColorImageFormat类之后,我发现红外数据是由彩色相机读取的。我原本以为深度相机会读取和处理该流。我所包含的图像只是误导性的...而我所说的信息是纯粹的垃圾!请查看答案更新,其中包含一些可能有用的提示... - Nicholas Pappas
深度相机(也可以称为红外相机)确实可以读取红外数据。当我用手指遮住最右边的相机(即红外接收器)时,它关闭了深度和红外视图。遮盖彩色相机对深度和红外视图没有影响。这清楚地表明红外相机完成全部深度处理。但我理解你的意思。存在不同的彩色和深度流,而红外流没有被赋予单独的身份,可以通过调整彩色流来输出红外视图,这是一个反直觉的API设计决策,我认为。 - Aparajith Sairam

1

1
我已经为您将图片插入文章中。请查看下面答案的其他评论以获取更多信息。 - Nicholas Pappas

0

这段代码适用于 Kinect 中跟踪器的许多位置:

coordinates3D[0] = coordinates2D[0];
coordinates3D[1] = coordinates2D[1];
coordinates3D[2] = (USHORT*)(LockedRect.pBits)
[(int)(coordinates2D[1] + 23) * Width + (int)coordinates2D[0]] >> 3;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接