2016-06-27 8 views
-1

Я пишу приложение на основе Kinect. Мне нужно реализовать волнообразный жест. Я нашел фрагмент кода из Интернета с помощью C#, но у меня есть некоторые сомнения по поводу этого кода. Вы можете мне помочь?Что такое использование скелета, период жестов в приложении Kinect?

Код:

public class KinectClass 
{ 
    public void KinectInitialize() 
    { 
     m_myKinect.Start(); 
     m_myKinect.SkeletonStream.TrackingMode = SkeletonTrackingMode.Seated; 
     m_myKinect.SkeletonFrameReady += m_myKinect_SkeletonFrameReady; 
    } 

    void m_myKinect_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e) 
    { 
     using (SkeletonFrame frame = e.OpenSkeletonFrame()) 
     { 
      if (frame != null) 
      { 
       if (0 == frame.SkeletonArrayLength) return; 
       m_skeletons = new Skeleton[frame.SkeletonArrayLength]; 
       if (m_skeletons == null) return; 
       frame.CopySkeletonDataTo(m_skeletons); 
      } 
     } 

     foreach (Skeleton skeleton in m_skeletons) 
     { 
      if (skeleton.TrackingState == SkeletonTrackingState.Tracked) 
      { 
       UpdateSkeletonHistory(skeleton); 
       value = gestureobject.Detectgesture(); 
      } 
     } 
    } 
} 

Кроме того, существует класс Жест, который проверяет волновые функции:

class Gesture 
{ 
    private List<Skeleton> SkeletonHistory; 
    private List<Skeleton> localSkeletonHistory; 

    public void UpdateSkeletonHistory(Skeleton SkeletonData) 
    { 
     SkeletonHistory.Add(SkeletonData); 

     if (SkeletonHistory.Count > 90) 
     { 
      SkeletonHistory.RemoveAt(0); 
     } 

     return ; 
    } 

    public short Detectgesture() 
    { 
     short sReturnvalue = -1; 
     int gesturePeriod = 2; 
     int indexesPerSecond = 30; 
     int indexesToCheck = gesturePeriod * indexesPerSecond; 
     localSkeletonHistory = new List<Skeleton>(SkeletonHistory); 

     if (m_SkeletonHistory.Count > indexesToCheck) 
     { 
      localSkeletonHistory = new List<Skeleton>(m_SkeletonHistory); 

      if(waveright()) 
      { 
       Console.Writeline("waveright"); 
      } 
     } 
    } 

    private bool waveright() 
    { 
     Console.WriteLine("wave right START"); 
     bool Movedright = false, 
     Movedleft = false; 

     float refDistance = 0.2F; 

     float startPos = localSkeletonHistory[0].Joints[JointType.HandLeft].Position.X; 

     for (int i = 0; i < localSkeletonHistory.Count; i++) 
     { 
      if (!(localSkeletonHistory[i].Joints[JointType.HandLeft].Position.Y <= localSkeletonHistory[i].Joints[JointType.Head].Position.Y)) 
      { 
       break; 
      } 
      if (localSkeletonHistory[i].Joints[JointType.HandLeft].Position.X >= (startPos + refDistance)) 
      { 
       Movedright = true; 
      } 
      if (Movedright && Math.Abs(localSkeletonHistory[i].Joints[JointType.HandLeft].Position.X - startPos) <= 0.1) 
      { 
       Movedleft = true; 
       m_SkeletonHistory.Clear(); 
       break; 
      } 
     } 

     return Movedleft; 
    } 
} 

Я могу понять функции Kinect, но я запутался о функциях жест. Мои вопросы следующие:

  • Почему они создают Скелетную историю?
  • Что необходимо для жестовПериод и индексыПерсекунд?
  • Почему они проверяют (m_SkeletonHistory.Count> indexesToCheck)?
  • Можете ли вы объяснить функцию вибрации?

ответ

2

То, что вам нужно помнить, состоит в том, что позиция Руки правильная, относительно тела. Это не значит, что они машут правильно.

Волна справа - это переход вправо. Поэтому вы не можете определить это по текущей позиции. Вот почему вам нужно отслеживать предыдущие позиции с помощью SkeletonHistory.

Так тупой обзор алгоритма:

For the previous positions since the last triggered gesture: 
    If each Skeleton's Y position is greater than the last, then the person is waving right 

Конечно, рука будет двигаться вправо много раз, это не означает, что это волна правильно. Таким образом, вам нужно определить, как долго рука должна двигаться правильно, чтобы она была подлинным жестом waveRight.

refDistance - это способ сказать, что рука должна двигаться, по крайней мере, на это расстояние, прежде чем ее можно отнести к категории волн.

Здесь я считаю, что кодер говорит, что жест должен длиться не менее 2 секунд. Так что, если мы получим 30 скелетов в секунду, то нам нужно проверить последние 60 скелетов:

int indexesToCheck = gesturePeriod * indexesPerSecond; 

документация MSDN на самом деле очень хорошо для этого материала:

https://msdn.microsoft.com/en-us/library/jj131025.aspx

я нашел эту книгу отлично подходит для начала работы на этом материале:

Programming with the Kinect for Windows Software Development Kit (Developer Reference)

+0

так в этой концепции является то, что 'gesturePeriod, indexesPerSecond = 30; indexesToCheck = gesturePeriod * indexesPerSecond; '? и 0,1 и 0,2F refdistance? – user39320

+0

@ user39320 Обновленный ответ там, чтобы отразить комментарий –

+0

@ Robben_Ford_Fan_boy спасибо .. и у меня есть еще одно сомнение в том, что я использую волну, почему кодер использует 'Joints [JointType.HandLeft] .Position'? что такое ось X и Y? любой полезный документ для этой оси? также в чем важность 'startPos = localSkeletonHistory [0] .Joints [JointType.HandLeft] .Position.X;'? – user39320