Kinect 开发入门笔记
------第一节 Kinect 彩色和红外图像的处理
一、编译环境支持:
Windows 7/windows 8
Microsoft Visual Stuio 2010/2012
Kinect for windows SDK
Ps:SDK可以在微软官网获取。
你可以在 http://msdn.microsoft.com/zh-CN/ MSDN微软开发人员网站
http://msdn.itellyou.cn MSDN我告诉你
获得相关技术文档的支持。
SDK下载好后,直接安装即可。
二、kinect获取彩色图像
1、kinect获取的彩色图像有两种质量,普通质量与高质量。这两中质量决定了传输的速度。可根据需求选取。
2、彩色数据可以选择两种色彩格式,这两种色彩格式决定了返回应用的图像数据是以RGB形式还是YUV形式编码。
A:RGB格式在sRGB色彩空间提供32位线性X8R8G8B8格式的彩色位图
B:YUV格式提供16位伽马校正的线性UYVY格式色彩位图,YUV色彩空间的伽马校正等价于RGB色彩空间的sRGB伽马校正。由于YUV流中每个像素只有16位,因此用这种格式保存位图数据时占用的存储空间少,调用NuiImageStreamOpen函数时只需分配较小缓存。
3、在SDK的API中,色彩图像类型用每句类型ColorImageFormat 表示,枚举值的表如下图。
4.调用API获取彩色图像。
1.打开VS2010,创建一个WPF工程,对其命名为KinectColorViewer
2:在解决方案菜单中,右键项目,添加引用。
3:在弹出菜单栏的.NET一栏里,找到Microsoft.kinect并添加该引用。
4:添加控件,在MainWindow.xaml文件的设计器中添加一个Image控件。
代码如下:
<Grid>
<Image Height="311" HorizontalAlignment="left"
Name="ColorImage" Stretch="Fill" VerticalAlignment="Top" Width="503" />
</Grid>
5:在MainWindow.xaml.cs文件中添加头文件
using Microsoft.Kinect;
6:定义KinectSensor对象。在MainWindow.xaml.cs 文件的MainWindow类中,声明如下两个变量:
private byte[] pixelDate;
KinectSensor kinectSensor;
7:在Loaded事件处理函数中添加KinectSensor对象的初始化代码。先附上代码,之后再详细讲解。
在使用完kinect后要,关闭。使用Stop()实现:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
kinectSensor = (from sensor in KinectSensor.KinectSensors
where sensor.Status == KinectStatus.Connected
select sensor).FirstOrDefault();
kinectSensor.ColorStream.Enable(ColorImageFormat.RgbResolution640x480Fps30);
kinectSensor.Start();
kinectSensor.ColorFrameReady += KinectSensor_ColorFrameReady;
}
private void Window_Closed(object sender, EventArgs e)
{
kinectSensor.Stop();
}
8:接受视频数据,定义kinectSensor_ColorFrameReady()事件处理获取的视频数据,并将获取到的数据显示出来。定义如下:
private void KinectSensor_ColorFrameReady(object sender, ColorImageFrameReadyEventArgs e)
{
using (ColorImageFrame ImageFrame = e.OpenColorImageFrame())
{
if (ImageFrame != null)
{
this.pixelDate = new byte[ImageFrame.PixelDataLength];
ImageFrame.CopyPixelDataTo(this.pixelDate);
this.ColorImage.Source = BitmapSource.Create(ImageFrame.Width,
ImageFrame.Height, 96, 96,
PixelFormats.Bgr32, null, pixelDate,
ImageFrame.Width * ImageFrame.BytesPerPixel);
}
}
}
编译运行,结果》》
四、红外图像的获取
红外图像只是彩色图像的一种特殊格式,所以获取红外图像只需修改两处代码
1:修改图像格式。
将
kinectSensor.ColorStream.Enable(ColorImageFormat.RgbResolution640x480Fps30);
改为
kinectSensor.ColorStream.Enable(ColorImageFormat.InfraredResolution640x480Fps30);
同时,因为ColorImageFormat.InfraredResolution640x480Fps30是红外图像的格式类型,由于红外图像的16位的灰度图像,因此要更改显示图像的语句。
将
this.ColorImage.Source = BitmapSource.Create(ImageFrame.Width,
ImageFrame.Height, 96, 96,
PixelFormats.Bgr32, null, pixelDate,
ImageFrame.Width * ImageFrame.BytesPerPixel);
替换成
this.ColorImage.Source = BitmapSource.Create(ImageFrame.Width,
ImageFrame.Height, 96, 96,
PixelFormats.Gray16, null, pixelDate,
ImageFrame.Width * ImageFrame.BytesPerPixel);
运行效果
开灯状态下:
关灯状态下: