使用Microsoft Kinect SDK跟踪使用旋转角度

时间:2012-06-29 06:35:06

标签: kinect

我正在实现一个可以跟踪用户轮换的WPF应用程序。其他想法是将kinect置于一个恒定的位置。用户来到kinect前面,他/她可以旋转360度。我想跟踪用户旋转的度数。我使用以下方法来跟踪它。但似乎功能不准确,当用户面对0度时,它显示为180,并且它也给出负值。

public static double GetShoulderRotation(this Skeleton skeleton)
    {
        Joint leftShoulder = skeleton.Joints[JointType.ShoulderLeft];
        Joint rightShoulder = skeleton.Joints[JointType.ShoulderRight];
        if (leftShoulder.TrackingState == JointTrackingState.NotTracked ||
            rightShoulder.TrackingState == JointTrackingState.NotTracked)
        {
            return Double.NaN;
        }
        else
        {
            return (Math.Atan2(
                rightShoulder.Position.Z - leftShoulder.Position.Z,
                leftShoulder.Position.X - rightShoulder.Position.X)*180.0/Math.PI);
        }
    }

有人可以为此提供解决方案吗?

3 个答案:

答案 0 :(得分:1)

我建议在hipcenter和spine之间使用骨骼旋转。当一个人站在Kinect的正面时,Hipcenter.Z-Spine.Z是积极的。当一个人侧身站立并面向左侧时,Hipcenter.X-Spine.X为负值。使用X和Z值,可以很容易地计算旋转角度。正弦肩关节可能被Kinect的身体其他部位阻塞,我选择了臀部中心到脊柱的骨骼,它可以很好地跟踪我身体的旋转。

答案 1 :(得分:0)

尝试使用深度而不是计算度数。首先检测右肩和左肩之间的距离(X轴)。然后在此距离和角度之间创建一个比例。如果距离(我的意思是右肩和左肩之间的距离)是最大值和正值,则角度为0.如果距离为最大值且为负值,则角度为180.如果距离为max / 2且为正,则角度是45。

答案 2 :(得分:0)

我知道这是一个老问题,但我最近一直在努力解决同样的问题。我写了一个可以跟踪两个关节之间旋转角度的函数。我尝试过左右臀部,对我来说效果很好。 Mabe对其他人有帮助。

一件事是它适用于旋转角度<双向70度。如果角度较大,则难以适当地跟踪它。

这是我的解决方案。

    protected double TrackJointsRotation(KinectSensor sensor, Joint joint1, Joint joint2)
    {
        if (joint1.TrackingState == JointTrackingState.NotTracked
            || joint2.TrackingState == JointTrackingState.NotTracked)
            return double.NaN;

        var rightHip = sensor.CoordinateMapper.MapSkeletonPointToDepthPoint(joint1.Position, sensor.DepthStream.Format);
        var leftHip = sensor.CoordinateMapper.MapSkeletonPointToDepthPoint(joint2.Position, sensor.DepthStream.Format);

        return (Math.Atan(((double)rightHip.Depth - leftHip.Depth) / ((double)leftHip.X - rightHip.X)) * 180.0 / Math.PI);
    }