2013-01-23 85 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的相同版本吗?另外,您是否检查过您的计算机上是否存在所有相应的库和包含文件?如果你真的想确定根本原因,你可以在工作机器上一步一步,并与自己的比较。