我正在使用XNA Framework 4.0
和Kinect 1.6 SDK
开发游戏。我的代码使用颜色,深度和骨架数据,所以我使用AllFramesReady
事件。
当我运行游戏并且有人要检测时,AllFramesReady
事件触发的功能会提取人物的图像和骨架数据,并设置我的Player
类的属性。
问题是,这段代码过去曾经很好地运作。但即使我没有对我的代码进行任何更改,它现在也无法正常工作。我在其他计算机上试过并且有效。但是相同的代码无法在我的计算机上运行。
当我调试时,我看到DepthFrameEventReadyArgs
和ColorFrameEventReadyArgs
有一个名为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())
{
...
}
在调试时,我看到colorVideoFrame
和depthVideoFrame
值为null
,因为isInvalid
成员设置为true
。当我使用深度和颜色数据运行其他程序时,它们正常运行但只有这一个不起作用。我目前没有想法。谢谢你的帮助。
答案 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的同一版本吗?此外,您是否检查过您的计算机上是否存在所有相应的库和包含?如果你真的想确定根本原因,你可以逐步完成工作机器并与你自己的机器进行比较。