2013-05-31 3 views
0

Я пытаюсь разработать то, что кажется простой программой, которая использует Kinect для Xbox360 для вычисления расстояния, пройденного человеком. Комната, на которую будет направлен Kinect, будет 10 x 10. После того, как пользователь нажмет кнопку, объект будет перемещаться по этому пространству. Как только субъект достигнет своего конечного пункта назначения в этом районе, пользователь снова нажмет кнопку. Затем Kinect выводит, как далеко перемещался объект между обоими нажатиями кнопок. Никогда не развиваясь для Kinect раньше, было довольно сложно начать. Моя проблема в том, что я не совсем уверен, что я должен использовать для измерения расстояния. В моих исследованиях я нашел способы рассчитать расстояние от объекта от Kinect, но это о нем.Использование Kinect для расчета пройденного расстояния

+1

Какой SDK вы используете? OpenNI (1.54 или 2.0) или Kinect SDK? – ArturSkowronski

+0

Я использую KinectSDK – TeegsD

ответ

0

То, что вы слышали, - это простой вопрос о декартовой плоскости. Kinect имеет 20 суставов, которые существуют в пространстве XYZ, а расстояние измеряется в метрах. Для того, чтобы получить доступ к этим стыки, у вас есть эти заявления внутри класса «Tracker» (это 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. Затем вы выполните математику, необходимую для того, чтобы получить расстояние между двумя точками. Если у вас нет задержки, вы не сможете получить свою декартову точку.

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