我正在开发一个使用 Kinect 和 OpenCV 将 fintertip 坐标导出到 Flash 以用于游戏和其他程序的项目。目前,我们的设置基于颜色工作,并以 (x, y, z) 格式将指尖点导出到 Flash,其中 x 和 y 以像素为单位,z 以毫米为单位。
但是,我们希望使用 Flash 中的 z 深度值将这些 (x, y) 坐标映射到“真实世界”值,例如毫米。
据我了解,Kinect 3D 深度是通过沿相机水平投影 X 轴、沿相机垂直投影 Y 轴以及直接从相机镜头向前伸出的 Z 轴来获得的。深度值是从任何给定对象到 XY 平面的垂线长度。请参阅以下链接中的图片(从微软网站获得)。
此外,我们知道 Kinect 的水平视野以 117 度角投射。
使用这些信息,我想我可以将任何给定点的深度值投影到 x=0, y=0 线上,并在该点绘制一条平行于 XY 平面的水平线,与相机的视野相交。我最终得到一个三角形,分成两半,高度与所讨论物体的深度相同。然后我可以使用一点三角函数来求解视野的宽度。我的等式是:
W = tan(theta / 2) * h * 2
在哪里:
- W = 视野宽度
- theta = 水平视场角(117 度)
- h = 深度值
(对不起,我不能发图片,如果可以的话我会)
现在,求解 1000 毫米(1 米)的深度值,得到的值约为 3264 毫米。
但是,当实际查看生成的相机图像时,我得到了不同的值。即,我在距离相机 1 米的地方放置了一个米棒,注意到框架的宽度最多为 1.6 米,而不是计算中估计的 3.264 米。
我在这里缺少什么吗?任何帮助,将不胜感激。