3

我正在开发一个使用 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(theta / 2) * h * 2

在哪里:

  • W = 视野宽度
  • theta = 水平视场角(117 度)
  • h = 深度值

(对不起,我不能发图片,如果可以的话我会)

现在,求解 1000 毫米(1 米)的深度值,得到的值约为 3264 毫米。

但是,当实际查看生成的相机图像时,我得到了不同的值。即,我在距离相机 1 米的地方放置了一个米棒,注意到框架的宽度最多为 1.6 米,而不是计算中估计的 3.264 米。

我在这里缺少什么吗?任何帮助,将不胜感激。

4

3 回答 3

4

深度流是正确的。您确实应该获取深度值,然后通过 Kinect 传感器,您可以轻松地定位现实世界中相对于 Kinect 的点。这是通过简单的三角函数完成的,但是您必须记住,深度值是从 Kinect“眼睛”到测量点的距离,因此它是长方体的对角线。

实际上,请点击此链接How to get real world coordinates (x, y, z) from a distinct object using a Kinect

重写是没有用的,你有正确的答案。

于 2012-11-09T20:52:13.263 回答
2

一些东西:

A) 我知道你从 Kinect 传感器的一个功能中获得了 117 度 FOV,但我仍然不相信这是正确的。那是一个巨大的FOV。当我在我的 Kinect 上运行该功能时,我实际上得到了相同的数字,但我仍然不相信。虽然 57(或某些来源的 58.5)看起来很低,但它绝对更合理。尝试将 Kinect 放在平坦的表面上,并将对象放在其视野内,然后测量 FOV。不精确,但我认为您不会发现它超过 100 度。

B) 我看到一篇文章展示了实际距离与 Kinect 报告的深度;它不是线性的。这实际上不会影响您的 1.6 米三角问题,但在未来需要牢记这一点。

C)我强烈建议更改您的代码以接受来自 Kinect 的真实世界点。更好的是,如果可能的话,只需发送更多数据。您可以继续提供当前数据,并将真实世界的坐标数据添加到该数据上。

于 2012-08-02T20:08:28.687 回答
0

矢量减法应该可以得到 Kinect 给出的任意两点之间的距离。您必须查找在您的特定环境中执行矢量减法的最佳方法,但我希望这无论如何都会有所帮助。在我使用的 Processing 中,有一个 PVector 类,在哪里减去你只需去 PVector difference = PVector.sub(vector1, vector2),其中 vector1 和 vector2 是代表你的两个点的向量,而差异是两者之间的新向量两点。然后,您需要差异向量的大小。同样,在处理中,这可以通过幅度 = 差异.mag() 简单地找到。这个量级应该是你想要的距离。

这是处理中的两个向量和一般向量的一个很好的概要:https ://processing.org/tutorials/pvector/

于 2016-02-20T02:28:33.240 回答