【发布时间】:2012-07-31 20:42:17
【问题描述】:
我正在开发一个项目,该项目使用 Kinect 和 OpenCV 将 fintertip 坐标导出到 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(theta / 2) * h * 2
地点:
- W = 视野宽度
- theta = 水平视场角(117 度)
- h = 深度值
(对不起,我不能发图片,如果可以的话我会)
现在,求解 1000 毫米(1 米)的深度值,得到的值约为 3264 毫米。
但是,当实际查看生成的相机图像时,我得到了不同的值。即,我在距离相机 1 米的地方放置了一个米棒,注意到框架的宽度最多为 1.6 米,而不是根据计算估计的 3.264 米。
这里有什么我遗漏的吗?任何帮助将不胜感激。
【问题讨论】:
-
仪表是否距离 Kinect 1 米?还是一米距离的起始加工范围呢?如果直接来自相机,您需要获取距离并将该距离添加到 Kinect 未命中的距离中
-
Kinect 使用的是哪个库:官方 KinectSDK、libfreenect、OpenNI?
-
我使用的是官方的 Kinect SDK,Kinect 会补偿它无法读取的深度(意味着它的起始深度大约在 30 厘米多一点)。在此过程中,我决定重构我的项目以使用 Kinect 将深度坐标映射到骨架坐标。
-
只是为了完成这一切,映射到骨架坐标的效果非常好。但是,我不知道它是如何进行转换的。
-
那么上面的等式正确吗?我需要知道方程式,而不是代码,所以如果有人可以告诉我吗?谢谢
标签: flash coordinates kinect