3

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

当我运行游戏并检测到有人时,由AllFramesReady事件触发的函数会提取人的图像和骨骼数据并设置我的Player类的属性。

问题是,这段代码过去可以完美运行。但是即使我没有对我的代码进行任何更改,它现在也无法正常工作。我在其他电脑上试了一下,效果很好。但是相同的代码在我的计算机上不起作用。

当我调试时,我看到DepthFrameEventReadyArgsColorFrameEventReadyArgs调用了一个成员isInvalid并将它们设置为 true。因此,当我使用:

DepthImageFrame depthVideoFrame = mainFrame.OpenDepthImageFrame();

...我得到一个 null 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())
{
   ...
}

当我调试时,我看到值是colorVideoFrame,因为member 设置为。当我使用深度和颜色数据运行其他程序时,它们运行正常,但只有这个不工作。我目前没有想法。谢谢你的帮助。depthVideoFramenullisInvalidtrue

4

1 回答 1

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吗?另外,您是否检查过您的计算机上是否存在所有适当的库和包含?如果您真的想确定根本原因,您可以逐步检查工作机器并与您自己的机器进行比较。

于 2013-03-17T00:23:53.427 回答