KinectSensor.DepthStream.OpenNextFrame返回NULL

时间:2013-12-08 21:42:16

标签: c# wcf kinect kinect-sdk

我想构建一个简单的WCF服务,该服务从Kinect传感器返回深度数据。这是我的代码:

[DataContract]
public class DepthFrame
{
    [DataMember]
    public short[] depthData { get; set; }
}

[ServiceContract]
public interface IKinectTools
{     
    [OperationContract]
    DepthFrame getDepthData(); 
}

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class KinectTools : IKinectTools
{ 
    public DepthFrame getDepthData()
    {            
        DepthFrame df = new DepthFrame();
        KinectSensor kinect = KinectSensor.KinectSensors[0];
        kinect.DepthStream.Enable();
        kinect.Start();
        DepthImageFrame depthFrame = kinect.DepthStream.OpenNextFrame(5);
        df.depthData = new short[depthFrame.PixelDataLength];
        depthFrame.CopyPixelDataTo(df.depthData);
        return df;
    }            
}

但代码无效。当我运行该服务时,我在以下行收到错误

df.depthData = new short[depthFrame.PixelDataLength];

因为depthFrame为null。 为什么我在调用OpenNextFrame方法时,depthFrame变量为null?


enter image description here

提前致谢!

1 个答案:

答案 0 :(得分:1)

http://msdn.microsoft.com/en-us/library/microsoft.kinect.depthimagestream.opennextframe.aspx表示如果在帧可用之前等待时间过去,该函数将返回null。由于您指定的等待时间为5毫秒,因此很可能会发生这种情况。特别是因为你刚刚启动传感器所以它可能还没有完成启动(它的一些启动是异步的)。您需要为下一帧指定更长的超时,或处理null情况。

在我的游戏中,我在每个游戏帧上轮询一个新帧,指定超时为零。如果结果为null,我使用最后一帧。在游戏启动期间,我等待第一帧可用,这样我就不必处理尚未获得第一帧的边缘情况。这很简洁,因为它允许游戏帧速率与Kinect帧速率(理想情况下更低)分离。