2015-04-02 3 views
1

В настоящее время я работаю над проектом, где необходимо отслеживать угол сустава (левое колено) и отображать его в реальном времени на экране. У меня уже есть нарисованный скелет и установка окна дисплея, чтобы наложить скелет поверх человека. Я программирую на C# и используя Visual Studio 2013 Ultimate.Вычисление и отображение совместных углов в Kinect SDK 2.0

Я видел эту ссылку здесь kinect sdk 2.0 joint angles and tracking , но код продолжает возвращать ошибку, потому что функция «Результаты» внизу не существует для меня, и я не могу понять, почему. Кроме того, мне трудно понять, как создать переменную, которая может отображаться на экране при постоянном обновлении (если ее там нет, она может отображать N/A или 0).

Я также перешёл по ссылке человека, отвечая на эту страницу Display the angles of each joint of the skeleton in kinect c# но код предназначен для SDK 1.X.

У кого-нибудь есть пример кода или рекомендации по устранению проблемы, которую я испытываю при обновлении переменных/определении результатов, чтобы я мог использовать код в первом примере?

+0

Если кто-то знал, как сделать код в нижней части первой ссылки работать для постоянного обновления переменной, которая была бы удивительной, тип Skeleton не существует в SDK 2.0, и я не могу назвать Body.Joints – Jicnon

ответ

2

Хотя я не видел ваш код или как вы поняли отслеживание человека с наложенным скелетом, я рекомендую вам прочитать серию сообщений от Mike Taulty: http://mtaulty.com/CommunityServer/blogs/mike_taultys_blog/archive/2014/11/04/kinect-for-windows-v2-sdk-hello-custom-gesture-world-part-3.aspx (эта ссылка является 3-м постом из этой серии, вы найдете ссылки на # 1 и # 2 на самом верху).

Хотя он использует бета-версию GestureBuilder для отслеживания движений скелета, для меня это была отличная отправная точка для того, чтобы ускорить работу - особенно, говоря о настройке KINECT, прослушивателях событий и т. Д., Чтобы понять, как KINECT 2 получает свои фреймы и подключается к C# -коду. В части 2 он заполняет элемент управления в своем приложении WPF цветом, в зависимости от того, насколько зафиксирован прогресс записанных жестов, я думаю, что это может частично ответить на ваш вопрос относительно «живой переменной» на экране.

После того как вы последовали за учебником и определили соответствующие части кода для вас, вы понимаете, что можете (строго говоря) отбросить функциональность OnGestureFrameArrived, так как вам нужно будет изменить метод OnBodyFrameArrived. Здесь вы проверяете отслеживаемый объект, если он найден, вы можете получить доступ к его суставам и рассчитать их угол. Я написал результат в консольном окне для целей отладки, поэтому, наконец, вы должны написать этот результат переменной, которая подключена к элементу GUI, который отображает его.

public void OnBodyFrameArrived(object sender, BodyFrameArrivedEventArgs e) 
    { 
     using (var frame = e.FrameReference.AcquireFrame()) 
     { 
      if (frame != null) 
      { 
       frame.GetAndRefreshBodyData(this.bodies); 

       var trackedBody = this.bodies.Where(b => b.IsTracked).FirstOrDefault(); 

       if (trackedBody != null) 
       { 
         List<Joint> myJoints = new List<Joint>(); 
         myJoints.Add(trackedBody.Joints[JointType.FootLeft]); 
         myJoints.Add(trackedBody.Joints[JointType.AnkleLeft]); 
         myJoints.Add(trackedBody.Joints[JointType.KneeLeft]); 


         if (myJoints.TrueForAll(x => x.TrackingState == TrackingState.Tracked)) 
         { 
          Vector3D KneeLeft = new Vector3D(trackedBody.Joints[JointType.KneeLeft].Position.X, trackedBody.Joints[JointType.KneeLeft].Position.Y, trackedBody.Joints[JointType.KneeLeft].Position.Z); 
          Vector3D AnkleLeft = new Vector3D(trackedBody.Joints[JointType.AnkleLeft].Position.X, trackedBody.Joints[JointType.AnkleLeft].Position.Y, trackedBody.Joints[JointType.AnkleLeft].Position.Z); 
          Vector3D FootLeft = new Vector3D(trackedBody.Joints[JointType.FootLeft].Position.X, trackedBody.Joints[JointType.FootLeft].Position.Y, trackedBody.Joints[JointType.FootLeft].Position.Z); 

          Console.WriteLine("#1: " + AngleBetweenTwoVectors(AnkleLeft - KneeLeft, AnkleLeft - FootLeft)); 
         } 
       } 
       else 
       { 
        this.OnTrackingIdLost(null, null); 
       } 
      } 
     } 
    } 

    public double AngleBetweenTwoVectors(Vector3D vectorA, Vector3D vectorB) 
    { 
     double dotProduct = 0.0; 
     vectorA.Normalize(); 
     vectorB.Normalize(); 
     dotProduct = Vector3D.DotProduct(vectorA, vectorB); 

     return (double)Math.Acos(dotProduct)/Math.PI * 180; 
    } 

TLDR-версия: в зависимости от того, как обрабатывать ваши приобретенные KINECT кадров, необходимо определить правильное событие в коде, где отслеживаются тело найдено в кадре, там вы можете посмотреть для состояний различных суставов тела и вычисления углов.


Кроме того, если вы хотите, вы можете отправить мне свой код и я могу попытаться подключить это для вас, так как ваш код будет также представлять интерес для меня.

Смежные вопросы