2013-09-05 76 views
0

我正在關注來自kinect工具包的代碼以記錄和重放幀,我知道問題是它永遠不會識別新的replay_SkeletonFrameReady,因此我無法繪製我記錄的骨架。請注意,我讀取的文件中確實有數據(也通過kinect toolkit方法保存了數據)。KinectReplay類的SkeletonFrameReady事件處理程序不執行

void replay_SkeletonFrameReady(object sender, ReplaySkeletonFrameReadyEventArgs e) 
    { 
     //..The code never makes it to this part, why is this?    
     processFrame(e.SkeletonFrame); 
    } 

    private void processFrame(ReplaySkeletonFrame frame) 
    { 
     if (frame != null) 
     { 
      skeletonsReplay = new Skeleton[frame.Skeletons.Length]; 
      skeletonsReplay = frame.Skeletons; 
      Console.WriteLine("attempting draw"); 
      drawMe(); //..Function that draws skeleton 
     } 
    } 

    private void LaunchReplay() 
    { 
     Console.WriteLine("replay launched"); 
     Stream readFS = File.OpenRead(@Global.localDirectory +   
     "\\localStorage\\MySwing.replay"); 
     replay = new KinectReplay(readFS); 

     //..This line of code should cause the first function to be called right? 
     replay.SkeletonFrameReady += replay_SkeletonFrameReady; 
     replay.Start(); 
    } 
+1

我很抱歉,但如果你已經知道問題是什麼,什麼是你的題?你想讓它識別skeletonFrameReady? – streppel

+0

只要它從文件中讀取一個新的幀,它應該調用replay_skeletonframeready,但這種情況從未發生過。所以問題是每當它讀取一個新的幀時,處理該幀的函數都不會被調用。 'replay.SkeletonFrameReady + = replay_SkeletonFrameReady;'應該調用replay_skeletonframeready –

+0

@EJ_Westhuizen你有沒有在方法的各個部分設置斷點?那麼你是如何確定代碼從未達到這一點的,還是僅僅因爲你看不到骨架? –

回答

0

由於Kinect Toolbox是開源的,我們看到的是內部事情的好處。

當你通過它傳遞一個Stream初始化KinectReplay對象,類將查找在該文件中,看到(這是當你使用KinectRecorder,並通過它KinectRecorderOptions枚舉實例指定被保存到文件,流。該然後KinectReplay構造函數將讀取整個文件中添加骨架/顏色/深度幀內部集合爲它找到它們。

當調用啓動方法,所述KinectReplay系統將模擬記錄到毫秒提供相同的幀定時例如,查看ReplaySystem開始方法,你會看到(在後臺線程中* - 讀取:將不會ep如果它的最後一個線程在運行,那麼它會運行)它爲第一個幀中的時間戳執行線程睡眠。在我的情況下,第一個骨架沒有被看到2752毫秒,這是第一次睡眠。在重放系統喚醒併發送幀之前,您的代碼可能會超出範圍。

*注:這可能不是一個後臺線程,它在技術上是一個抽象的任務,可以選擇任意的並行機制..

相關問題