Kinect开发学习笔记之(一)Kinect介绍和应用

http://blog.csdn.net/zouxy09/article/details/8145592

一、Kinect简介
      Kinectfor Xbox 360,简称 Kinect,是由微软开发,应用于Xbox 360 主机的周边设备。它让玩家不需要手持或踩踏控制器,而是使用语音指令或手势来操作 Xbox360 的系统界面。它也能捕捉玩家全身上下的动作,用身体来进行游戏,带给玩家“免控制器的游戏与娱乐体验”。其在2010年11月4日于美国上市,建议售价149美金。Kinect在销售前60天内,卖出八百万部,目前已经申请金氏世界记录,成为全世界销售最快的消费性电子产品。

2012年2月1日,微软正式发布面向Windows系统的Kinect版本“Kinect for Windows”,建议售价249美金。而在2012年晚些时候,微软还将发布面向“教育用户”的特别版Kinect。(以上来自wiki百科)

1.1、硬件

Kinect有三个镜头,中间的镜头是 RGB 彩色摄影机,用来采集彩色图像。左右两边镜头则分别为红外线发射器和红外线CMOS 摄影机所构成的3D结构光深度感应器,用来采集深度数据(场景中物体到摄像头的距离)。彩色摄像头最大支持1280*960分辨率成像,红外摄像头最大支持640*480成像。Kinect还搭配了追焦技术,底座马达会随着对焦物体移动跟着转动。Kinect也内建阵列式麦克风,由四个麦克风同时收音,比对后消除杂音,并通过其采集声音进行语音识别和声源定位。

1.2、软件开发环境

1.2.1、非官方组合

一开始微软对Xbox 360推出Kinect的时候,并没有在windows的开发包。而由于Kinect强大的功能和相对低廉的价格,geeks们纷纷表示希望能在电脑上用它。于是就有多位大牛开发了驱动,目前我了解到的有三个:

1)CL NUI Platform

由NUI的大牛AlexP开发(他开发的其他著名产品包括PS3的windows驱动),可以到这里下载,目标平台是windows7,能够获取彩色摄像头,深度传感器以及加速度传感器数据,使用简单方便。

2)OpenKinect/libfreenect

由号称第一个破解Kinect的Hector Martin发起,可以到这里下载,目标平台是Linux and Mac,据说有人成功移植到了windows上。因为很多geek都是Mac的拥趸,所以开发参与者众多,不仅仅是个可以获得数据的driver,geek们还写了其他高级的东西,比如我前面提到的骨骼化,将彩色摄像头作为纹理贴在深度数据上等等,很吸引人啊。

3)OpenNI

OpenNI(opennatural interface开放自然交互)是一个多语言,跨平台的框架,它定义了编写应用程序,并利用其自然交互的API。可以到这里下载。从名字判断其终极目标大约是实现少数派报告的效果,从目前放出来的一些demo,恐怕已经超越了这个终极目标。它不是专为Kinect开发,但有Kinect的生产商PrimeSense的支持。这个感觉也是目前相对来说用的比较多的非官方组合:SensorKinect + NITE + OpenNI;其中SensorKinect是Kinect的驱动。NITE是PrimeSense提供的中间件,可以分析Kinect读取的资料,输出人体动作等等。

1.2.2、微软官方SDK

Kinect体感游戏在Xbox 360 上获得很好的评价,但是对于 Windows 平台上的开发却一直只能使用非官方的解决方案(上面所说),例如NKinect 配合CL NUI SDK;但是微软终于在2011 年 6 月推出了 Kinect forWindows SDK Beta,特别是可以使用 C# 与.NETFramework 4.0 来进行开发。Kinect for Windows SDK主要是针对Windows7设计,内含驱动程序、丰富的原始感测数据流程式开发接口、自然用户接口、安装文件以及参考例程。Kinect for Windows SDK可让使用C++、C#或VisualBasiC语言搭配MicrosoftVisualStudio2010工具的程序设计师轻易开发使用。目前最新是V1.6 。

Kinectfor Windows SDK的下载地址:

http://research.microsoft.com/en-us/um/redmond/projects/kinectsdk/download.aspx

Kinect SDK目前只支持Windows 7,分为x86和x64两个版本。开发工具方面还需要.NET Framework 4.0和Visual Studio 2010 (最低Express版本)的支持。这个在后面的开发环境的配置中再做介绍。

1.2.3、非官方和官方开发包的优缺点

1)官方SDK:

优点:

提供了音频支持、调整倾角的转动电机、在全身跟踪骨骼跟踪方面:非标准姿势检测(相对于OpenNi的投降姿势…),头部、手、脚、锁骨检测以及关节遮挡等细节上的处理更为细致(但精度是否更高还不能确定)。此外,支持多传感器(多台Kinect);

缺点:

微软对非商业使用的限制。此外,未提供手势识别和跟踪功能,未实现RGB图像/深度图像的互对齐,只是提供了对个体坐标系的对齐。在全身骨骼跟踪中,SDK只计算了关节的位置,并未得出其旋转角度。从可移植的角度来看,SDK beta只能用于Kinect/Win7平台,而OpenNi还至少支持华硕的WAVI Xtion体感设备,今后支持的硬件平台还可能更多。相比较而言SDK beta不支持Unity3D游戏引擎、不支持记录/回放数据写入磁盘、不支持原始红外视频数据流、也不支持像OpenNi一样的角色入场和出场的事件响应机制。

2)非官方OpenNI/NITE:

优点:

可用于商业开发、包含手势识别和跟踪功能、可自动对齐深度图像和RGB图像,全身跟踪、关节旋转角度计算、看起来性能较好、已有众多游戏产品应用、支持记录/回放数据写入磁盘、支持原始红外视频数据流、支持角色入场和出场的事件响应机制。支持Primesense和华硕的WAVI Xtion硬件平台和windows、Linux和Mac等软件平台。自带的代码全面支持Unity3D游戏引擎。

缺点:

未提供音频功能、不支持调整倾角的转动电机、在全身跟踪骨骼跟踪方面:无法跟踪头部、手、脚和锁骨的旋转动作,需要标准姿势检测(即著名的投降姿势…),关节遮挡等细节上的处理似乎存在算法bug。不能自动安装并识别Kinect多机环境。安装过程较为繁琐,特别是NITE还要申请开发证书编码。OpenNi也没有提供可用视频和深度图输入的事件触发机制(但OpenNI提供了类似功能的函数可使用,虽然不是回调函数,但是也很好用)。

