我已经成功实现了地板夹平面来测量左脚到地板的距离,这是相当准确的。我遇到的问题是,当我远离相机时(即左脚 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;
只是想让你知道,我有深度和颜色之间的坐标映射。不确定这是否与问题有关。
最佳答案
FloorClipPlane 以 hessian 范式表示 - 如上所述 in the docs 。具体来说,您的 A、B 和 C 值会折衷从相机原点(Kinect 的中心)到地板平面的单位矢量,从而产生与地板平面的垂直相交。 D 是该矢量的大小(从相机原点到地板平面的距离)。
即使您认为地板是平坦的并且 Kinect 与地面平行,您也会遇到透视扭曲问题,这意味着 body 位置(在深度空间中测量)会随着您越来越近而发生变化。
要解决此问题,您需要提供 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))));
希望这对您有帮助。如果不知道您具体在做什么,则无法进一步详细说明从深度到颜色的映射可能会产生什么影响
关于c# - Kinect 2 不一致的 FloorClipPlane 读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33543168/