2012-04-16 3 views
-2

私はKinectを使用してプログラムを作成しようとしています。ユーザはプログラムの出力として、ユーザが歩いている方向を指示します。利用者が前方を歩いている場合、出力があるべきユーザーがどの方向を歩いているかを検出するにはどうすればよいですか?

私が意味する.. UP

0 <= 8 <=  // the user (8) is walking forward (<=) to the camera (0=kinect) 

ユーザーが戻って歩いている場合は、出力がDOWNする必要があります。 ユーザーが左に歩いている場合、出力はLEFTになります。 そして、RIGHTの場合と同じことです。私が持っているものまで

は次のとおりです。

private static KinectSensor kinectSensor; 
    static void Main(string[] args) 
    { 
     kinectSensor = KinectSensor.KinectSensors[0]; 
     kinectSensor.SkeletonStream.Enable(); 
     kinectSensor.Start(); 
     kinectSensor.SkeletonFrameReady += kinectRuntime_SkeletonFrameReady; 

     while (true) { } 
    } 

    private static Skeleton[] data; 
    static void kinectRuntime_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e) 
    { 
     using (SkeletonFrame skeletonFrame = e.OpenSkeletonFrame()) 
     { 
      if (skeletonFrame != null) 
      { 
       if ((data == null) || (data.Length != skeletonFrame.SkeletonArrayLength)) 
        data = new Skeleton[skeletonFrame.SkeletonArrayLength]; 
       skeletonFrame.CopySkeletonDataTo(data); 

       foreach (Skeleton ske in data) 
       { 
        if (ske.TrackingState == SkeletonTrackingState.Tracked) 
        { 
         var joints = ske.Joints; 

         foreach (Joint joint in ske.Joints) 
         { 
          if (joint.JointType == JointType.HandLeft) 
          { 
           Console.WriteLine(joint.Position.X.ToString(".##")); 
           Console.WriteLine(joint.Position.Y.ToString(".##")); 
           Console.WriteLine(joint.Position.Z.ToString(".##")); 
          } 
         } 
        } 
       } 
      } 
     } 
    } 

そして、これだけで、あなたの左手の位置を伝えます。私はKinectライブラリについてよく知らないので、これを行うにはちょっとした助けが必要です。

私はポストを見てきましたが、私はまだこれが私を助けることができるどのようにそれを得ることはありませんよ。

+3

その7つの閉じ括弧のリストは間違いなく厄介です。おそらく何もせずに関数の終わりから落ちるのではなく、 "guard"文のいくつかを初期のリターンに変換するかもしれません。 – sarnold

+0

の可能重複[どのようにKinectを使用する人を追跡し、従うために?](http://stackoverflow.com/questions/10185043/how-to-track-and-follow-a-person-using-kinect)に申し訳ありません –

答えて

3

全ての関節がX、Y、Z値は、フォワード検出と戻る(上下)Zは、関節の座標を監視するのと同じくらい簡単であるので。 LeftとRightの検出は、X座標値を監視するのと同じくらい簡単です。明らかに、誰かが各軸で独占的に移動することを期待するのは難しいので、バッファルームを少し必要とします。歩くとき手がスイングしますので、

Spineは、監視するための良い共同かもしれません。あなたがする必要があるのは、最後の3つまたは4つのスケルトンフレームを比較して、ユーザーがどの方向に移動しているかを確認し、必要な方向にマップすることだけです。

+0

あなたを気にしますが、少しのコードで私を助けることができますか? –

1

ある方向の動きを確認するには、しばらくの間ジョイントの履歴を保持する必要があります。例えば、最後の0.5秒からの最後の16フレーム。あなたが持っている場合は、関節の実際の位置(例えば、HipCenter)と履歴を比較して、動きの方向を分析することができます。すべての3つの軸を確認すると、ユーザーは右、左、前方、後方に進むと言えます。彼は飛び降りているのですか?

このような履歴を作成するには、構造体のリストを作成することができます。構造体にはタイムスタンプが必要です。タイムスタンプを使用すると、0,5秒より古いエントリを削除することができますので、リストはあまり成長しません。すべてのフレームでリストをループに入れ、ジョイントの位置を比較して各要素を実際の位置と比較します

関連する問題