Kinect-for-Windows-SDK开发初体验

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

KinectforWindowsSDK开发初体验作者:马宁(一)环境配置万众期待的KinectforWindowsSDK终于在广大开发者的千呼万唤中发布了beta版,作为历史上销售最快的消费电子产品,早就有无数人想将其用于其他领域了。微软虽然在硬件接口上制造了一点小障碍,但并没有对Kinect的输出做任何加密。于是,基于Kinect的各种应用层出不穷,也有开源社区提供了针对Kinect的USB驱动程序,比如OpenKinect等。微软从谏如流,推出了官方版的KinectforWindowsSDK,终于让广大开发者可以名正言顺地使用KinectSDK了。我希望能够在第一时间为国内开发者提供Kinect开发相关的介绍,根据微软官方提供的指南,从浅入深,将自己摸索KinectSDK的过程记录下来。安装环境首先来说,KinectforWindowsSDK的下载地址:目前只支持Windows7,分为x86和x64两个版本。开发工具方面还需要.NETFramework4.0和VisualStudio2010(最低Express版本)的支持。KinectSDK的视频开发教程:=recent#tab_sortBy_recentKinectSDK的开发指南:的官方论坛:硬件设备的需求是:KinectforXbox360sensor和Xbox360KinectACAdapter/PowerSupply。如果您购买的是单独的Kinect,将包含KinectACAdapter/PowerSupply。但是如果您购买的是XBOX360Slim和Kinect的套装,就需要单独购买KinectACAdapter/PowerSupply。下面是亚马逊上的产品链接:=sr_1_1?ie=UTF8&qid=1308247174&sr=8-1安装步骤1.硬件安装下面的图片是Kinect和ACAdapter/PowerSupply:按照接口连接好后,将USB插入到PC上,ACAdapter电源是可以支持220V的,所以不需要转换器直接插到电源上就可以。2.KinectSDK安装KinectSDK的安装过程非常简单,无需任何设置,直接安装即可。3.环境测试KinectSDK安装完成后,我们将Kinect转接口的USB接口插入到PC中。PC会发现新硬件,并且自动查找驱动程序安装。下图是安装完成后的示意图:4.测试程序我们打开KinectSDK中自带的SampleSkeletalViewer就可以很方便地检测Kinect设备是否与PC已经连接好了。为了测试,逼得我不得不闪亮出镜了。以后Kinect调试,说不定还真要请一个人站在那里,实现敏捷开发中的“双人编程”……写到最后我们今天关于Kinect的介绍就到这里,在KinectSDK的发布会上展示了很多有意思的DEMO,可见Kinect的应用前景是无限广阔的。下图就是一个Kinect与虚拟增强现实整合的案例:下一节,我们会深入Kinect真实的开发环境,来编写第一个Kinect的应用程序。(二)操作CameraKinectSDK出来之后,不到24小时,很多Geek们已经将自己的示例发布到网上去了。可见,好东西肯定会被大家认可的,不好的东西投入再多的宣传也没用。这一篇我们就要正式进入Kinect的编程世界了,介绍我们如何从Camera获取图像信息。先来介绍一下Kinect的整体结构,省得大家在后边的介绍中被某些名词弄晕。Kinect一共有三个Camera,其中中间的一个是RGBCamera,用来获取640x480的彩色图像,每秒钟最多获取30帧图像;两侧是两个景深(3DDepth)传感器,用来检测玩家的相对位置,原理和人眼立体成像是一样的,不过这两个传感器使用的是红外线,所以说奥巴马玩不了Kinect的人一定是居心叵测。Kinect两侧是麦克风,下边还有一个可移动底座,用来调整Kinect的仰角。Kinect开发环境今天我们主要是操作RGBCamera和DepthSensor,首先,我们要完成Kinect开发环境的配置:第一步,创建WPF工程打开VisualStudio2010,创建一个WPF工程,名叫KinectWpfDemo:当然,由于KinectSDK中包含基于.NET的程序集,除了WPF外,我们使用.NETWinForm或XNA框架都可以,目前还没有人在Silverlight平台上实验成功。第二步,添加Kinect程序集的引用在SolutionExplorer中,右键单击KinectWpfDemo,在右键菜单中选择“AddReference…”。在弹出的对话框中,我们在.NET标签页里,选择“Microsoft.Research.Kinect”程序集。如下图所示:第三步,添加Coding4FunKinectToolkit这是一个可选项,不过为了之后的编程方便,建议大家添加一个。Coding4FunKinectToolkit的下载地址:解压缩后,一共有五个文件,针对WinForm、WPF平台,还有一个Microsoft.Expression.Drawing.dll。我们通过AddReference,将Coding4Fun.Kinect.Wpf.dll添加进来。获取RGBCamera数据第四步,添加控件双击打开MainWindow.xaml,在设计器中添加两个Image控件,一个用于显示RGB图像,另一个用于显示Depth信息。第五步,引用命名空间打开MainWindow.xaml.cs文件,在文件头部添加对于Kinect对象的引用:usingMicrosoft.Research.Kinect.Nui;usingMicrosoft.Research.Kinect.Audio;usingCoding4Fun.Kinect.Wpf;回到MainWindow.xaml的设计器中,在属性窗口中选择Event,找到Loaded和Closed两个方法,分别双击,添加两个事件的处理函数:在MainWindow.xaml.cs文件的MainWindow类中,声明Runtime的变量:Runtimenui;然后,在Loaded事件的处理函数中添加Runtime初始化的代码:privatevoidWindow_Loaded(objectsender,RoutedEventArgse){nui=newRuntime();nui.Initialize(RuntimeOptions.UseColor|RuntimeOptions.UseDepth|RuntimeOptions.UseDepthAndPlayerIndex|RuntimeOptions.UseSkeletalTracking);}接下来是Closed事件中关闭Runtime的代码:privatevoidWindow_Closed(objectsender,EventArgse){nui.Uninitialize();}Runtime对象是KinectSDK中最主要的一个类,所有针对Kinect的操作都由Runtime类进行了封装。Runtime的构造函数没有接受任何参数,但有一个显式的初始化函数Initialize,接受RuntimeOptions参数,指定调用Kinect的哪些功能。其中RuntimeOptions.UseColor表示使用RGBCamera,而RuntimeOptions.UseDepth则表示使用Depth传感器。初始化工作完成之后,我们要通过RGBCamera来获取实时的图像数据了。我们首先要声明一个事件处理方法,来接收视频数据的信息:nui.VideoFrameReady+=newEventHandler(nui_VideoFrameReady);然后是事件处理函数:voidnui_VideoFrameReady(objectsender,ImageFrameReadyEventArgse){PlanarImageimageData=e.ImageFrame.Image;image1.Source=BitmapSource.Create(imageData.Width,imageData.Height,96,96,PixelFormats.Bgr32,null,imageData.Bits,imageData.Width*imageData.BytesPerPixel);//image1.Source=e.ImageFrame.ToBitmapSource();}提示:GettingStarted上提供的SampleCode有误,需要将最后一个参数中的data.Width改为imageData.Width才可以正常运行。VideoFrameReady事件会传递一个ImageFrameReadyEventArgs参数给事件处理函数,其中的ImageFrame会包含关于图片的各种信息,比如Type变量指定了图像是来自RGB还是Depth,Resolution变量指定了分辨率,而Image中以byte[]数组的方式保存了图像的真实数据。然后的工作就是根据PlanarImage中包括的数据来创建一个Bitmap对象,然后将其传递给Image控件,显示到WPF程序的界面上。最后,我们还要在构造函数里打开视频流,来获取视频数据:nui.VideoStream.Open(ImageStreamType.Video,2,ImageResolution.Resolution640x480,ImageType.Color);第一个参数是ImageStreamType,用来指定打开的设备流类型;第二个参数是PoolSize,指定缓冲区的数量,至少为2,保证一个Buffer进行绘制,另一个Buffer进行数据填充;第三个参数指定Camera的分辨率;第四个参数则是获取的图片类型。显示效果如下图所示:上面的示例代码,没有使用Coding4Fun的Helper类,如果使用的话,则代码如下:voidnui_VideoFrameReady(objectsender,ImageFrameReadyEventArgse){image1.Source=e.ImageFrame.ToBitmapSource();e.ImageFrame.ToBitmapSource().Save(catpure.jpg,ImageFormat.Jpeg);}Helper类使用了C#的ExtensionMethods,为ImageFrame增加了一些转换方法。我们还可以将图像保存为文件,考虑到文件系统存储的效率文件,建议大家不用每张都存。获取Depth信息接下来我们要获取Depth信息了,过程与RGBCamera类似。首先要确保Runtime对象被初始化时,已经添加了RuntimeOptions.UseDepth的属性,否则设备无法正常打开。然后,添加获取Depth数据的事件处理,并打开Depth的数据流,这次的分辨率是320x240:nui.DepthFrameReady+=newEventHandler(nu

1 / 18
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功