我正在开发一个项目,该项目使用 Kinect 和 OpenCV 将 fintertip 坐标导出到 Flash,以便在游戏和其他程序中使用。目前,我们的设置基于颜色工作,并将指尖点以 (x, y, z) 格式导出到 Flash,其中 x 和 y 的单位为像素,z 的单位为毫米。
但是,我们希望使用 Flash 中的 z 深度值将这些 (x, y) 坐标映射到“真实世界”值,例如毫米。
据我了解,Kinect 3D 深度是通过沿相机水平方向投影 X 轴、沿相机垂直方向投影 Y 轴、以及直接从相机镜头向前投影 Z 轴来获得的。深度值是从任何给定对象到 XY 平面绘制的垂线的长度。请参阅下面链接中的图片(从微软网站获得)。
Microsoft 深度坐标系示例
另外,我们知道 Kinect 的水平视野投射为 117 度角。
利用这些信息,我想我可以将任何给定点的深度值投影到 x=0, y=0 线上,并在该点绘制一条与 XY 平面平行的水平线,与相机的视野相交。我最终得到一个三角形,分成两半,其高度等于所讨论物体的深度。然后我可以使用一点三角学来求解视场的宽度。我的等式是:
W = tan(θ / 2) * h * 2
Where:
- W = 视野宽度
- theta = 水平视野角(117 度)
- h = 深度值
(抱歉,我不能发图片,如果可以的话我会发的)
现在,求解 1000 毫米(1 米)的深度值,得出的值约为 3264 毫米。
然而,当实际查看生成的相机图像时,我得到了不同的值。也就是说,我在距离相机1米的地方放置了一根米尺,发现画面的宽度最多为1.6米,而不是计算出来的估计的3.264米。
我在这里缺少什么吗?任何帮助,将不胜感激。
深度流是正确的。您确实应该获取深度值,然后从 Kinect 传感器,您可以轻松定位现实世界中相对于 Kinect 的点。这是通过简单的三角函数完成的,但您必须记住,深度值是从 Kinect“眼睛”到测量点的距离,因此它是长方体的对角线。
实际上,请点击此链接如何使用 Kinect 从不同的对象获取真实世界坐标 (x, y, z)
重写是没有用的,你已经有了正确的答案。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)