总结:

OpenNI最大的优势就是允许跨平台多设备,以及商业应用。但从原始数据的采集和预处理技术上看,微软的SDK似乎更稳定一些,况且还提供了不错的骨骼和语音支持。对于部分身体部位识别方面的功能,SDKbeta没有提供局部识别和跟踪,这需要自己的后续开发(至少在相当一段时期内微软可能都不会提供此类功能)。OpenNi/NITE虽然提供了手势识别和跟踪,然而在全身骨骼姿势识别和跟踪上还要更多借鉴微软的产品。

因此,按照目前在社区中的表现,SDK beta和OpenNi/NITE孰优孰劣还真无法一下子确定。而且随着越来越多的开发者加入微软这一方,SDK beta的普及可能会更快,但在更高层次的应用上,对二者的选用往往是需要一定智慧的。

(这部分参考:http://www.hanyi.name/blog/?p=330)

二、Kinect应用开发汇总

本文(百度文库上面的内容,来源未知)汇总了当前使用Kinect SDK for Windows 开发出的各种各样的应用,点击相应的链接可以看到对应Kinect应用的Demo视频。

虚拟应用

Kinect试衣镜,这款基于kinect体感技术的神奇的试衣镜,让客户可以快速的试穿衣服,提高销售效率和企业形象。

http://v.youku.com/v_show/id_XMjU4MjExNjgw.html

Kinect自制应用3D试衣间
http://v.youku.com/v_show/id_XMjg0MDA3MDYw.html

3D建模

3D摄像机, 用两个KINECT实现3D摄像机的基本效果。

http://v.youku.com/v_show/id_XMjI3MDQ2MjEy.html

雕塑工具,立等可取Kinect成街头快速人像雕塑工具,利用Kinect对人体进行3D建模,然后根据人体的3D信息,连接相应的塑模设备,塑造出人体塑像。

http://v.youku.com/v_show/id_XMjU2Njg2MzE2.html

机械控制

用Kinect 操控遥控直升机

http://v.youku.com/v_show/id_XMjgzOTYxODk2.html

Kinect Robo,使用Kinect作为机器人的头,通过kinect检测周围环境,并进行3D建模,来指导机器人的行动。

http://v.youku.com/v_show/id_XMjIzNDMyMjg0.html

Kinect控制高达机械人

http://v.youku.com/v_show/id_XMjM3NDUxMjg4.html

虚拟乐器

空气吉他,通过Kinect手势操作虚拟吉他弹奏音乐。

http://v.youku.com/v_show/id_XMjI5NjM3NzMy.html

Kinect弹奏中国古代乐器,通过手势的改变可以演奏出不同中国古代乐器的声音。

http://v.youku.com/v_show/id_XMjI1MDA4MTM2.html

虚拟娱乐

Kinect破解“初音”,将体感控制应用到漫画人物——初音上。

http://v.youku.com/v_show/id_XMjMxNjQ5MzAw.html

变身奥特曼,捕捉玩家骨架数据,虚拟为奥特曼的形态与之随动,并且附加一些特技效果。

http://v.youku.com/v_show/id_XMjM1MTY1NDY4.html

Kinect破解玩光剑,Kinect检测玩家的动作,虚拟出光剑的影像,与之随动。

http://v.youku.com/v_show/id_XMjI0NTIzOTIw.html

计算机相关应用

Kinect手势操作浏览器,通过Kinect手势对浏览器进行翻页,下拉,放缩等操作。

http://v.youku.com/v_show/id_XMjI1MjczMzg4.html

Air Presenter,让你的演讲从此与众不同,用kinect进行演讲的软件。

http://v.youku.com/v_show/id_XMjU1MTMyNzky.html

Kinect多点触摸,使用kinect实现隔空多点触摸,浏览图片、地图等。

http://v.youku.com/v_show/id_XMjM1MzE2MTY0.html

Kinect体感控制看片,第四军医大学西京医院骨科的医生们将破解的kinect应用在手术室,在术中,手术者可通过体感控制查看患者的影像资料。大大方便了医生手术,减少了手术室的人员流动。

http://v.youku.com/v_show/id_XMjM2Nzg2NDky.html

虚拟实验

Kinect蜡笔物理,使用Kinect手势绘图,通过体感控制所绘图形,并使之具有物理特性,比如重力,吸引力等。

http://v.youku.com/v_show/id_XMjI4MDMwMzM2.html

用Kinect控制闪电(特斯拉线圈)

http://v.youku.com/v_show/id_XMjY5NjE2MzQ0.html

游戏

Kinect破解玩马克思佩恩

http://v.youku.com/v_show/id_XMjM2NjYxNDg0.html

kinect破解玩求生之旅2 体感打僵尸

http://v.youku.com/v_show/id_XMjM3Mjk5MjQw.html

Kinect破解玩魔兽世界

http://v.youku.com/v_show/id_XMjMzMDM1MzI0.html

Kinect破解玩街头霸王

http://v.youku.com/v_show/id_XMjM4MjkzNjA0.html

Kinect破解玩超级马里奥兄弟

http://v.youku.com/v_show/id_XMjI1NzY1OTM2.html

Kinect破解玩兵者诡道

http://v.youku.com/v_show/id_XMjM0NDk2MDg4.html

Kinect破解玩 现代战争

http://v.youku.com/v_show/id_XMjM1NjU4NjE2.html

一群来自卡内基梅隆的学生使用Kinect的交互特点实现了18个各种各种的有趣的想法。他们仅仅用了两周的时间,从大二学生到研究生不等。让我们来看一下他们实现的奇思妙想吧!

原文及视频信息链接http://golancourses.net/2011spring/projects/project-3-interaction/

1. Comic Kinect

此示例主要应用了Kinect的骨架跟踪技术和玩家分段数据,将拳击和脚踢的交互通过可视的漫画效果表现出来,并且同步发出一些拟声效果。

2. Mario Boo

当Kinect传感器检测到有人出现在视野内时,会出现一个幽灵保持在人的背后,随着人的运动而运动,并且会根据深度信息的远近而改变自身大小。

3. Magrathea

Magrathea使用Kinect根据桌上的任何物体动态的产生地形图。摄像头读取桌上物体的不断变化深度信息,可以展现出类似地球地形逐渐进化的过程。

4. We be Monsters

从中午舞狮中获取灵感,运用Kinect的骨架跟踪技术,两个人分别同坐自己的四肢操纵虚拟怪兽的四肢和头尾。

5. Mix&Match Interaction Toy

使用了Kinect/OpenNI 骨架技术,使得3张卡片组成的人体可以跟玩家随动,并且通过手的滑动更换图片。

6. Kinect Flock

作者创建了一个微粒系统,当用户移动时,像棉絮一样的东西会随之涌动,当用户静止时,则聚集到参与者的深度区域。

7. roboScan

roboScan是一个3D模型+扫描仪,将一个Kinect设备固定在一个ABB 4400机械手上。设定好的动作和操作者同时控制机器人和摄像机的3D位置。Kinect的深度数据用来产生一个精确的外部环境的模型。

8. Neurospasta

Neurospasta是一个需要全身投入的自由形态游戏平台。参与者可以控制他们各自基于Kinect的木偶,也可以通过功能设定控制别人的化身。

9. Will-o-the-Wisp

这个设计充满了神秘色彩,玩家可以控制一个发光的球体,球体根据玩家手的运动而动,根据深度信息变大或变小。

10. Balloon Grab

通过检测手掌张开还是握紧的手势,作者开发了一个基于模拟气球飞行的简易小游戏。

11. Hand-Tracking Visualization

该软件使用手势控制音频的可视化效果,结合检测到场景中手距Kinect的深度信息。参与者手的位置,速度以及其他参数被用来创建一个交互式的声音的可视化效果。

感觉Kinect的应用也应景一句话:Kinect的应用取决于你的想象空间!
========

Kinect开发学习笔记之(二)Kinect开发学习资源整理

http://blog.csdn.net/zouxy09/article/details/8145688

刚刚接触Kinect,在网上狂搜资料,获得了很多有利于学习Kinect开发的资源,现整理如下:

首先当然是官方的API介绍了,编程少不了的。Kinect for Windows Programming Guide:

http://msdn.microsoft.com/en-us/library/hh855348.aspx

KinectSDK的视频开发教程:

http://channel9.msdn.com/Series/KinectSDKQuickstarts?sort=recent#tab_sortBy_recent

KinectSDK的开发指南:

http://research.microsoft.com/en-us/um/redmond/projects/kinectsdk/guides.aspx

KinectSDK的官方论坛:

http://social.msdn.microsoft.com/Forums/en-US/kinectsdk/threads

“无花无酒锄作田”的博客,对《Apress Beginning Kinect Programming with the Microsoft Kinect SDK》这本书的连载翻译(目前到十五节了,好像完了),这本书的的英文pdf版可以网上下载。书的内容不仅介绍了如何通过Kinect SDK编程,还介绍了关于人机交互软件设计的很多内容,虽然书所采用的编程语言可能与你的不同,但很多设计思想很有参考价值。

http://www.cnblogs.com/yangecnu/archive/2012/03/30/KinectSDK_Geting_Started.html

马宁的Kinect for Windows SDK开发初体验系列

http://www.cnblogs.com/aawolf/archive/2011/06/17/2083249.html

Kinect+OpenNI学习笔记 系列

http://www.cnblogs.com/tornadomeet/archive/2012/09/26/2704046.html

timebomb的Kinect学习笔记系列(终于找到一个基于OpenCV和C++的了)

http://blog.csdn.net/timebomb/article/details/7169372

如何使用Kinect for windows SDK中的NUI(彩色图像获取)

http://blog.csdn.net/leowangzi/article/details/6604513

OpenCV的新版支持与OpenNI的结合,故可直接对其彩色或者深度图像等获取:

UsingKinect and other OpenNI compatible depth sensors

http://docs.opencv.org/doc/user_guide/ug_highgui.html

Kinect相关最新资讯:

ENGADGET中国版 http://cn.engadget.com/tag/kinect

体感之家 http://www.kinecthome.com/portal.php

商业不靠谱Kinect  http://www.bukop.com/?s=Kinect

雷锋网 Kinect http://www.leiphone.com/tag/kinect

然后,下面的内容来自:http://blog.csdn.net/chenli2010/article/details/6887646

首先是csdn上小斤童鞋的系列文章:

Kinect开发教程一:OpenNI的安装与开发环境配置

Kinect开发教程二:OpenNI读取深度图像与彩色图像并显示

Kinect开发教程三:利用OpenNI进行手势识别

Kinect开发教程四:用Kinect控制鼠标玩水果忍者PC版

Kinect开发教程五:OpenNI获取人体骨架

其次是mp77技术交流频道上的系列文章,基于openNI的《user guide》来写的,简明易懂(作者自称西大学生,俺不知是哪个西大):

Kinect内幕——解析SDK(OpenNIFramework 1):PrimeSense OpenNI Framework的基本架构和设计思路

Kinect内幕——解析SDK(OpenNIFramework 2):工作节点的创建和销毁

Kinect内幕——解析SDK(OpenNIFramework 3):openNI编程

Kinect内幕——解析SDK(OpenNIFramework 4):工作节点的配置

然后是台湾牛人heresy的系列介绍文章,他好像是第一个用汉字介绍Kinect和openNI的先驱者,小斤童鞋的文章基本上是参照他的(万恶的资本主义世界的人咋就有了得天独厚的优势!):

透過 OpneNI 讀取 Kinect 深度影像資料

透過 OpneNI 合併 Kinect 深度以及彩色影像資料

透過 OpenNI 建立 Kinect 3D Point Cloud

錄製、重播 OpenNI 擷取到的資料

透過 OpenNI / NITE 分析人體骨架(上)

透過 OpenNI / NITE 分析人體骨架(下)

OpenNI 的手勢偵測

OpenNI 人體骨架分析部分補充

讓 OpenNI 可以透過微軟 Kinect SDK 讀取 Kinect 的資料!

OpenNI XnSkeletonJointOrientation簡單分析

使用 XML 設定檔來初始化 OpenNI

OpenNI 的手部追蹤、外加簡單的滑鼠模擬

OpenNI 的 User Generator

晨宇思远的博客,关于openNI的好像只有下面一篇文章,但他的opencv的文章有很多,很值得一读:

OpenCV学习笔记(20)Kinect + OpenNI+ OpenCV + OpenGL 组合体验

同样是牛人heresy的系列文章,只是它长在一个不和谐的地方,怎么访问大家都懂的:

OpenNI / Kinect 相關文章目录

继续来CSDN上的童鞋博客:

利用KINECT+OPENCV检测手势的演示程序

国内kinect开发的主要社区之一,其中有很多资源,有时间不妨多逛逛:

kinect 体感游戏网

cnkinect上的童鞋发起的Kinect for PC 项目,是学习kinect的又一个好地方:

kinect for pc 项目的wiki主页
========

Kinect开发学习笔记之(三)Kinect开发环境配置

http://blog.csdn.net/zouxy09
 
      我的Kinect开发平台是:

Win7 x86 + VS2010 + Kinect for Windows SDK v1.6 + OpenCV2.3.0

一、基本要求

Microsoft Visual Studio® 2010 预览版或者其他VisualStudio 2010发行版

Microsoft.NET Framework 4.0 (安装在Visual Studio 2010)

对于C++开发者要浏览骨骼样例需要:

DirectXSoftware Development Kit,June 2010或最新版

DirectXEnd-User Runtime Web Installer

对于语音识别样例 (x86only):

MicrosoftSpeech Platform - Server Runtime, version 10.2 (x86 edition)

MicrosoftSpeech Platform - Software Development Kit, version 10.2 (x86 edition)

Kinect for Windows RuntimeLanguage Pack, version 0.9 (微软语音平台为Kinect Windows SDK Beta提供的声学模型)
 
二、安装和配置Kinect for Windows SDK v1.6

2.1、下载

在下面的网站下载Kinect for Windows SDK和Developer Toolkit:

http://www.microsoft.com/en-us/kinectforwindows/develop/developer-downloads.aspx

其中,下载回来的文件是KinectSDK-v1.6-Setup.exe(主要提供Kinect的驱动和设备访问接口) 和KinectDeveloperToolkit-v1.6.0-Setup.exe(主要提供一些有助于开发的工具,包括Kinect Studio和多种编程语言的开发例程等)。

2.2、安装与测试

上面的两个开发板安装非常简单,全程按默认配置安装完即可。

安装完后,插入Kinect,系统将会自动的搜索驱动。要安装的驱动还是比较多的,最后安装成功后,设备管理器里面增加了如下项:

为了检查是否安装成功,我们在开始处找到Developer Toolkit Browser v1.6.0 (Kinect for Windows),这个就是我们上面安装的开发包工具。打开后发现资源还挺多的。包括一些开发文档,开发工具和支持很多编程语言的例程(点击install,就可将源代码工程复制到你指定的目录,我们也可以直接到这个开发包工具的安装目录的samples文件夹下查看):

我们Run上图的这个SkeletonViewer,如果之前的安装是正确的话,那么这个程序就显示你的彩色图像、深度图像和骨架等等数据。当然,还有其他比较有趣的应用,我们可以都运行看看。

2.3、在VS2010中配置开发环境

要使用VS进行开发的话,需要配置include和lib路径。

进入VS,进入项目属性,在Projects and Solutions中,选择VC++Directories。

假设Kinect是安装在默认路径下,则

(1)Include files加入C:\Program Files\Microsoft SDKs\Kinect\v1.6\inc;

(2)Library files加入C:\Program Files\Microsoft SDKs\Kinect\v1.6\lib\x86;

(3)还需要在链接器的输入中,增加附加依赖性:Kinect10.lib

这样VS的开发环境就配置好了。

下面我们看看Kinect的开发包含哪些头文件:

C:\Program Files\MicrosoftSDKs\Kinect\v1.6\inc 目录下有:

NuiApi.h ---包含所有的NUI(自然用户界面) API头文件和定义基本的初始化和函数访问入口。这是我们C++工程的主要头文件,它已经包含了NuiImageCamera.h 和 NuiSkeleton.h。

NuiImageCamera.h ---定义了图像和摄像头服务的API,包括调整摄像头的角度和仰角,打开数据流和读取数据流等。

NuiSkeleton.h ---骨架有关的API,包括使能骨架跟踪,获取骨架数据,骨架数据转换和平滑渲染等。

NuiSensor.h ---音频API,包括ISoundSourceLocalizer接口,用于返回声源的方向(波束形成)和音频的位置。

三、配置OpenCV

OpenCV是Intel的开源计算机视觉库。它由一系列 C 函数和少量 C++ 类构成,实现了图像处理和计算机视觉方面的很多通用算法。

主页:http://opencv.org/

最新版本是OpenCV 2.4.3,属于比较稳定的版本。但是我电脑已经配置了2.3.0版本了,所以暂时就用2.3.0,他们的API的名称都一样,所以基于2.3的程序在2.4应该不用怎么修改就可以用。

这里,我们用到OpenCV来显示和处理获取到的颜色和深度图像等,所以也需要将其添加进工程里面。和上面的过程一样(你安装的目录可能不一样,请按实际情况操作):

(1)Include files加入D:\opencv2.3.0\OpenCV2.3\build\include;

(2)Library files加入D:\opencv2.3.0\OpenCV2.3\build\x86\vc10\lib;

(3)还需要在链接器的输入中,增加附加依赖性:

opencv_highgui230.lib

opencv_core230.lib

opencv_video230.lib

opencv_imgproc230.lib

其他的在需要的时候再添加了。

好了,到这里,环境都配置好了,下一步就可以步入Kinect开发这个精彩的世界了。

《人月神话》里说:编程的快乐是一种创建事物的纯粹的快乐,程序员凭空的运用自己的想象,来建造自己的“城堡”,而快乐来自于整个过程体现出来的一股强大的魅力---将相互齿和的零部件组装在一起,看到它们以精妙的方式运行着,并看到了你所创建的世界!
========

深入理解Kinect for Windows开发

http://www.cnblogs.com/yangecnu/archive/2012/11/05/Build2012_Kinect_for_Windows_Programming_Deep_Dive.html

----微软Build2012大会:Kinect for Windows Programming Deep Dive

这个周末看了两天的微软Build 2012大会,真的是一次盛会,上面有很多的演讲主题,都是微软相关技术和产品的最新动态,我比较关注.NET、WPF、Office及Kinect相关开发,上面的演讲视频和PPT都可以下载,个人觉得比较精彩的有The Evolution of .NET ,回顾了微软推出.NET以来的历次开发者大会推出的新版本和新特性,里面还有10多年前比尔盖子老师在开发者大会上宣布.NET战略时的演讲视频,不觉得感叹岁月是把杀猪刀啊。 What's New for Developers in Office 2013 and SharePoint 2013 介绍了不同于以往的以VBA,SharedAddIn,以及VSTO的全新的Office开发方式OfficeApp,Building apps for Office and SharePoint 2013 using the web technologies you know and love, Part 1、Part2介绍了如何使用各种我们熟悉的技术如Html、Javascript、C#等来构建OfficeApp。上面还有很多关于Windows Phone 8,WPF4.5等相关的介绍,主题很多,强烈建议大家有空可以上去看看。

大会上关于Kinect开发有三个,第一个是微软研究院讲的Super-Natural Interaction这个PPT比演讲视频都大,达到了罕见的997M,为啥这么大呢,因为里面嵌入了一个长达40分钟视频,哈哈,这个演讲主要演示了微软研究院正在进行的各种人机交互,虚拟现实等研究,非常的Cutting-edge,里面也有和Kinect相关的部分,有兴趣的可以看看。第二个是Kinect Design Considerations,一则关于Kinect应用程序设计是应该考虑的问题比如交互方式的设计的演讲,我没有太仔细看,不过内容应该和Kinect Human Interface Guideline内容差不多,您可以在Kinect Developer Toolkit中查看。第三篇演讲是 Kinect for Windows Programming Deep Dive  我将这个翻译为了深入理解Kinect for Windows开发,相对来说该演讲和Kinect开发比较相关,现与大家分享,该演讲上面写的级别为 300-advanced,个人觉得这个演讲内容其实很简单,只是对Kinect能够获取的相关数据源,Kinect SDK处理过了的可供识别的数据源,以及未来的趋势和大家做了一下介绍。Kinect SDK中其实没有太多的东西,真正的则在于各种模式识别算法,比如通过深度数据,红外数据,进行各种物体识别等等,有了这些数据,尤其是1.6版本的SDK提供的获取红外原始数据,就可以通过这个数据,结合深度数据做出很多非常令人惊叹的应用来。废话不多说了,下面和大家分享一下该演讲的主要内容,也算是一个关于Kinect开发的比较好的入门介绍吧。

一 大纲
Slide2

演讲大体分为5个部分,第一部分介绍了Kinect SDK的开发方式以及运行环境,第二部分是写代码,讲解Kinect中的一些彩色,深度,骨骼等数据的处理和显示,第三部分讲解了传感器直接产生的数据流,包括彩色,深度,红外,语音,加速器数据源,第四部分讲解了经过Kinect SDK对原始数据流处理后的可供用来进行直接识别的,骨骼,语音及面部识别数据源,最后一部分讲解了未来Kinect可进行的一系列应用。现在先来看第一部分吧。

二 Kinect应用场景及开发环境
    首先介绍了一下Kinect的应用场景。主要有三大类方面的应用。第一是自然人机交互界面。比如说一些像少数派报告中的那种用手指非接触即可操纵大屏幕上的显示内容。这在一些高科技或者科幻类电影中经常能够看到这类的场景。还有一些就是在国外已经有的应用如Kinect虚拟试衣间,Kinect车展演示广告,Kinect 手术室影像操作,还有Kinect操作幻灯片,Kinect进行照片浏览 等等,这些自然人机交互界面的应用带来了新的用户体验。第二种是自然环境识别,比如根据Kinect 产生的深度数据,红外数据对物体进行三维扫描重建,利用Kinect进行机器人导航进行障碍物自动回避等。第三种是自然用户的识别,比如说利用Kinect来进行姿势识别,人脸识别。比如说一些大家比较熟悉的XBOX360 中的 舞林大会,运动会,大冒险等体感游戏,这些都是利用Kinect的一些数据来进行用户的动作识别,从而参与到游戏中的互动。还有一些增强现实的应用,利用了上面的三个方面的特性,比如说利用Kinect来将荧幕变成触摸屏,并在上面可以进行各种操作,等等应用。

Slide3

要开发上面的应用,首先要了解一下开发环境,如这张幻灯片所示:

Slide4

Kinect 提供了非托管(C++)和托管(.NET)两种开发方式的SDK,如果您用C++开发的话,需要安装Speech Runtime(V11),Kinect for Windows Runtime和驱动的,如果您使用C#和VB.NET的话,需要Microsoft.Kinect.dll和Mirosoft.Speech.dll两个dll,这两个其实是对前C++里面的两个dll的.NET封装,不论何种开发,您都需要安装driver,所有这些都包含在Kinect SDK安装包中,安装方法您可以参考之前的文章。Kinect开发支持Windows7/Windows Embedded Standard/Windows8操作系统,最新的1.6版本的SDK还支持虚拟机里面的Windows系统,不过只要年代不太久远的Windows系统应该都是可以的。上面写的最好使用.NET 4.0/4.5也只是建议,老版本的应该也行。如果是使用.NET开发方式的话,您需要安装.NET Framework,IDE可以使用Visual Studio 2010/2012。

三 代码演示
    这部分主要是通过编写代码演示Kinect的各项功能,代码我在这里就不讲了。

首先第一个演示是显示彩色影像,比较简单。然后是结合深度影像数据显示彩色影像数据上对应某一点的深度值。

demo1

图上使用鼠标点击就能够加上一个标签,标签里面的值是该点的深度值,这个功能应该是比较好实现的,主要是展示如何使用彩色影像数据和深度数据,您如果感兴趣的话看完这篇文章应该就能实现这个功能。

然后演示了骨骼追踪功能,图中追踪了头部,双手的位置,并显示了两只手所处的深度值,头部上显示的Tracking ID,Kinect能同时追踪6个待选目标,但只有两个目标处于活动状态。每一次追踪都会分配给目标一个Tracking ID。

demo2

这个功能主要演示了如何使用骨骼数据,您如果感兴趣的话看完这篇文章应该就能实现这个功能。

除了1.5及之前能够提供的各种数据之外,1.6 的SDK提供了红外影像数据,您可以利用数据校准彩色影像数据,使得在较暗的条件下也能够进行人物识别。其实Kinect骨骼识别主要是通过深度数据来实现的,而深度数据是通过红外发射接收产生的,1.6版本的SDK提供了我们直接访问和操作红外数据的能力。

demo7

第四个Demo是演示了Kinect的面部识别功能,Kinect的面部识别是在1.5 SDK中引入的,面部识别可以识别最多达一百多个面部特征点,下面是演示的Demo:

demo3

上面的功能在Kinect Developer Toolkit中有实例和源代码,您可以下载查看,入门的话,您也可以看这篇文章,比较简单的对使用FaceTracking的一点介绍。

Kinect除了这些功能之外还有强大的语音识别功能,在这篇演讲中没有演示出来,不过在Super-Natural Interaction这篇演讲的视频中,您可以体会该改功能的强大,Kinect语音识别不仅能够识别出声音,而且还能对声音的来源方向进行识别,且具有强大的去噪增强功能,要了解这些你可以看这篇文章,对Kinect的语音识别做了一些简单的介绍。

四 Kinect数据源及应用
    Kinect开发涉及到的数据源分为两类:

一类是传感器本身产生的原始数据源,比如说彩色影像数据源,深度影像数据源,语音数据源,红外影像数据源,加速计数据源,其中红外影像数据源,加速计数据源是在1.6的SDK中新加入的。下面这张图很好的说明了各个数据源:

Sensor Resource Image

第二类数据源是,SDK中通过一些算法识别出来的可以直接拿来进行识别的数据源,他们包括:骨骼追踪,语音识别,面部识别数据源。

Recognize source

可以看到,骨骼追踪数据源是在深度影像数据源的再通过一系列算法实现的,语音识别是通过语音数据源再通过一系列算法实现的,而面部识别则综合了彩色影像、深度影像和骨骼追踪为系列数据源的再通过一系列算法实现的。这些功能都是通过SDK来实现的。

有了这些数据源,就能够进行各种应用了:

application

典型的应用有绿屏抠像,这个功能在一些电视节目录制,比如天气预报节目中都是应用的这个实现的,他把任务从背景中分离出来,然后可以随意的更换背景,这个功能用到了影像数据和深度数据,你可以参考这篇文章,里面有一个简单的例子。第二个应用是产生点阵云,就是通过Kinect的深度影像数据产生每个点的位置信息然后生成三维模型。如下面这个例子:

demo4

图中左边是通过Kinect的深度影像数据产的三维建模图像。

第三个应用是魔镜功能,我觉得应该是一些类似哈哈镜效果或者是IOS中的Photo Booth应用,主要用到了彩色影像数据,面部识别,骨骼识别等功能。还有一些就是虚拟试衣间这样的功能,最后的一个应用场景就是各种NUI交互界面了。

五 展望
    除了以上的几种典型的数据源之外,还展示了下一步的计划,比如说针对景深数据进行进一步处理的Kinect Fusion数据源。

next

下面是演示的例子:图中,右边桌子上摆放了一个茶壶,然后利用Kinect对该茶壶进行了三维建模,然后。移除右边实物茶壶后,用户可以对虚拟的茶壶进行各种操作,神奇吧,这些都是下一个版本或者是将来的SDK能够方便我们或者简化我们实现这些功能准备添加的功能。

demo6

到最后展望了下一步要进行的工作:

Slide22

可以看出Kinect的愿景是使得计算机能够看到、听到、能够更加理解周围的人和环境。

Kinect SDK的版本发布是很快的,自从今年二月份发布了Kinect Sensor for Windows 体感仪及Kinect for Windows SDK 1.0官方版本以来;5月21日 发布了1.5版本SDK以及1.5的Developer Toolkit及调试工具Kinect Studio 1.5,不久又发布了Developer Toolkit 1.5.1及Developer Toolkit 1.5.2;10月9日发布了1.6版本的SDK和Developer ToolKit,同时宣布正式在大陆开售Kinect Sensor for Windows体感仪。每一个版本都增加了一些新的功能。相信下一个版本的SDK 也会有新的功能加入。

相信大家看了这个演讲之后应该可以感受到Kinect带来的变化,也相信以后Kinect开发能应用到日常生活中的例子会越来越多。

最后,希望大家有空到Channel9上看真人演讲哦,上面还有很多有意思主题演讲,所有演讲的PPT都可以在线看,视频都提供下载,当您不确定那个演讲想不想看时,可以看看下面的在线屁屁踢哦,当然除了那种900多M的变态PPT之外其他的都可以在线浏览,这样您就可以迅速的了解演讲内容以及对该内容有没有兴趣啦。
========

使用Kinect测量身高

http://www.cnblogs.com/yangecnu/archive/2012/11/12/Kinect_Measure_Height.html

使用Kinect测量身高的方法其实有很多种:

第一种方式是使用Kinect的视场角以及结合一些三角形几何运算,就可以大致测量出物体的高度,这一点在之前介绍深度影像处理的时候有提到。

第二种方式是使用Kinect骨骼追踪提供的20个关节点的相关坐标,在根据一定的算法测量出人体的身高。在Channel9上面的这个例子的一个分享,在这里拿过来和大家分享一下。在这里,根据臂展和身高有相似的关系,我对这个例子做了一点扩展,计算臂展来粗略计算身高,用臂展计算身高其实有个好处就是既可以使用正常模式(Normal model,20个关节点),可以使用坐姿模式(Seat model,10 个关节点),这样您坐着就可以测量身高,不过精度不保证哈。这里只是提供这么一个思路。

一. 计算身高的算法
    Kinect获取的骨骼数据包含20个关节点的X,Y,Z坐标信息。您可能会想,为什么不直接使用头部(head)关节点和脚趾(foot)关节点之间的距离来直接计算身高。这样不准确,因为用户可能并没有站直,如果这样算的话,误差比较大。

另一个问题是,头部关节点给出的是头部中心点的位置,如果使用这个位置,您需要额外增加9至11厘米,但是即使这样,也不能达到百分之一百的准确,如果要更精确一点的话,可能需要使用深度影像值来提取头部的顶部位置。也不需要那么麻烦,现在来看看我们怎样使用骨骼关节点来计算高度信息。

仔细观察下面的骨骼点,可以看到,身高可以由下面几部分组成(如图中红色部分):

• 头部(Head) –肩膀中心(ShoulderCenter)

• 肩膀中心(ShoulderCenter) – 脊柱中心(Spine)

• 脊柱中心(Spine) – 髋部中心(HipCenter)

• 髋部中心(HipCenter) – 左或右膝关节(KneeLeft or KneeRight)

• 左膝关节KneeLeft(右膝关节KneeRight) – 左踝关节leLeft (右踝关节AnkleRight)

• 左踝关节leLeft (右踝关节AnkleRight)- 左脚FootLeft (右脚FootRight)

KinectMeasureHeightw

使用臂展计算身高,也可以计算图中绿色所示的关节点:

• 左手(HeadLeft) –左手腕(Wrist Left)

• 左手腕(Wrist Left) – 左胳膊肘(Elbow Left)

• 左胳膊肘(Elbow Left) – 左肩膀(Shoulder Left)

• 左肩膀(Shoulder Left)–肩膀中心(Shoulder Center)

• 肩膀中心(Shoulder Center)-右肩膀(Shoulder Right)

• 右肩膀(Shoulder Right)- 右胳膊肘 (Elbow Right)

• 右胳膊肘 (Elbow Right)- 右手腕(Wrist Right)

•右手腕(Wrist Right)- 右手 (Hand Right)

原理就是这样,下面来编代码实现。

二. 实现
    程序界面很简单,展示20个关节点,然后显示计算结果。有几点需要说明:

首先,关节点的位置信息是三维的,下面公式用来计算两个关节点的距离

public static double Length(Joint p1, Joint p2)
{
    return Math.Sqrt(
        Math.Pow(p1.Position.X - p2.Position.X, 2) +
        Math.Pow(p1.Position.Y - p2.Position.Y, 2) +
        Math.Pow(p1.Position.Z - p2.Position.Z, 2));
}
    上面的代码很直接。第二步,我们应该使用左腿还是右腿还进行测量更加准确呢,我们使用那个追踪的最好的。下面的代码用来计算腿部处于追踪状态的点的数量。如果那个数量多,那么就用那一个。

public static int NumberOfTrackedJoints(params Joint[] joints)
{
    int trackedJoints = 0;

foreach (var joint in joints)
    {
        if (joint.TrackingState == JointTrackingState.Tracked)
        {
            trackedJoints++;
        }
    }

return trackedJoints;
}
    使用上面的函数,我们就可以判断是使用左腿还是右腿了。

// Find which leg is tracked more accurately.
int legLeftTrackedJoints = NumberOfTrackedJoints(hipLeft, kneeLeft, ankleLeft, footLeft);
int legRightTrackedJoints = NumberOfTrackedJoints(hipRight, kneeRight, ankleRight, footRight);

double legLength = legLeftTrackedJoints > legRightTrackedJoints ? Length(hipLeft, kneeLeft, ankleLeft, footLeft) : Length(hipRight, kneeRight, ankleRight, footRight);
     然后我们使用扩展方法,来计算骨骼的高度。下面是方法的代码:

public static double Height(this Skeleton skeleton)
{
    const double HEAD_DIVERGENCE = 0.1;

var head = skeleton.Joints[JointType.Head];
    var neck = skeleton.Joints[JointType.ShoulderCenter];
    var spine = skeleton.Joints[JointType.Spine];
    var waist = skeleton.Joints[JointType.HipCenter];
    var hipLeft = skeleton.Joints[JointType.HipLeft];
    var hipRight = skeleton.Joints[JointType.HipRight];
    var kneeLeft = skeleton.Joints[JointType.KneeLeft];
    var kneeRight = skeleton.Joints[JointType.KneeRight];
    var ankleLeft = skeleton.Joints[JointType.AnkleLeft];
    var ankleRight = skeleton.Joints[JointType.AnkleRight];
    var footLeft = skeleton.Joints[JointType.FootLeft];
    var footRight = skeleton.Joints[JointType.FootRight];

// Find which leg is tracked more accurately.
    int legLeftTrackedJoints = NumberOfTrackedJoints(hipLeft, kneeLeft, ankleLeft, footLeft);
    int legRightTrackedJoints = NumberOfTrackedJoints(hipRight, kneeRight, ankleRight, footRight);

double legLength = legLeftTrackedJoints > legRightTrackedJoints ? Length(hipLeft, kneeLeft, ankleLeft, footLeft) : Length(hipRight, kneeRight, ankleRight, footRight);

return Length(head, neck, spine, waist) + legLength + HEAD_DIVERGENCE;
}
     同样滴,我们使用手,手腕,胳膊肘,肩膀,等9个关节点来计算臂展,并使用臂展来近似计算身高,下面的名为ArmExtendWith的扩展方法即为计算臂展的方法。

public static double ArmExtendWith(this Skeleton skeleton)
{
    var armWidthDeviation = 0.5;
    var handRight = skeleton.Joints[JointType.HandRight];
    var wristRight = skeleton.Joints[JointType.WristRight];
    var elowRight = skeleton.Joints[JointType.ElbowRight];
    var shoulderRight = skeleton.Joints[JointType.ShoulderRight];
    var shoulderCenter = skeleton.Joints[JointType.ShoulderCenter];

var handleft = skeleton.Joints[JointType.HandLeft];
    var wristleft = skeleton.Joints[JointType.WristLeft];
    var elowleft = skeleton.Joints[JointType.ElbowLeft];
    var shoulderleft = skeleton.Joints[JointType.ShoulderLeft];

// Calculate the left and right arm extends width
    double rightArmExtendsWidth = Length(handRight, wristRight, elowRight, shoulderRight, shoulderCenter);
    double leftArmExtendsWidth = Length(handleft, wristleft, elowleft, shoulderleft, shoulderCenter);

return rightArmExtendsWidth + leftArmExtendsWidth + armWidthDeviation;
}
    最后,再SkeletonFrameReady事件中调用该方法即可。

void Sensor_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
{
    using (var frame = e.OpenSkeletonFrame())
    {
        if (frame != null)
        {
            canvas.Children.Clear();

Skeleton[] skeletons = new Skeleton[frame.SkeletonArrayLength];

frame.CopySkeletonDataTo(skeletons);

var skeleton = skeletons.Where(s => s.TrackingState == SkeletonTrackingState.Tracked).FirstOrDefault();

if (skeleton != null)
            {
                // Calculate height.
                double height = Math.Round(skeleton.Height(), 2);
                double armExtendsWidth = Math.Round(skeleton.ArmExtendWith(), 2);
                // Draw skeleton joints.
                foreach (JointType joint in Enum.GetValues(typeof(JointType)))
                {
                    DrawJoint(skeleton.Joints[joint].ScaleTo(640, 480));
                }

// Display height.
                tblHeight.Text = String.Format("Height: {0} m", height);
                tblArmExtendWidth.Text = String.Format("ArmWidth: {0} m", armExtendsWidth);
            }
        }
    }
}
    现在您可以运行代码查看结果了。

三. 结语
     本文介绍了两种利用Kinect测量身高的方法,一种是之前讲过的,利用Kinect的视场角和物体构成的三角关系,运用几何运算,测量物体身高,第二种是利用Kinect提供的骨骼数据,根据关节点直接的距离,来计算人体的身高。本文着重讲解了利用骨骼关节点之间的距离计算身高的两种方法,一种是Channel9上面分享的利用头部、脊柱、髋关节、膝关节、踝关节等8个关节点的长度来计算身高,还有一种就是使用与臂展相关的,手、手腕、胳膊肘、肩膀等9个关节点信息,较第一种方法相比,该方法可以使用坐姿模式进行计算,意味着您坐着就可以测量身高。当然,可能精度不是很准确,本文只是提供了一些Kinect在测量身高方面的思路,源代码点击此处下载,希望本文对您有帮助!

========

体感开发资源链接

http://www.cnblogs.com/yangecnu/category/373950.html

Kinect for Windows SDK

29 篇文章

体感开发学习总结 - 二相关推荐

  1. IOS开发学习周报(二)

    IOS开发学习周报(二) 简介 课程名称 IOS开发实训 任课老师 郑贵锋老师&字节跳动工程师 学号 16340015 专业(方向) 软件工程(计应) 姓名 陈彬彬 Email 9441312 ...

  2. 最近入手kinect,准备搞搞体感开发

    今晚kinect到手了,准备搞搞体感开发玩玩,大家有什么好的创意吗? 截个图纪念一下 哈哈

  3. Polyworks脚本开发学习笔记(二十)-补充几个常见操作指令的使用

    Polyworks脚本开发学习笔记(二十)-补充几个常见操作指令的使用 大概要写到结尾了,最后几篇就将手册的各常用命令再看一遍,组合一下,并列举出常见的一些有用的操作. DATA_COLOR_MAP数 ...

  4. Polyworks脚本开发学习笔记(二)-TREEVIEW基本操作

    Polyworks脚本开发学习笔记(二)-TREEVIEW对象基本操作 TREEVIEW对象选择 选择/不选对象 TREEVIEW OBJECT SELECT ALL 全部对象选择,包括参考/数据/对 ...

  5. Polyworks脚本开发学习笔记(二二)-调取视角用脚本自动生成报告

    Polyworks脚本开发学习笔记(二二)-调取视角用脚本自动生成报告 Polyworks中,3D场景的视图可用标准视角及等轴侧视角.项目视角等方式调用,也可以用txt格式保存下来调用,如果以脚本的形 ...

  6. php和体感开发,关于体感的10篇文章推荐

    一.简介我们要做的是怎样一款游戏?在前不久成都TGC2016展会上,我们开发了一款<火影忍者手游>的体感游戏,主要模拟手游章节<九尾袭来 >,用户化身四代,与九尾进行对决,吸引 ...

  7. 工作经验(体感开发篇)

    我的工作是C++开发,主要是做体感方面的开发,以下是开发时候遇到的一些坎,希望不会重蹈覆辙 NITE1.5及以后,内部通过一定的步骤,允许任何姿势下进行骨架校准,可用NeedPoseForCalibr ...

  8. 【Qt+OpenCV项目开发学习】二、图片查看器应用程序开发

    一.前言 本博客将讲解如何用Qt+OpenCV开发一款图片查看器的Windows应用程序,其实不用OpenCV也能开发出这类软件,作者目的是为了学习Qt+OpenCV开发项目,所以会使用OpenCV, ...

  9. OpenGL开发学习指南二(glfw+glad)

    在上一篇文章中博主介绍了freeglut+glew的环境配置,本文介绍glfw+glad的环境配置 本系列教程将使用本文的opengl开发库 开发工具 VS2017 glfw源码:源码地址 CMake ...

最新文章

  1. html5 网页游戏 开源,HTML5 网页游戏,基于 WebGL 打造
  2. iOS Sprite Kit教程之真机测试以及场景的添加与展示
  3. java连接rabbitmq_没用过消息队列?一文带你体验RabbitMQ收发消息
  4. wdcp导出mysql_phpmyadmin导入导出mysql(只适用WDCP系统)
  5. 【CV秋季划】深度学习换脸算法视频更新
  6. Vue 进阶系列(一)之响应式原理及实现
  7. Android必学之数据适配器BaseAdapter
  8. ovs加dpdk出现EAL No free hugepages reported in hugepages-1048576kB
  9. mysql修改7tf8mb4_更改MySQL数据库的编码为utf8mb4
  10. Android 中进程的级别以及 Service 的优先级
  11. 一个请求里能有多个cookie吗_从一个男人对女人家人的态度里,能看出他有多爱对方吗?...
  12. 我的世界服务器地图软件制作教程,我的世界RPG地图制作教程 利用MC小助手进行制作...
  13. 大数据技术与实践实验报告总结_大数据平台搭建实验心得体会
  14. 带键盘计算机,怎么屏蔽笔记本自带键盘
  15. Codeforces Round #736 (Div. 2)
  16. c语言飞机源代码,C语言写的飞机源码
  17. 雷神五代笔记本U盘重装系统图文教程
  18. 2020年河南省计算机对口升学分数线,2020年河南省单招分数线出来了吗?
  19. 开关电源MOS管如何选择,参数是核心
  20. 前后端是如何交互的?

热门文章

  1. BAT批处理文件无法运行提示“/E /I /Y ‘XCOPY‘ 不是内部或外部命令,也不是可运行的程序或批处理文件”解决方法
  2. Linux 服务器配置信息查询方法,国产化申威服务器配置信息查看演示
  3. chrome 技巧篇-如何查看web元素绑定的监听事件
  4. 嵌入式C语言代码的调试技巧
  5. stm32换芯片编译
  6. Visual Studio 2013运行时卡顿 CPU占用超高的解决方法
  7. 第十周项目实践 哈夫曼树的建立哈夫曼编码
  8. 第7周实践项目2.2 求解报数问题
  9. Python基础04 运算
  10. linux文件需求管理,CaliberRM 需求管理系统