2

我正在实现一个可以跟踪用户旋转的 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);
        }
    }

任何人都可以为此提供解决方案吗?

4

3 回答 3

1

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

于 2012-11-19T18:12:09.903 回答
0

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

于 2012-07-06T12:36:00.337 回答
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);
    }
于 2014-12-17T22:55:28.423 回答