KinectExplorer深度视图 在C#如何实现
概观
如何从KinectExplorer C#示例包含用户任务。深入视图的Kinect的浏览器C#示例部分显示的深度流,显示在灰度的背景对象和不同的人在不同的颜色。在深度视图较深的颜色,表明从Kinect感应器更大的距离。人们都在深度视图的形象,只有他们的整个骨架内捕获的帧适合的颜色编码。看到所有的细节在KinectExplorer C#示例,使用Kinect的Windows SDK示例浏览器的。
编写代码
使深度数据流
使用kinectSensor使颜色的数据流,启动数据流,并注册事件通知。
KinectSensor kinectSensor; kinectSensor.DepthStream.Enable(DepthImageFormat.Resolution320x240Fps30); kinectSensor.Start(); kinectSensor.DepthFrameReady + =,新EventHandler的<DepthImageFrameReadyEventArgs>(DepthImageReady)的;
调用启用方法来初始化图像数据格式,帧率和决议。有效值是在DepthImageFormat枚举。默认值为RgbResolution640x480Fps30。
初始化完成后,通过调用数据流开始启动的方法。
当传感器未来的深度框架准备,DepthFrameReady事件通知应用程序。从这个事件通知注册加入DepthImageReady处理程序。你可以选择接收的下一帧的深度数据准备或通知AllFramesReady事件发生时,下一帧的所有数据流就绪(颜色,深度和骨架,如果他们都启用)。
获取深度数据
首先,声明一个成员变量来存储像素数据和分配内存。获取字节的内存分配从数PixelDataLength属性。
private short[] pixelData; private byte[] depthFrame32; pixelData = new short[imageFrame.PixelDataLength]; depthFrame32 = new byte[imageFrame.Width * imageFrame.Height * 4];
为了获得最佳性能,只分配一次外,每帧的渲染循环运行的内存。
系统会通知您的应用程序,是由准备射击DepthFrameReady事件的深度框架。使用此事件处理程序复制到从传感器像素数据pixelData成员。
private void DepthImageReady(object sender, DepthImageFrameReadyEventArgs e) { using (DepthImageFrame imageFrame = e.OpenDepthImageFrame()) { if (imageFrame != null) { imageFrame.CopyPixelDataTo(this.pixelData); } else { // imageFrame is null because the request did not arrive in time } } }
使用OpenDepthImageFrame方法,从传感器传回的数据访问下一帧。一旦您访问帧,使用CopyPixelDataTo方法将数据复制到本地内存。要保存,所以一定只包括在这个循环处理,必须做到每帧从传感器到每一个颜色框,你将需要运行此代码。
其他情况下,可能会出现的是您的应用程序不响应速度不够快的事件通知。如果是这样的话,IMAGEFRAME参数将是空的,这意味着你不再有机会到这个数据帧传感器现已开始产生下一个数据帧,这个帧是不再有效。
转换的深度数据
转换是否传感器收集的深度和人员还是深度数据的基础上深度数据。
byte[] convertedDepthBits = this.ConvertDepthFrame(this.pixelData, ((KinectSensor)sender).DepthStream);
此功能转换成16位灰度深度框架,其中包括一个32位的深度框架,在不同颜色显示不同的人员的人员指标。有关详细信息,请参阅在KinectExplorer样本KinectDepthViewer.xaml.cs文件。
呈现深度数据
创建一个位图来存储新的像素数据。
KinectDepthViewer kinectDepthImage; WriteableBitmap outputImage; this.outputImage = new WriteableBitmap(imageFrame.Width, imageFrame.Height, 96, 96, PixelFormats.Bgr32, null); this.kinectDepthImage.Source = this.outputImage;
创建一个WriteableBitmap的,这是一个Windows演示基础(WPF)的建设,可在。NET Framework 4,允许访问位图位。只有当像素格式的变化,而 不是创建一个位图 像素数据保存每帧,你会得到更好的性能,通过创建一个WriteableBitmap。
传感器像素数据写入到WriteableBitmap的。
this.outputImage.WritePixels(new Int32Rect(0, 0, imageFrame.Width, imageFrame.Height), this.pixelData, imageFrame.Width * Bgr32BytesPerPixel, 0);
使用WriteableBitmap.WritePixels的方法来保存像素数据。你将需要运行此代码为每一帧到达传感器,所以可以肯定这个循环里面,你可以做一点工作,以获得最佳的性能。
使用深度数据的方法
这里有一些方法,使用深度数据:
- 呈现深度数据
- 存储深度的数据
- 渲染的颜色数据和/或骨骼数据为基础的深度数据
看看你能想象与深度数据做!