我正在使用Kinect的和OpenCV出口fintertip坐标为Flash在游戏和其他程序使用的项目。 目前,我们的安装工程基于颜色和出口指尖点(X,Y,Z)格式到Flash,其中x和y是在像素和z是毫米。
但是,我们希望这些映射(X,Y)坐标,以“真实世界”的价值观,像毫米,使用从Flash是Z值。
据我所知,经由投影沿着相机的水平,它是沿着相机的垂直Y轴与X轴所获得的超高动力学3D深度,它的Z轴直接转发出相机的镜头。 深度值是然后从任何给定对象的XY平面引出的垂线的长度。 请参阅以下链接的图片(从微软的网站获得)。
微软深度坐标系统实例
另外,我们知道的Kinect的视野的水平场在117度的角度投射。
使用该信息,我想我可以投射任何给定的点的深度值到X = 0,y = 0的线,并在该点绘制平行于XY平面的水平线,交叉视野的摄像机的领域。 我结束了一个三角形,分成两半,与所讨论的对象的深度的高度。 然后我可以解决用于使用小三角的视场的宽度。 我的计算公式如下:
W = TAN(THETA / 2)* H * 2
哪里:
- 视图宽度W =场
- THETA =视场角的水平视场(117度)
- H =深度值
(对不起,我不能发布图片,我想如果我可以)
现在,求解为1000mm(1米)的深度值,产生了大约3264毫米值。
然而,在摄像机图像实际上是寻找生产时,我得到一个不同的值。 即,我放置米尺1米远离照相机,并注意到所述框架的宽度是至多1.6米,不从计算所估计的3.264米。
有什么事,我在这里失踪? 任何帮助,将不胜感激。
深度流是正确的。 事实上,你应该采取的深度值,然后从Kinect感应器,你可以轻松地找到世界相对于Kinect的真正的点。 这是通过简单的三角做,但你必须记住,深度值与Kinect的“眼睛”来测量点的距离,所以它是一个对角长方体。
其实,请点击此链接如何使用Kinect的一个不同的对象获得真正的世界坐标(X,Y,Z)
这是没有用的改写,有你有正确的答案。
一些东西:
A)我知道你在Kinect传感器的功能得到了117度的视野,但我仍然不相信这是正确的。 这是一个巨大的FOV。 事实上,我得到了相同的号码时,我跑在我的Kinect的功能,但我还是不相信。 虽然57(或58.5来自一些消息来源)似乎很低,这绝对是比较合理的。 尝试把Kinect的平坦表面上和邻居对象只是其视图内测量FOV的方式。 不准确的,但我不认为你会发现它是超过100度。
B)我看到一篇文章展示的实际距离VS的Kinect的深度报道; 它不是线性的。 这不会实际影响您的1.6米三角函数问题,但它的东西要记住前进。
C)我会强烈建议改变你的代码,以接受来自Kinect的真实世界点。 更重要的是,只需要发更多的数据如果可能的话。 您可以继续提供目前的数据,只是钉在现实世界中的坐标数据到这一点。
矢量减法应该让你通过Kinect的给定任意两点之间的距离。 你必须仰望在特定环境中进行矢量减法的最好办法,但我希望这有助于反正。 在处理,我使用,有一个PVector类,其中减去你干脆去PVector差= PVector.sub(向量1,vector2),其中向量1和vector2是代表你的两个点的载体,而不同的是之间的新载体两分。 然后,您需要区别矢量的幅值。 同样,在处理中,这是简单地通过大小= difference.mag实测值()。 这幅度应该是你期望的距离。
下面是在处理两种载体,一般载体的一个伟大的破败: https://processing.org/tutorials/pvector/
文章来源: Kinect - Map (x, y) pixel coordinates to “real world” coordinates using depth