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;

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

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

4

4 回答 4

3

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

  1. 相机

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

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

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

于 2013-11-11T11:58:56.947 回答
2

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

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

在此处输入图像描述

更新:

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

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

更新 2:

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

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

我用它来映射标准颜色和深度视图。它也可以映射 IR 视图(我不明白为什么不这样做),但我不能 100% 确定这一点。

于 2013-06-05T22:15:17.987 回答
1

我创建了一个显示 IR 和深度视图的博客:

http://aparajithsairamkinect.blogspot.com/2013/06/kinect-infrared-and-depth-views_6.html

红外和深度视图

于 2013-06-06T14:24:14.730 回答
0

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

coordinates3D[0] = coordinates2D[0];
coordinates3D[1] = coordinates2D[1];
coordinates3D[2] = (USHORT*)(LockedRect.pBits)
[(int)(coordinates2D[1] + 23) * Width + (int)coordinates2D[0]] >> 3;
于 2013-06-06T19:34:37.617 回答