我正在开发一个项目,该项目使用Kinect和OpenCV将导出的最终坐标导出到Flash,以用于游戏和其他程序。目前,我们的设置基于颜色并将指尖输出为(x,y,z)格式的Flash,其中x和y以像素为单位,z以毫米为单位。但是,我们希望使用Flash中的z深度值将这些(x,y)坐标映射到“真实世界”值,如毫米。Kinect - 使用深度将地图(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 =深度值
(对不起,我不能发布图片,我想如果我可以)
现在,求解深度值为1000mm(1米)的值为约3264mm。
但是,实际上在生成相机图像时,我会得到不同的值。也就是说,我在离摄像机1米远的地方放了一根米棒,注意到画面的宽度最多只有1.6米,而不是估算的3.264米。
有什么我在这里失踪?任何帮助,将不胜感激。
是从Kinect的仪表杆1米?或者距离它的起始加工范围一米?如果直接从相机中获取距离并将该距离添加到Kinect未命中的距离 – 2012-08-04 02:18:24
您使用Kinect的哪个库:官方的KinectSDK,libfreenect,OpenNI? – 2012-08-04 08:17:26
我使用官方的Kinect SDK,Kinect补偿了它无法读取的深度(意思是它的起始深度大约超过30厘米)。在继续进行中,我决定重构我的项目以使用Kinect将深度坐标映射到骨架坐标。 – user1449837 2012-08-07 21:41:34