2013-01-23 83 views
3

我正在開發一個遊戲使用XNA Framework 4.0Kinect 1.6 SDK。我的代碼使用顏色,深度和骨架數據,所以我正在使用AllFramesReady事件。Kinect零深度和顏色框架

當我運行遊戲並且有人要檢測時,由AllFramesReady事件觸發的函數將提取人員的圖像和骨架數據,並設置我的Player類的屬性。

問題是,此代碼過去完美地工作。但即使我沒有對我的代碼進行任何更改,但它現在不起作用。我試過在其他電腦上運行。但是相同的代碼在我的電腦上不起作用。

當我調試時,我看到DepthFrameEventReadyArgsColorFrameEventReadyArgs有一個名爲isInvalid的成員,它們設置爲true。正因爲如此,當我使用:

DepthImageFrame depthVideoFrame = mainFrame.OpenDepthImageFrame();

...我得到一個空depthVideoFrame。同樣適用於彩色框架。

這裏就是我初始化的Kinect(在Initialize):

if (KinectSensor.KinectSensors.Count > 0) 
      { 
       kinect = KinectSensor.KinectSensors[0]; 

       EnableColorStream(kinect); 
       EnableDepthStream(kinect); 
       EnableSkeletonStream(kinect); 

       kinect.AllFramesReady += new EventHandler<AllFramesReadyEventArgs>(kinect_AllFramesReady); 
       kinect.Start(); 
      } 

啓用方法:

void EnableColorStream(KinectSensor ks) 
     { 
      ks.ColorStream.Enable(ColorFormat); 
      colorWidth = ks.ColorStream.FrameWidth; 
      colorHeight = ks.ColorStream.FrameHeight; 
      colorVideo = new Texture2D(graphics.GraphicsDevice, ks.ColorStream.FrameWidth, ks.ColorStream.FrameHeight); 
     } 

     void EnableDepthStream(KinectSensor ks) 
     { 
      ks.DepthStream.Enable(DepthFormat); 
      depthWidth = ks.DepthStream.FrameWidth; 
      depthHeight = ks.DepthStream.FrameHeight; 
      depthVideo = new Texture2D(graphics.GraphicsDevice, ks.DepthStream.FrameWidth, ks.DepthStream.FrameHeight); 
     } 

     void EnableSkeletonStream(KinectSensor ks) 
     { 
      TransformSmoothParameters tsp = new TransformSmoothParameters(); 
      tsp.Smoothing = 0f; 
      tsp.Correction = 0.1f; 
      tsp.Prediction = 0.1f; 
      tsp.JitterRadius = 0.1f; 
      tsp.MaxDeviationRadius = 0.1f; 
      ks.SkeletonStream.Enable(tsp); 
     } 

kinect_AllFramesReady我使用的是這樣的:

using (ColorImageFrame colorVideoFrame = imageFrames.OpenColorImageFrame()) 
{ 
    ... 
} 
using (SkeletonFrame skeletonFrame = imageFrames.OpenSkeletonFrame()) 
{ 
    ... 
} 
using (DepthImageFrame depthVideoFrame = imageFrames.OpenDepthImageFrame()) 
{ 
    ... 
} 

正如我調試,我看到colorVideoFramedepthVideoFrame的值分別爲null,因爲isInvalid成員設置爲true。當我使用深度和顏色數據運行其他程序時,它們運行正常,但只有這個程序無法運行。我目前沒有想法。謝謝你的幫助。

+0

請包括您用來初始化Kinect和捕捉事件的代碼。 –

+0

我在主消息中添加了一些代碼。 –

+0

我還沒有能夠嘗試代碼,但你有沒有嘗試過使用單獨的'FrameReady'事件而不是'AllFramesReady'? –

回答

0

也許你可以試試這個。正如其中一位評論者所建議的,由於您只打電話給AllFramesReady,您可能會收到此錯誤。您可能需要分別在SkeletonFrame,ColorFrame和DepthFrameReady事件處理程序中調用它。防爆。

void DepthFrameReady(object sender, DepthImageFrameReadyEventArgs e) 
{ 
DepthImageFrame imageFrame = e.OpenDepthImageFrame(); 
if (imageFrame != null) 
{ 
    // Do your business here 
} 
} 

的原因,我這個答案會是因爲Kinect的爲Windows SDK文檔狀態,「彩色數據在新ColorImageFrame對象的框架,或NULL,如果數據不再可用。」由於您的機器可能與您的代碼工作的其他機器不同,因此K4WSDK或編譯器的任何變體都可能會大大改變程序在編譯後的運行方式。

至於爲什麼這不起作用,它可能是您的機器上的編譯器問題。你有沒有檢查你在VS中有相同版本的編譯器?它是VS的相同版本嗎?另外,您是否檢查過您的計算機上是否存在所有相應的庫和包含文件?如果你真的想確定根本原因,你可以在工作機器上一步一步,並與自己的比較。