Kinect Null深度和颜色框架

时间:2013-01-23 07:43:59

标签: xna null frame kinect

我正在使用XNA Framework 4.0Kinect 1.6 SDK开发游戏。我的代码使用颜色,深度和骨架数据,所以我使用AllFramesReady事件。

当我运行游戏并且有人要检测时,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。当我使用深度和颜色数据运行其他程序时,它们正常运行但只有这一个不起作用。我目前没有想法。谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

也许你可以尝试一下。正如其中一位评论者建议的那样,您可能会收到此错误,因为您只调用AllFramesReady。您可能需要分别在SkeletonFrame,ColorFrame和DepthFrameReady事件处理程序中调用它。实施例

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

我回答这个问题的原因是因为Kinect for Windows SDK文档指出“新的ColorImageFrame对象中的一组颜色数据,如果数据不再可用,则为NULL”。并且由于您的机器可能与您的代码所使用的其他机器的设置不同,因此K4WSDK或编译器中的任何变体都可能会大大改变程序在编译后的运行方式。

至于为什么这不起作用,它可能是您计算机上的编译器问题。您是否检查过VS中的编译器版本是否相同?它是VS的同一版本吗?此外,您是否检查过您的计算机上是否存在所有相应的库和包含?如果你真的想确定根本原因,你可以逐步完成工作机器并与你自己的机器进行比较。