我正在使用红外视图和深度视图处理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和深度视图之间有偏差?如果有偏移量,我能以某种方式获得正确的深度值吗?
答案 0 :(得分:3)
深度和颜色流不是从同一点获取的,因此它们不能完美地相互对应。他们的FOV(视野)也不同。
<强>相机强>
我对两个流的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
范围内效果很好我没有进一步衡量,但它应该可以正常工作
不要忘记从深度和深度图像坐标校正空间坐标
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方向的相机的坐标系因此否定符号
PS。我有旧型号1414,所以新型号可能有不同的校准参数
答案 1 :(得分:1)
“红外视图”和“深度视图”之间没有偏移。主要是因为它们是一回事。
Kinect有2个摄像头。 RGB彩色相机和深度相机,它使用IR发射器生成在处理数据时使用的场光场。这些为您提供彩色视频流和深度数据流;没有与深度数据分开的“红外视图”。
<强>更新强>
它们实际上是同一件事。你所说的“深度视图”只是“红外视图”的彩色版本;黑白图像是“原始”数据,而彩色图像是相同数据的处理版本。
在Kinect for Windows Toolkit中,查看KinectWpfViewers
项目(如果您安装了KinectExplorer-WPF
示例,它应该在那里)。有KinectDepthViewer
和DepthColorizer
类。他们将演示如何创建彩色“深度视图”。
更新2:
以下评论我上面所说的几乎完全是垃圾。我可能会在不久的将来编辑它或者完全删除我的答案,直到那时它将证明我曾经无效的信念来自哪里。
无论如何......看看CoordinateMapper类作为另一种可能的解决方案。该链接将带您进入托管代码文档(这是我熟悉的),我正在查看C ++文档以查看是否可以找到相应的文档。
我用它来映射标准颜色和深度视图。它也可以同样映射IR视图(我不明白为什么不这样做),但我不是百分之百确定。
答案 2 :(得分:0)
我创建了一个显示IR和深度视图的博客:
http://aparajithsairamkinect.blogspot.com/2013/06/kinect-infrared-and-depth-views_6.html
答案 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;