none
Kinect开发学习笔记 V1.1 RRS feed

  • 常规讨论

  • Kinect 开发入门笔记<o:p></o:p>

                           ------第一节 Kinect 彩色和红外图像的处理<o:p></o:p>

    一、编译环境支持:<o:p></o:p>

    Windows 7/windows 8<o:p></o:p>

    Microsoft Visual Stuio 2010/2012<o:p></o:p>

    Kinect for windows SDK<o:p></o:p>

    Ps:SDK可以在微软官网获取。

    获得相关技术文档的支持。<o:p></o:p>

    SDK下载好后,直接安装即可。<o:p></o:p>

    二、kinect获取彩色图像<o:p></o:p>

    1kinect获取的彩色图像有两种质量,普通质量与高质量。这两中质量决定了传输的速度。可根据需求选取。<o:p></o:p>

    2、彩色数据可以选择两种色彩格式,这两种色彩格式决定了返回应用的图像数据是以RGB形式还是YUV形式编码。<o:p></o:p>

    ARGB格式在sRGB色彩空间提供32位线性X8R8G8B8格式的彩色位图<o:p></o:p>

    BYUV格式提供16位伽马校正的线性UYVY格式色彩位图,YUV色彩空间的伽马校正等价于RGB色彩空间的sRGB伽马校正。由于YUV流中每个像素只有16位,因此用这种格式保存位图数据时占用的存储空间少,调用NuiImageStreamOpen函数时只需分配较小缓存。<o:p></o:p>

    3、在SDKAPI中,色彩图像类型用每句类型ColorImageFormat 表示,枚举值的表如下图。<o:p></o:p>

    4.调用API获取彩色图像。<o:p></o:p>

    1.打开VS2010,创建一个WPF工程,对其命名为KinectColorViewer<o:p></o:p>

    2:在解决方案菜单中,右键项目,添加引用。<o:p></o:p>

    3:在弹出菜单栏的.NET一栏里,找到Microsoft.kinect并添加该引用。<o:p></o:p>

    4:添加控件,MainWindow.xaml文件的设计器中添加一个Image控件。<o:p></o:p>

    代码如下:
    <Grid><o:p></o:p>

            <Image Height="311" HorizontalAlignment="left"<o:p></o:p>

                   Name="ColorImage" Stretch="Fill" VerticalAlignment="Top" Width="503" /><o:p></o:p>

    </Grid><o:p></o:p>

    5:MainWindow.xaml.cs文件中添加头文件<o:p></o:p>

    using Microsoft.Kinect;<o:p></o:p>

    6:定义KinectSensor对象。在MainWindow.xaml.cs 文件的MainWindow类中,声明如下两个变量:
    private byte[] pixelDate;<o:p></o:p>

    KinectSensor kinectSensor;<o:p></o:p>

    7:在Loaded事件处理函数中添加KinectSensor对象的初始化代码。先附上代码,之后再详细讲解。<o:p></o:p>

    在使用完kinect后要,关闭。使用Stop()实现:<o:p></o:p>

    private void Window_Loaded(object sender, RoutedEventArgs e)<o:p></o:p>

            {<o:p></o:p>

                kinectSensor = (from sensor in KinectSensor.KinectSensors<o:p></o:p>

                                where sensor.Status == KinectStatus.Connected<o:p></o:p>

                                select sensor).FirstOrDefault();<o:p></o:p>

                kinectSensor.ColorStream.Enable(ColorImageFormat.RgbResolution640x480Fps30);<o:p></o:p>

                kinectSensor.Start();<o:p></o:p>

                kinectSensor.ColorFrameReady += KinectSensor_ColorFrameReady;<o:p></o:p>

    <o:p> </o:p>

    <o:p> </o:p>

    <o:p> </o:p>

            }<o:p></o:p>

    <o:p> </o:p>

            private void Window_Closed(object sender, EventArgs e)<o:p></o:p>

            {<o:p></o:p>

                kinectSensor.Stop();<o:p></o:p>

            }<o:p></o:p>

    8:接受视频数据,定义kinectSensor_ColorFrameReady()事件处理获取的视频数据,并将获取到的数据显示出来。定义如下:<o:p></o:p>

    private void KinectSensor_ColorFrameReady(object sender, ColorImageFrameReadyEventArgs e)<o:p></o:p>

            {<o:p></o:p>

    <o:p> </o:p>

                using (ColorImageFrame ImageFrame = e.OpenColorImageFrame())<o:p></o:p>

                {<o:p></o:p>

                    if (ImageFrame != null)<o:p></o:p>

                    {<o:p></o:p>

                        this.pixelDate = new byte[ImageFrame.PixelDataLength];<o:p></o:p>

                        ImageFrame.CopyPixelDataTo(this.pixelDate);<o:p></o:p>

                        this.ColorImage.Source = BitmapSource.Create(ImageFrame.Width,<o:p></o:p>

                                                ImageFrame.Height, 96, 96,<o:p></o:p>

                                                PixelFormats.Bgr32, null, pixelDate,<o:p></o:p>

                                                ImageFrame.Width * ImageFrame.BytesPerPixel);<o:p></o:p>

                    }<o:p></o:p>

                }<o:p></o:p>

            }<o:p></o:p>

    编译运行,结果》》<o:p></o:p>

    <o:p> </o:p>

    四、红外图像的获取<o:p></o:p>

    红外图像只是彩色图像的一种特殊格式,所以获取红外图像只需修改两处代码<o:p></o:p>

    1:修改图像格式。<o:p></o:p>

    <o:p></o:p>

    kinectSensor.ColorStream.Enable(ColorImageFormat.RgbResolution640x480Fps30);<o:p></o:p>

    改为<o:p></o:p>

    kinectSensor.ColorStream.Enable(ColorImageFormat.InfraredResolution640x480Fps30);<o:p></o:p>

    同时,因为ColorImageFormat.InfraredResolution640x480Fps30是红外图像的格式类型,由于红外图像的16位的灰度图像,因此要更改显示图像的语句。<o:p></o:p>

    <o:p></o:p>

    this.ColorImage.Source = BitmapSource.Create(ImageFrame.Width,<o:p></o:p>

                                                ImageFrame.Height, 96, 96,<o:p></o:p>

                                                PixelFormats.Bgr32, null, pixelDate,<o:p></o:p>

                                                ImageFrame.Width * ImageFrame.BytesPerPixel);<o:p></o:p>

    替换成<o:p></o:p>

    this.ColorImage.Source = BitmapSource.Create(ImageFrame.Width,<o:p></o:p>

                                                ImageFrame.Height, 96, 96,<o:p></o:p>

                                                PixelFormats.Gray16null, pixelDate,<o:p></o:p>

                                                ImageFrame.Width * ImageFrame.BytesPerPixel);<o:p></o:p>

    <o:p> </o:p>

    <o:p></o:p>

    2014年6月5日 9:02