我正在使用Kinect和OpenCV将fintertip坐标导出到Flash以便在游戏和其他程序中使用的项目。目前,我们的设置基于颜色,并且将指尖以(x,y,z)格式导出到Flash,其中x和y以像素为单位,z以毫米为单位。

但是,我们希望使用Flash中的z深度值将这些(x,y)坐标映射到“真实世界”值,例如毫米。

据我了解,Kinect 3D深度是通过沿相机水平方向投影X轴,沿相机垂直方向投影Y轴以及将Z轴直接向前投影到相机镜头之外而获得的。深度值则是从任何给定对象到XY平面绘制的垂直线的长度。请参阅下面的链接中的图片(从Microsoft网站获得)。

Microsoft Depth Coordinate System Example

另外,我们知道Kinect的水平视野是按117度角投影的。

利用这些信息,我认为可以将任何给定点的深度值投影到x = 0,y = 0线上,并在该点绘制一条平行于XY平面的水平线,与相机的视野相交。我最终得到一个三角形,该三角形被分成两半,高度为所讨论对象的深度。然后,我可以使用一点三角函数求出视野的宽度。我的方程式是:

W = tan(theta / 2)* h * 2

哪里:

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

  • (抱歉,我无法发布图片,如果可以的话,我会发布)

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

    但是,当实际上查看所生成的相机图像时,我得到了一个不同的值。就是说,我将一根量油尺放在距离相机1米的地方,发现镜框的宽度最大为1.6米,而不是计算得出的估计的3.264米。

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

    最佳答案

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

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

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

    10-08 02:56