我正在开发一个项目,该项目使用 Kinect 和 OpenCV 将指尖坐标导出到 Flash 以用于游戏和其他程序。目前,我们的设置基于颜色并以 (x, y, z) 格式将指尖点导出到 Flash,其中 x 和 y 以像素为单位,z 以毫米为单位。
但是,我们希望使用 Flash 中的 z 深度值将这些 (x, y) 坐标映射到“真实世界”值,例如毫米。
据我了解,Kinect 3D 深度是通过沿相机水平方向投影 X 轴、沿相机垂直方向投影 Y 轴以及从相机镜头正前方投影 Z 轴获得的。深度值是从任何给定对象到 XY 平面的垂直线的长度。请参阅以下链接中的图片(从微软网站获得)。
Microsoft Depth Coordinate System Example
另外,我们知道 Kinect 的水平视野以 117 度角投影。
利用这些信息,我想我可以将任何给定点的深度值投影到 x=0,y=0 线上,并在该点绘制一条平行于 XY 平面的水平线,与相机的视野相交.我最终得到一个三角形,分成两半,高度为所讨论对象的深度。然后我可以使用一点三角函数求解视野的宽度。我的等式是:
W = tan(θ/2) * h * 2
地点:
- W = 视野宽度
- theta = 水平视野角(117 度)
- h = 深度值
(对不起,我不能发图片,如果可以的话我会的)
现在,求解 1000 毫米(1 米)的深度值,得到大约 3264 毫米的值。
但是,当实际查看生成的相机图像时,我得到了不同的值。即,我在距离相机1米的地方放了一根米尺,发现画面的宽度最多只有1.6米,而不是计算出来的3.264米。
我在这里缺少什么吗?任何帮助将不胜感激。
最佳答案
深度流是正确的。你确实应该取深度值,然后从 Kinect 传感器,你可以很容易地定位现实世界中相对于 Kinect 的点。这是通过简单的三角函数完成的,但是您必须记住,深度值是从 Kinect“眼睛”到测量点的距离,因此它是长方体的对角线。
实际上,请点击此链接 How to get real world coordinates (x, y, z) from a distinct object using a Kinect
重写没有用,你有正确的答案。
关于flash - Kinect - 使用深度将 (x, y) 像素坐标映射到 "real world"坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11784888/