【问题标题】:Kinect - Map (x, y) pixel coordinates to "real world" coordinates using depthKinect - 使用深度将(x,y)像素坐标映射到“真实世界”坐标
【发布时间】: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


【解决方案1】:

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

以下是处理中的向量和一般向量的简要说明:https://processing.org/tutorials/pvector/

【讨论】:

    【解决方案2】:

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

    其实点这个链接How to get real world coordinates (x, y, z) from a distinct object using a Kinect

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

    【讨论】:

      【解决方案3】:

      一些事情:

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

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

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

      【讨论】:

      • 啊,是的,我知道这个功能。但是,我试图在 Flash 中进行此计算,它无法访问该函数。潜在地,我可以重构我的整个项目以使用它,但我想避免这种情况。
      • @user1449837:啊,我的错。实际上,你从哪里得到这个 117 度?我的印象是 Kinect 的水平 FOV 是 57 度。
      • 从 Kinect 对象的 DepthImageStream 属性中,您可以使用nominalhorizo​​ntalfieldofview 获取Kinect 的水平视野,您可以使用nominalverticalfieldofview 获得垂直视野。在我的 Kinect 上使用它产生 117,然后三角函数要求我在实际计算中将其减半至 58.5。这显然是文档中的一个错字,我从这个讨论中得到了这个想法:social.msdn.microsoft.com/Forums/en-US/kinectsdk/thread/…
      • @Coeffect 然后我尝试对其进行编辑以使其更清晰,这样我就可以取消反对意见。
      猜你喜欢
      • 2015-09-18
      • 2014-06-15
      • 1970-01-01
      • 2012-02-06
      • 1970-01-01
      • 1970-01-01
      • 2016-02-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多