作者:马宁

Kinect SDK出来之后,不到24小时,很多Geek们已经将自己的示例发布到网上去了。可见,好东西肯定会被大家认可的,不好的东西投入再多的宣传也没用。

这一篇我们就要正式进入Kinect的编程世界了,介绍我们如何从Camera获取图像信息。先来介绍一下Kinect的整体结构,省得大家在后边的介绍中被某些名词弄晕。

Kinect一共有三个Camera,其中中间的一个是RGB Camera,用来获取640x480的彩色图像,每秒钟最多获取30帧图像;两侧是两个景深(3D Depth)传感器,用来检测玩家的相对位置,原理和人眼立体成像是一样的,不过这两个传感器使用的是红外线,所以说奥巴马玩不了Kinect的人一定是居心叵测。Kinect两侧是麦克风,下边还有一个可移动底座,用来调整Kinect的仰角。

Kinect开发环境

今天我们主要是操作RGB Camera和Depth Sensor,首先,我们要完成Kinect开发环境的配置:

第一步,创建WPF工程

打开Visual Studio 2010,创建一个WPF工程,名叫KinectWpfDemo:

当然,由于Kinect SDK中包含基于.NET的程序集,除了WPF外,我们使用.NET WinForm或XNA框架都可以,目前还没有人在Silverlight平台上实验成功。

第二步,添加Kinect程序集的引用

在Solution Explorer中,右键单击KinectWpfDemo,在右键菜单中选择“Add Reference…”。在弹出的对话框中,我们在.NET标签页里,选择“Microsoft.Research.Kinect”程序集。如下图所示:

第三步,添加Coding4Fun Kinect Toolkit

这是一个可选项,不过为了之后的编程方便,建议大家添加一个。Coding4Fun Kinect Toolkit的下载地址:

解压缩后,一共有五个文件,针对WinForm、WPF平台,还有一个Microsoft.Expression.Drawing.dll。我们通过Add Reference,将Coding4Fun.Kinect.Wpf.dll添加进来。

获取RGB Camera数据

第四步,添加控件

双击打开MainWindow.xaml,在设计器中添加两个Image控件,一个用于显示RGB图像,另一个用于显示Depth信息。

第五步,引用命名空间

打开MainWindow.xaml.cs文件,在文件头部添加对于Kinect对象的引用: using Microsoft.Research.Kinect.Nui;

using Microsoft.Research.Kinect.Audio;

using Coding4Fun.Kinect.Wpf;

回到MainWindow.xaml的设计器中,在属性窗口中选择Event,找到Loaded和Closed两个方法,分别双击,添加两个事件的处理函数:

在MainWindow.xaml.cs文件的MainWindow类中,声明Runtime的变量:

Runtime nui;

然后,在Loaded事件的处理函数中添加Runtime初始化的代码:

private void Window_Loaded(object sender, RoutedEventArgs e)

{

nui = new Runtime();

nui.Initialize(RuntimeOptions.UseColor| RuntimeOptions.UseDepth | RuntimeOptions.UseDepthAndPlayerIndex | RuntimeOptions.UseSkeletalTracking);

}

接下来是Closed事件中关闭Runtime的代码:

private void Window_Closed(object sender, EventArgs e)

{

nui.Uninitialize();

}

Runtime对象是Kinect SDK中最主要的一个类,所有针对Kinect的操作都由Runtime类进行了封装。Runtime的构造函数没有接受任何参数,但有一个显式的初始化函数Initialize,接受RuntimeOptions参数,指定调用Kinect的哪些功能。其中RuntimeOptions.UseColor表示使用RGB Camera,而RuntimeOptions.UseDepth则表示使用Depth传感器。

初始化工作完成之后,我们要通过RGB Camera来获取实时的图像数据了。我们首先要声明一个事件处理方法,来接收视频数据的信息:

nui.VideoFrameReady += new EventHandler(nui_VideoFrameReady);

然后是事件处理函数:

void nui_VideoFrameReady(object sender, ImageFrameReadyEventArgs e)

{

PlanarImage imageData = 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();

}

提示:Getting Started上提供的Sample Code有误,需要将最后一个参数中的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类,如果使用的话,则代码如下:

void nui_VideoFrameReady(object sender, ImageFrameReadyEventArgs e)

{

image1.Source = e.ImageFrame.ToBitmapSource();

e.ImageFrame.ToBitmapSource().Save("catpure.jpg", ImageFormat.Jpeg);

}

Helper类使用了C#的Extension Methods,为ImageFrame增加了一些转换方法。我们还可以将图像保存为文件,考虑到文件系统存储的效率文件,建议大家不用每张都存。

获取Depth信息

接下来我们要获取Depth信息了,过程与RGB Camera类似。首先要确保Runtime对象被初始化时,已经添加了RuntimeOptions.UseDepth的属性,否则设备无法正常打开。

然后,添加获取Depth数据的事件处理,并打开Depth的数据流,这次的分辨率是320x240:

nui.DepthFrameReady += new EventHandler(nui_DepthFrameReady);

nui.DepthStream.Open(ImageStreamType.Depth, 2, ImageResolution.Resolution320x240, ImageType.Depth);

