我正在做一个使用红外线视图和深度视图的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和深度视图之间存在偏移?如果有偏移量,我能以某种方式获得正确的深度值吗?
发布于 2013-11-11 19:58:57
深度流和颜色流不是从同一点获取的,因此它们彼此不完全对应。而且它们的FOV (视野)也是不同的。
- IR/Depth FOV 58.5° x 45.6°
- Color FOV 62.0° x 48.6°
- distance between cameras 25mm
两个streams的640x480分辨率的
如果(有效深度){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`正如你所看到的,我的kinect也有y偏移量,这很奇怪(甚至比x偏移量还要大)。我的转换在直到2 m的范围内工作得很好,我没有进一步测量它,但即使在那时它也应该可以工作
pz=0.8+(float(rawdepth-6576)*0.00012115165336374002280501710376283);px=-sin(58.5*度*浮点(x-xs2)/float(Xs))*pz;py=+sin(45.6*度*浮点(y-ys2)/float(Ys))*pz;pz=-pz;
- where `px,py,pz` is point coordinate in [m] in space relative to **kinect**我使用与Z方向相反的摄像机坐标系,因此对符号的否定
PS。我有旧型号1414,所以新型号可能有不同的校准参数
发布于 2013-06-06 06:15:18
"IR视图“和”深度视图“之间没有偏移量。主要是因为它们是一回事。
Kinect有两个摄像头。一台RGB彩色相机和一台深度相机,后者使用红外爆破器来生成处理数据时使用的场光场。它们为您提供了一个彩色视频流和一个深度数据流;没有与深度数据分开的"IR视图“。

更新:
它们实际上是一回事。您所说的“深度视图”只是"IR视图“的彩色版本;黑白图像是”原始“数据,而彩色图像是相同数据的处理版本。
在Kinect for Windows Toolkit中,查看KinectWpfViewers项目(如果您安装了KinectExplorer-WPF示例,则它应该在那里)。其中有KinectDepthViewer和DepthColorizer类。他们将演示如何创建彩色的“深度视图”。
更新2:
根据下面的评论,我上面所说的几乎都是垃圾。在不久的将来,我可能会把它编辑掉,或者只是完全删除我的答案,在那之前,它将证明我曾经对来自哪里的信仰无效。
不管怎样..。让我们看看CoordinateMapper类作为另一种可能的解决方案。这个链接会把你带到托管代码文档(这是我所熟悉的),我正在查找C++文档,看看是否能找到对应的文档。
我用它来映射标准的颜色和深度视图。它也可以映射IR视图(我看不出有什么不可以的),但我不是百分之百确定。
发布于 2013-06-06 22:24:15
我创建了一个博客,展示了IR和深度视图:
http://aparajithsairamkinect.blogspot.com/2013/06/kinect-infrared-and-depth-views_6.html

https://stackoverflow.com/questions/16947368
复制相似问题