2013-05-31 77 views
0

我想開發一個簡單的程序,它使用Kinect for Xbox360來計算一個人的行駛距離。 Kinect將被指向的房間將是10 x 10.在用戶按下按鈕後,對象將在此空間中移動。一旦主體到達他們在該地區的最終目的地,用戶將再次按下按鈕。然後Kinect會輸出兩個按鈕之間的距離。之前從未爲Kinect開發,開始起步非常艱鉅。我的問題是,我不完全確定我應該用什麼來衡量距離。在我的研究中,我已經找到了計算Kinect中物體距離的方法,但僅此而已。使用Kinect來計算行駛的距離

+1

你使用哪個SDK? OpenNI(1.54或2.0)或Kinect SDK? – ArturSkowronski

+0

我正在使用KinectSDK – TeegsD

回答

0

你聽到的是一個處理笛卡爾飛機的簡單問題。 Kinect在XYZ空間中有20個關節,距離以米爲單位。爲了訪問這些關節,你有一個「跟蹤器」類中,這些語句(這是C#...不知道,如果你使用C#或C++的SDK):

public Tracker(KinectSensor sn, MainWindow win, string fileName) 
     { 
      window = win; 

      sensor = sn; 
      try 
      { 
       sensor.Start(); 
      } 
      catch (IOException) 
      { 
       sensor = null; 
       MessageBox.Show("No Kinect sensor found. Please connect one and restart the application", "*****ERROR*****"); 
       return; 
      } 

      sensor.SkeletonFrameReady += SensorSkeletonFrameReady; //Frame handlers 
      sensor.ColorFrameReady += SensorColorFrameReady; 
      sensor.SkeletonStream.Enable(); 
      sensor.ColorStream.Enable(); 
     } 

這些訪問顏色和來自Kinect的骨架流。骨架流包含接頭,讓您專注於與這些語句:

//Start sending skeleton stream 
     private void SensorSkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e) 
     { 
      //Access the skeleton frame 
      using (SkeletonFrame skeletonFrame = e.OpenSkeletonFrame()) 
      { 

       if (skeletonFrame != null) 
       { 
        //Check to see if there is any data in the skeleton 
        if (this.skeletons == null) 

         //Allocate array of skeletons 
         this.skeletons = new Skeleton[skeletonFrame.SkeletonArrayLength]; 

        //Copy skeletons from this frame 
        skeletonFrame.CopySkeletonDataTo(this.skeletons); 

        //Find first tracked skeleton, if any 
        Skeleton skeleton = this.skeletons.Where(s => s.TrackingState == SkeletonTrackingState.Tracked).FirstOrDefault(); 
        if (skeleton != null) 
        { 
         //Initialize joints 
         ///<summary> 
         ///Joints to be displayed, projected, recorded, etc. 
         ///</summary> 
         Joint leftFoot = skeleton.Joints[JointType.FootLeft]; 
        } 
       } 

所以,在你的程序的開始,你要挑一個聯合(有20 ...選擇一個,將永遠是當你執行程序)對Kinect的面對並且用類似下面的語句獲取其位置:

if(skeleton.Joints[JointType.FootLeft].TrackingState == JointTrackingState.Tracked) 
{ 
    double xPosition = skeleton.Joints[JointType.FootLeft].Position.X; 
    double yPosition = skeleton.Joints[JointType.FootLeft].Position.Y; 
    double zPosition = skeleton.Joints[JointType.FootLeft].Position.Z; 
} 

最後,你會希望你停止流之前有輕微的延遲.. 。在點擊和關閉Kinect流之間的一段時間。然後,你會做數學,你需要做的兩個點之間的距離。如果你沒有延遲,你將無法得到你的笛卡爾點。