我正在使用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
哪里:
(抱歉,我无法发布图片,如果可以的话,我会发布)
现在,求解深度值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
重写没有用,您有正确的答案。