Kinect红外视图是否具有Kinect深度视图的偏移

时间:2013-06-05 18:35:09

标签: opencv kinect

我正在使用红外视图和深度视图处理Kinect项目。在红外视图中,使用CVBlob库,我能够提取一些感兴趣的2D点。我想找到这些2D点的深度。所以我认为我可以直接使用深度视图,如下所示:

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

我不认为这是获得深度的正确公式。 我能够在深度视图中可视化2D关注点。如果我在红外视图中得到一个点(x,y),那么我在(x,y)深度视图中将其绘制为红点
我注意到红点不是我期望它们(在一个物体上)。他们的位置存在系统性错误。

我认为深度视图和红外视图具有一对一的对应关系,而不像颜色视图和深度视图之间的对应关系。
这确实是真的还是IR和深度视图之间有偏差?如果有偏移量,我能以某种方式获得正确的深度值吗?

4 个答案:

答案 0 :(得分:3)

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

  1. <强>相机

    • IR /深度FOV 58.5°x 45.6°
    • 颜色FOV 62.0°x 48.6°
    • 相机之间的距离为25mm
  2. 我对两个流的640x480分辨率的修正

    if (valid depth)
     {
     ax=(((x+10-xs2)*241)>>8)+xs2;
     ay=(((y+30-ys2)*240)>>8)+ys2;
     }
    
    • x,y位于深度图中的坐标
    • ax,ay是彩色图片中的坐标
    • xs,ys = 640,480
    • xs2,ys2 = 320,240

    你可以看到我的 kinect 也有y偏移,这很奇怪(甚至比x偏移更大)。我的转换效果在2 m范围内效果很好我没有进一步衡量,但它应该可以正常工作

  3. 不要忘记从深度和深度图像坐标校正空间坐标

    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;
    
    • 其中px,py,pz是空间[m]中的点坐标,相对于 kinect

    我使用相反Z方向的相机的坐标系因此否定符号

  4. PS。我有旧型号1414,所以新型号可能有不同的校准参数

答案 1 :(得分:1)

“红外视图”和“深度视图”之间没有偏移。主要是因为它们是一回事。

Kinect有2个摄像头。 RGB彩色相机和深度相机,它使用IR发射器生成在处理数据时使用的场光场。这些为您提供彩色视频流和深度数据流;没有与深度数据分开的“红外视图”。

enter image description here

<强>更新

它们实际上是同一件事。你所说的“深度视图”只是“红外视图”的彩色版本;黑白图像是“原始”数据,而彩色图像是相同数据的处理版本。

Kinect for Windows Toolkit中,查看KinectWpfViewers项目(如果您安装了KinectExplorer-WPF示例,它应该在那里)。有KinectDepthViewerDepthColorizer类。他们将演示如何创建彩色“深度视图”。

更新2:

以下评论我上面所说的几乎完全是垃圾。我可能会在不久的将来编辑它或者完全删除我的答案,直到那时它将证明我曾经无效的信念来自哪里。

无论如何......看看CoordinateMapper类作为另一种可能的解决方案。该链接将带您进入托管代码文档(这是我熟悉的),我正在查看C ++文档以查看是否可以找到相应的文档。

我用它来映射标准颜色和深度视图。它也可以同样映射IR视图(我不明白为什么不这样做),但我不是百分之百确定。

答案 2 :(得分:0)

答案 3 :(得分:0)

此代码适用于Kinect的跟踪器的许多位置:

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