2012-06-29 1 views
2

Я реализую приложение WPF, которое может отслеживать вращение пользователя. Идея bisc заключается в том, что kinect размещается в постоянном месте. Пользователь приходит перед кинцетом, и он может вращаться на 360 градусов. Я хочу отслеживать, сколько градусов пользователь повернул. Я использовал следующий метод для его отслеживания. Но похоже, что функция неточна, и когда пользователь сталкивается с 0 градусами, он показывает ее как 180, а также дает минус значения.Угол поворота трека с использованием Microsoft Kinect SDK

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

Может ли кто-нибудь решить эту проблему?

ответ

0

Попробуйте использовать глубины вместо вычисления градусов. Сначала определите расстояние (ось X) между правым и левым плечом. Затем создайте пропорцию между этим расстоянием и углами. Если расстояние (i означает расстояние между правым и левым плечом) является максимальным и положительным, то угол равен 0. Если расстояние максимально и отрицательное, то угол равен 180. Если расстояние макс/2 и положительное, то угол 45.

1

Я рекомендовал использовать поворот кости между хипцентром и позвоночником. Когда человек стоит лицом к лицу с Kinect, Hipcenter.Z-Spine.Z позитивен. Когда человек стоит боком и лицом слева, Hipcenter.X-Spine.X является минусовым значением. Используя значения X и Z, было бы легко вычислить угол поворота. Синусовые плечевые суставы могут быть заблокированы другими частями вашего тела от Kinect, я выбрал кость хипцентра для позвоночника, и он хорошо работал, чтобы отслеживать ротацию моего тела.

+0

Не могли бы вы более подробно рассказать о логике? – Shanaka

0

Я знаю, что это старый вопрос, но в последнее время я борюсь с той же проблемой. Я написал функцию, которая может отслеживать угол поворота между двумя суставами. Я пробовал левое и правое бедра, и это сработало для меня. Мабе, это будет полезно для кого-то другого.

Единственное, что он хорошо работает для угла поворота < 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); 
    }