我想构建一个简单的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?
提前致谢!
答案 0 :(得分:1)
http://msdn.microsoft.com/en-us/library/microsoft.kinect.depthimagestream.opennextframe.aspx表示如果在帧可用之前等待时间过去,该函数将返回null。由于您指定的等待时间为5毫秒,因此很可能会发生这种情况。特别是因为你刚刚启动传感器所以它可能还没有完成启动(它的一些启动是异步的)。您需要为下一帧指定更长的超时,或处理null情况。
在我的游戏中,我在每个游戏帧上轮询一个新帧,指定超时为零。如果结果为null,我使用最后一帧。在游戏启动期间,我等待第一帧可用,这样我就不必处理尚未获得第一帧的边缘情况。这很简洁,因为它允许游戏帧速率与Kinect帧速率(理想情况下更低)分离。