2012-08-02 676 views
2

我正在开发一个项目,该项目使用Kinect和OpenCV将导出的最终坐标导出到Flash,以用于游戏和其他程序。目前,我们的设置基于颜色并将指尖输出为(x,y,z)格式的Flash,其中x和y以像素为单位,z以毫米为单位。但是,我们希望使用Flash中的z深度值将这些(x,y)坐标映射到“真实世界”值,如毫米。Kinect - 使用深度将地图(x,y)像素坐标转换为“真实世界”坐标

据我所知,Kinect 3D深度是通过投影X轴沿着相机的水平线获得的,Y轴是沿着相机的垂直轴线,而Z轴是从相机镜头直接向前的。深度值就是从任何给定物体到XY平面的垂线长度。请参阅下面链接中的图片(从微软网站获得)。

Microsoft Depth Coordinate System Example

另外,我们知道的Kinect的视野的水平场在117度的角度投射。

使用此信息,我想我可以将任意给定点的深度值投影到x = 0,y = 0线上,并在该点绘制平行于XY平面的水平线,与相机的场视力。我最终得到一个三角形,分成两半,高度为所讨论对象的深度。然后,我可以使用一个小三角解决视野的宽度。我的方程是:

W = TAN(THETA/2)* H * 2

其中:

  • W =视场宽度
  • THETA =视场角的水平视场(117度)
  • H =深度值

(对不起,我不能发布图片,我想如果我可以)

现在,求解深度值为1000mm(1米)的值为约3264mm。

但是,实际上在生成相机图像时,我会得到不同的值。也就是说,我在离摄像机1米远的地方放了一根米棒,注意到画面的宽度最多只有1.6米,而不是估算的3.264米。

有什么我在这里失踪?任何帮助,将不胜感激。

+0

是从Kinect的仪表杆1米?或者距离它的起始加工范围一米?如果直接从相机中获取距离并将该距离添加到Kinect未命中的距离 – 2012-08-04 02:18:24

+2

您使用Kinect的哪个库:官方的KinectSDK,libfreenect,OpenNI? – 2012-08-04 08:17:26

+0

我使用官方的Kinect SDK,Kinect补偿了它无法读取的深度(意思是它的起始深度大约超过30厘米)。在继续进行中,我决定重构我的项目以使用Kinect将深度坐标映射到骨架坐标。 – user1449837 2012-08-07 21:41:34

回答

2

有几件事情:

A)我知道你在Kinect传感器的功能得到了117度的视野,但我仍然不相信这是正确的。这是一个巨大的FOV。当我在Kinect上运行该功能时,我实际上获得了相同的编号,但我仍然不相信它。虽然57(或某些来源的58.5)似乎很低,但它肯定更合理。尝试将Kinect放置在平坦的表面上,并将对象放置在其视图内并以此方式测量FOV。不准确,但我不认为你会发现它超过100度。 B)我看到一篇文章证明实际距离与Kinect的报告深度;它不是线性的。这实际上并不会影响你的1.6米触发问题,但这是要记住的事情。C)我强烈建议将代码更改为接受来自Kinect的真实世界点。更好的是,只要有可能就发送更多的数据。您可以继续提供当前的数据,并将实际的坐标数据添加到该数据上。

+0

啊,是的,我知道这个功能。但是,我试图从Flash中进行这种计算,而Flash不能访问该函数。 潜在地,我可以重构我的整个项目来使用它,但我想避免这种情况。 – user1449837 2012-08-02 20:16:01

+0

@ user1449837:啊,我的错。其实,你从哪里得到117度?我的印象是Kinect的水平FOV是57度。 – Coeffect 2012-08-02 20:21:47

+1

从Kinect对象的DepthImageStream属性中,您可以使用nominalhorizo​​ntalfieldofview来获取Kinect的水平FOV,您可以使用vertical的垂直视野。在我的Kinect制作的117上使用它,三角法则要求我在实际计算中将其削减到一半,达到58.5。这显然是文档中的一个错误,我从这个讨论中得到了这个想法: http://social.msdn.microsoft.com/Forums/en-US/kinectsdk/thread/8d292fe3-d832-455f-93c5-1d119a0ee997 – user1449837 2012-08-02 20:28:02

4

深度流是正确的。您应该确定深度值,然后从Kinect传感器中,可以轻松找到相对于Kinect的现实世界中的点。这是通过简单的三角函数完成的,但是您必须记住深度值是从Kinect“眼睛”到测量点的距离,所以它是一个长方体的对角线。

其实,请点击此链接How to get real world coordinates (x, y, z) from a distinct object using a Kinect

这是没有用的重写,有你有正确的答案。

0

向量减法应该可以得到Kinect给出的任意两点之间的距离。你必须查找在特定环境中执行矢量减法的最佳方式,但我希望这有助于无论如何。在我使用的Processing中,有一个PVector类,其中简单地去掉PVector差异= PVector.sub(vector1,vector2),其中vector1和vector2是代表两个点的向量,差异是两点。然后您需要差异向量的大小。同样,在处理过程中,这可以通过magnitude = difference.mag()简单地找到。这个数量应该是你想要的距离。

下面是处理这两种载体,一般载体的一个伟大的破败:https://processing.org/tutorials/pvector/

相关问题