我已经成功实施了地板夹平面来测量左脚到地板的距离,这是相当准确的。我的问题是,当我离开相机时(即左脚Z轴增加),到地板的脚距变化(增加)。
注意:地板本身没有倾斜,也没有Kinect支架。
我用Kinect 1测试了它并得到了相同的结果。当我离开或靠近相机时,对象的头部高度(Y轴)也会改变值。相机倾斜或视线无关紧要。 FloorClipPlane方程中的D值在测试期间显示一个常数。
A = bodyFrame.FloorClipPlane.X;
B = bodyFrame.FloorClipPlane.Y;
C = bodyFrame.FloorClipPlane.Z;
D = bodyFrame.FloorClipPlane.W;
distanceLeftFoot = A * leftFootPosX + B * leftFootPosY + C * leftFootPosZ + D;
为了让你知道,我有深度和颜色之间的坐标映射。不确定这是否与此问题有关。
答案 0 :(得分:2)
FloorClipPlane以粗体正常形式表示 - 如in the docs所述。具体而言,A,B和C值会影响从摄像机原点(Kinect中心)到地板平面的单位矢量,使其与地板平面产生垂直交点。 D是该矢量的大小(从摄像机原点到地板平面的距离)。
即使您认为地板是平的并且Kinect与地面平行,您也会出现透视翘曲问题,这意味着随着您越来越近,身体位置(以深度空间测量)会发生变化。
要解决此问题,您需要提供3D坐标值和地板平面作为输入,然后将返回您想要的内容,即从地板平面到关节的测量距离:
// j is your joint - left foot or any other joint
float x = j.Position.X;
float y = j.Position.Y;
float z = j.Position.Z;
float distance = (Math.Abs((x * floorPlane.X) + (y * floorPlane.Y) + (z * floorPlane.Z) + floorPlane.W))/((float)Math.Sqrt((Math.Pow(floorPlane.X,2)) + (Math.Pow(floorPlane.Y, 2)) + (Math.Pow(floorPlane.Z, 2))));
我希望这会对你有所帮助。无法进一步详细说明从深度到颜色的映射可能会在这里做什么影响,而不会看到你正在做什么