Welcome

首页 / 软件开发 / .NET编程技术 / Kinect for Windows SDK开发入门(四)景深数据处理 上

Kinect for Windows SDK开发入门(四)景深数据处理 上2014-03-12Kinect传感器的最主要功能之一就是能够产生三维数据,通过这些数据我们能够创建一些很酷的应用。开发Kinect应用程序之前,最好能够了解Kinect的硬件结构。Kinect红外传感器能够探测人体以及非人体对象例如椅子或者咖啡杯。有很多商业组织和实验室正在研究使用景深数据来探测物体。

本文详细介绍了Kinect红外传感器,景深数据格式,景深图像的获取与展示,景深图像的增强处理。

1. Kinect传感器

和许多输入设备不一样,Kinect能够产生三维数据,它有红外发射器和摄像头。和其他Kinect SDK如OpenNI或者libfreenect等SDK不同,微软的Kinect SDK没有提供获取原始红外数据流的方法,相反,Kinect SDK从红外摄像头获取的红外数据后,对其进行计算处理,然后产生景深影像数据。景深影像数据从DepthImageFrame产生,它由DepthImageStream对象提供。

DepthImageStream的使用和ColorImageStream的使用类似。DepthImageStream和ColorImageStream都继承自ImageStream。可以像从ColorImageStream获取数据生成图像那样生成景深图像。先看看将景深数据展现出来需要的步骤。下面的步骤和前面显示彩色影像数据相似:

1. 创建一个新的WPF对象。

2. 添加Microsoft.Kinect.dll对象引用。

3. 添加一个Image元素到UI上,将名称改为DepthImage。

4. 添加必要的发现和释放KinectSensor对象的代码。可以参照前面的文章。

5. 修改初始化KinectSensor对象的代码如下:

private void InitializeKinectSensor(KinectSensor kinectSensor){if (kinectSensor != null){DepthImageStream depthStream = kinectSensor.DepthStream;depthStream.Enable();depthImageBitMap = new WriteableBitmap(depthStream.FrameWidth, depthStream.FrameHeight,96,96,PixelFormats.Gray16, null);depthImageBitmapRect = new Int32Rect(0, 0, depthStream.FrameWidth, depthStream.FrameHeight);depthImageStride = depthStream.FrameWidth * depthStream.FrameBytesPerPixel;DepthImage.Source = depthImageBitMap;kinectSensor.DepthFrameReady += kinectSensor_DepthFrameReady;kinectSensor.Start();}}
6. 修改DepthFrameReady事件,代码如下:

void kinectSensor_DepthFrameReady(object sender, DepthImageFrameReadyEventArgs e){using (DepthImageFrame depthFrame = e.OpenDepthImageFrame()){if (depthFrame != null){short[] depthPixelDate = new short[depthFrame.PixelDataLength];depthFrame.CopyPixelDataTo(depthPixelDate);depthImageBitMap.WritePixels(depthImageBitmapRect, depthPixelDate, depthImageStride, 0);}}}
运行程序,将会看到如下结果,由于一手需要截图,一手需要站在Kinect前面所以姿势不是很对,有点挫,不过人物的轮廓还是显示出来了,在景深数据中,离Kinect越近,颜色越深,越远,颜色越淡。