2016-06-27 6 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の機能を理解することができますが、私はジェスチャー機能について混乱しています。私の質問は以下の通りです:

  • なぜ彼らはスケルトンヒストリーを作成しますか?
  • gesturePeriodとindexesPerSecondの必要性は何ですか?
  • なぜ(m_SkeletonHistory.Count> indexesToCheck)がチェックされますか?
  • waveright関数について説明できますか?

答えて

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の屈折率? – user39320

+0

@ user39320コメントは –

+0

@ Robben_Ford_Fan_boyありがとうございました。私はそれを疑う余地があります。私はwaverightを実装しています。なぜコーダーは 'Joints [JointType.HandLeft] .Position'を使うのですか? X&Y軸とは何ですか?この軸のための有用な文書? 'startPos = localSkeletonHistory [0] .Joints [JointType.HandLeft] .Position.X;の重要性は何ですか? – user39320

関連する問題