c# - Kinect 2 不一致的 FloorClipPlane 读取

标签 c# kinect tracking

我已经成功实现了地板夹平面来测量左脚到地板的距离,这是相当准确的。我遇到的问题是,当我远离相机时(即左脚 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 坐标值和地板平面作为输入,然后这将返回您想要的内容,即从地板平面到关节的测量距离:

1

// 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/

相关文章:

ios - gpx 文件中的地理定位和跟踪

php - 使用 PHP 和图像跟踪电子邮件

c# - 如何使用公共(public)交通检测与rabbitmq的连接问题?

c# - 将 "friendly"列名添加到 LINQ to SQL 模型的好方法是什么?

kinect - 使用 Kinect SDK 识别面部表情

machine-learning - 我可以使用 Kinect 的深度图像重新训练 Inception 的最终层吗?

regex - Google Analytics Reg Ex 未跟踪目标 URL

c# - Xamarin 在错误的位置寻找 android sdks 并给出构建错误

c# - 为什么这个差距会出现在我的 ListView 中?

c++ - std::async 返回值。未知错误