使用EmguCV处理Kinect数据流

一、OpenCV与EmguCV等相关简介

搞计算机视觉方面的人肯定都知道OpenCV——Intel公司在1999年发起的一个项目,它将一些高级的视觉研究成果加入到OpenCV库中并开源贡献给了全世界。其本身使用C/C++写的,不过对于那些习惯了用C#的人来说,直接用OpenCV的话可能不放便。不过幸好,2008年,一个名为Willow Garage的科技孵化公司负责对该项目的更新和维护。几乎同时EmguCV项目开始发起,他提供了对OpenCV的.Net包装,使得我们在.Net环境下能够使用OpenCV库中的函数。

既然EmguCV这么好用,那么我们如何才能将其用到Kinect中,用来处理Kinect的数据流(本文主要指彩色数据)呢????

幸好,有人已帮我们写好了二者的接口函数,如参考资料7、8(来源自4)所示,7、8可能才能下载下来,9是我自己根据5、6整理的。

二、EmguCV在Kinect中的使用

开始本小节的前提是:

1)已能够熟练获取Kinect的彩色数据流;

2)已准备好参考资料7、8两个接口函数。

1、将类“ImageExtemsion.cs”和“EmguImageExtension.cs”添加到你的工程中去。

2、在你的源码中添加命名空间的引用:

using ImageManipulationExtensionMethods;

3、开始使用EmguCV

 private void kinectSensor_ColorFrameReady(object sender, ColorImageFrameReadyEventArgs e)
        {
            using (ColorImageFrame colorImageFrame = e.OpenColorImageFrame())
            {
                if (colorImageFrame != null)
                {
                   /*
                    //*********************使用Kinect的函数显示彩色数据流************************
                    //1、用来存储彩色像素的数组(BGRA BGRA BGRA BGRA BGRA)
                    colorPixelData = new byte[colorImageFrame.PixelDataLength];
                    //2、把彩色数据帧中的彩色像素复制到:colorPixelData
                    colorImageFrame.CopyPixelDataTo(colorPixelData);
                    //3、将彩色像素数据赋给画布上Name=ColorName的Image元素
                    ColorName.Source = 
                        BitmapSource.Create(colorImageFrame.Width, colorImageFrame.Height, 96, 96,
                                      PixelFormats.Bgr32, null, colorPixelData, colorImageFrame.Width * 4);
                  */
                    //*********************使用EmguCV处理Kinect彩色数据流**************************
                    //1、将彩色数据帧(colorImageFrame)转化为EmguCV可以处理的数据类型(Image)
                    Imagebyte> image = colorImageFrame.ToOpenCVImagebyte>();
                    //2、彩色图像转为灰色图像
                    Imagebyte> grayImage = image.Convertbyte>();
                    //3、Sobel边缘检测
                    CvInvoke.Sobel(grayImage, grayImage, DepthType.Cv8U, 1, 0);
                    //4、调用函数进行类型转化
                    ColorName.Source = grayImage.ToBitmapSource();
                }
            }
        }

三、运行结果

原彩色图像

使用EmguCV处理Kinect数据流_第1张图片

Sobel边缘检测后的图像

使用EmguCV处理Kinect数据流_第2张图片

因为时间关系,上述两个运行结果我是分别获取的。当然,我们也可以把两幅图像放到一个界面上。

说明:如果上述有啥疑问也可参考资料4!

参考资料:

1、OpenCV官网

2、OpenCV中文论坛

3、EmguCV官网

4、[EmguCV/KinectSDK] WPF使用EmguCV讀取KinectSDK做影像處理

5、[译]Kinect for Windows SDK开发入门(十五):进阶指引 上](http://www.cnblogs.com/yangecnu/archive/2012/05/10/KinectSDK_BeyondtheBasic_part1.html)

6、[译]Kinect for Windows SDK开发入门(十五):进阶指引 下](http://www.cnblogs.com/yangecnu/archive/2012/05/15/KinectSDK_BeyondtheBasic_part2.html)

7、ImageExtemsion.cs

8、EmguImageExtension.cs

9、EmguCV与Kinect 函数接口

你可能感兴趣的:(EmguCV)