2016-04-15 18 views
2

我試圖將每個關節位置(xyz)保存到文本文件中。下面是一段代碼:Kinect:內部帶有循環功能的Laggy框架顯示AllFramesReadyEventArgs

 private void KinectAllFramesReady(object sender, AllFramesReadyEventArgs) 
    { 
    . 
    . 
    . 
    //Some initialization code// 
    . 
    . 
    . 
     using (SkeletonFrame skeletonFrame = e.OpenSkeletonFrame()) 
        { 
         if (skeletonFrame != null) 
         { 
          if ((this.skeletonData == null) || (this.skeletonData.Length != skeletonFrame.SkeletonArrayLength)) 
          { 
           this.skeletonData = new Skeleton[skeletonFrame.SkeletonArrayLength]; 
          } 

          skeletonFrame.CopySkeletonDataTo(this.skeletonData); 

          haveSkeletonData = true; 

          //=============== 
          foreach (var skeleton in skeletonData) 
          { 
           if (skeletonFrame != null) 
           { 
            if (skeleton.TrackingState == SkeletonTrackingState.Tracked) 
            { 

             // check the record check box 

             //if (obj.RecCheckStat == true) 

             if (RecordCheckBox.IsChecked == true) 
             { 
              //save skeleton to string 
              Directory.CreateDirectory(folder_path); 
              File.WriteAllText(file_path, currentSkeleton); 

             } 


            } 
           } 
          } 
          //=============== 
         } 
        } 


    } 
. 
. 
. 
//Draw skeleton-depth-color// 
. 
. 
. 
} 

似乎與在功能上foreach (var skeleton in skeletonData),該框架將是每4-5秒laggy(骨架運動,而不是幀速率)。

任何想法如何解決這個問題?感謝你們。

回答

0

我有一個類似的問題,玩弄深度數據。首先要注意的是,Kinect是GPU上的一款強大設備,幀更新是其核心,因此您必須小心使用耗時的任務,因爲它們將以每幀的速率運行或約30次一秒。所以儘可能少地放在框架閱讀功能中。

設置一個計時器或一個單獨的線程,它將寫入您的文件並僅創建一次創建目錄,因爲現在它正在創建每一幀。 在幀讀取器中通過隊列將skeletonData保存到對象。然後,您可以讓定時器/線程採用FIFO方法按照它所發出的相同順序寫入數據。

我也會改變任何foreach到一個for循環,因爲它有點more efficient