【问题标题】:Track use rotation angle using Microsoft Kinect SDK使用 Microsoft Kinect SDK 跟踪使用旋转角度
【发布时间】:2014-12-18 06:55:28
【问题描述】:

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

谁能给出解决方案?

【问题讨论】:

    标签: kinect


    【解决方案1】:

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

    【讨论】:

    • 能否请您更具体的逻辑?
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我知道这是一个老问题,但我最近一直在为同样的问题而苦苦挣扎。我写了一个函数,可以跟踪两个关节之间的旋转角度。我试过左右臀部,效果很好。 Mabe这对其他人会有所帮助。

      一件事是它适用于两种方式的旋转角度
      这是我的解决方案。

          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);
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多