flash - Kinect - 使用深度将 (x, y) 像素坐标映射到 "real world"坐标

标签 flash coordinates kinect

我正在开发一个项目,该项目使用 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/

相关文章:

actionscript-3 - as3 addChild 到生成的三角形中

flash - 将 Adob​​e Air 3.3 SDK 与 Flash Builder 结合使用

r - 使用 clusplot 绘制以 0 为中心坐标的聚类

c# - 如何在 C# WPF 中获取和绑定(bind) Slider 的值?

c# - 如何在 C# 中并行执行事件处理程序

c++ - MFC 和 Kinect : draw a line on Kinect's image

Flash 视频在 IE7 中的所有其他内容之上播放

动画片段停止时的 Flash as3 事件监听器

MySQL 存储函数出现故障,但作为独立查询工作

javascript - 如何通过 javascript 确定触摸事件(或鼠标事件)中的真实 x y 坐标?