下面是事件处理函数,在另外一个Image函数里,显示Depth图像:

void nui_DepthFrameReady(object sender, ImageFrameReadyEventArgs e)

{

image2.Source = e.ImageFrame.ToBitmapSource();

}

偷懒,所以使用了Coding4Fun的Helper类。程序运行的效果如下:

写到最后

这一篇中,我们完成了Kinect开发环境的配置、添加了Coding4Fun Kinect Toolkit、从RGB Camera和Depth Sensor中获取了图像信息。

接下来,我们就要进入Kinect动作捕捉部分了。

kinect二次开发_Kinect for Windows SDK开发初体验(二)操作Camera相关推荐

  1. Kinect for Windows SDK开发入门

    Kinect for Windows SDK开发入门(一):开发环境配置 首先来看一下Kinect设备: 1. Kinect设备 黑色的Kinect设备如下图:基座和感应器之间有一个电动的马达,通过程 ...

  2. C++开发方向之windows驱动开发

    1.为什么要写这篇文章? 最近浏览招聘网站看到关于windows驱动开发的岗位,前几天一个C++客户端工作岗位,猎头也问我是否有了解windows内核. 所以,调研了一下C++的开发方向:window ...

  3. [译]Kinect for Windows SDK开发入门(二):基础知识 上

    上篇文章介绍了Kinect开发的环境配置,这篇文章和下一篇文章将介绍Kinect开发的基本知识,为深入研究Kinect for Windows SDK做好基础. 每一个Kinect应用都有一些基本元素 ...

  4. [译]Kinect for Windows SDK开发入门(八):骨骼追踪进阶 上

    前7篇文件我们介绍了Kinect SDK中各种传感器的各种基本知识,我们用实验的方式演示了这些基本对象和方法的如何使用,这些都是Kinect开发最基本的知识.了解了这些基本知识后,就可以开发出一个基于 ...

  5. Kinect for Windows SDK开发入门(十):手势识别 上:基本概念

    像点击(clicks)是GUI平台的核心,轻点(taps)是触摸平台的核心那样,手势(gestures)是Kinect应用程序的核心.和图形用户界面中的数字交互不同,手势是现实生活中存在的动作.如果没 ...

  6. DJI大疆 windows SDK开发入门(1) integrate SDK into Application

    这里写自定义目录标题 DJI windows SDK 官方开发文档地址 DJI windows SDK public beta 0.3.2下载地址 DJI developer 注册网址(注册后用于生成 ...

  7. Windows Embedded Standard开发初体验(二)

    支持Silverlight的Windows Embedded Standard 好了,完成安装之后,我们就可以来做Windows Embedded Standard的第一个操作系统镜像了.在开始菜单中 ...

  8. Windows Embedded CE 6.0开发初体验(二)CE开发环境 收藏

    上一篇<Windows Embedded CE 6.0开发初体验>之"嵌入式开发流程": http://blog.csdn.net/aawolf/archive/200 ...

  9. Windows Embedded CE 6.0开发初体验(二)CE开发环境

    CE开发环境 下面就要让今天的主角闪亮登场了--Digi CC 9P开发板.为了感谢Digi提供的开发板,还是给他们做个广告吧:这是一家以WiFi相关产品为主营业务的公司,也生产ARM架构的CPU,所 ...

最新文章

  1. 股价相对于转股价溢价的时候,可转债就是折价状态。这就意味着只要正股保持目前的价格,赚钱的概率较高。...
  2. 民航资源网招聘出奇兵效法麦当劳
  3. linux系统编译安装mysql_Linux下编译安装MySQL
  4. sgu 207 Robbers
  5. OnClientClick和OnClick同时使用!
  6. owasp maven_OWASP依赖性检查Maven插件–必须具备
  7. 《剑指offer》第三十五题(复杂链表的复制)
  8. 数据思维,让决策更精准
  9. Redmi K40游戏增强版首发雷电异形闪光灯:电竞气息十足!
  10. 线上安全大会还能这么玩 ISC 2020首创“3D立体云展馆”
  11. Java 8 方法引用 (Method Reference)快速介绍与示例
  12. Linux 服务器感染kerberods 病毒
  13. PLSql不用安装Oracle客户端,实现远程连接
  14. systen v消息队列(一)
  15. linux磁珠技术,磁珠-china178-ChinaUnix博客
  16. iis部署网站 html文件路径,iis发布网页
  17. 操作系统之光--鸿蒙
  18. Linux之scp与sftp的使用
  19. pubg体验服服务器维护,简单1招,教你快速获得《Pubg Mobile》体验服“邀请码”!...
  20. xlwt 合并单元格内 富文本 同一单元格内多个样式

热门文章

  1. 在游戏中强制关机,不能对关机提示框进行操作
  2. 【体验】18650锂电池充电器体验,功能测试,18650充电测试
  3. 对家庭网络设备行业的理解
  4. js函数调用html对象参数传递参数吗,js里函数参数传递对象传的是指针吗
  5. JavaScript中HTML的DOM
  6. 我所理解的 Block
  7. 5分钟快速打造WebRTC视频聊天转
  8. Spring4.1新特性——Spring MVC增强
  9. android adb启动不了
  10. MFC 学习的基本概念