Kinect for Windows SDK开发入门(九):骨骼追踪进阶 下
- 格式:doc
- 大小:840.00 KB
- 文档页数:14
MS SDK v1.0:Kinect for Windows SDK同时提供了native code 和managed code的API供开发者使用,SDK 的更新可以在网站/b/kinectforwindows/处获得;编写基于Kinect的应用程序本质上通编写其他Windows一样,只不过Kinect的SDK提供了一些支持Kinect感应器的特征API而已,其中包括color images, depth images, audio input 和skeletal data;下载安装Kinect for Windows SDK,该SDK中包括:·实现基于Kinect的应用程序的驱动和技术文档·编写managed和unmanaged代码的API参考手册和文档,API在不同的硬件环境下都能较高效的提供多媒体数据流;·展示Kinect功能的样例,其中的sample browser集中管理了这些样例;·将所所提供的样例分解成不同的问题供用户学习解决的How Tos;在read-me中可以找到关于安装SDK的细节提示以及最新的bug反馈;以下是Kinect for Windows SDK能够实现的一些特性示例:·通过骨架追踪系统识别并追踪1-2个视野范围内的活动用户;·通过能获取彩色图像数据流和深度图像数据流的XYZ-depth camera来确定物体到感应器之间的距离;·通过四元麦克风阵列捕获消除了噪声和回声的声音信息或者在捕获声音的同时使用beam finding来确定声源位置;·通过整合了Microsoft Speech recognition API的声音捕获系统进行语音识别;Kinect for Xbox 360和Kinect for Windows有一些特性差别,主要在于前者有专门的性能优化;此外,此SDK并不能用于开发可移植到Xbox 360的游戏,基于Xbox 360 与Windows 平台的较大差异,建议使用XDK软硬件系统来开发Xbox 360应用程序;使用Kinect for Windows SDK开发程序所要求的软硬件环境:操作系统:·Windows 7 or Windows Embedded Standard 7·只能在本地环境中开发运行此SDK支持的程序,因为Kinect的驱动不能安装在虚拟机中;硬件环境:·电脑最低配置要求:·32位(x86)或64位(x64)处理器·双核,2.66GHz或者更快的处理器·一个供Kinect Sensor使用的USB2.0总线端口·2GB内存·支持DirectX 9.0c的显卡·一个Kinect Sensor软件环境:·MS VS2010 Express 或其它VS2010版本·.NET Framework 4(VS 2010集成安装)此外,运行C#语音样例需要如下软件环境要求:·Microsoft Speech Platform - Runtime(Version 11),此运行时环境要求在Kinect运行时安装时被自动安装;·Microsof Speech Platform - Software Development Kit(SDK)(Version 11)下图显示了Kinect Sensor的感知范围,其中的default range对Xbox 360和Kinect for Windows 都适用,而near range仅对后者适用:上图是在NUI_IMAGE_STREAM_FLAG_DISTINCT_OVERFLOW_DEPTH_V ALUES标识在打开的情况下API返回的,当标识关闭时,除了normal range内的值返回正常以外,其余都返回0;另外,在default模式下才可正常追踪人体骨架的20个关节点,在near模式下,无法完整追踪20个关节点。
微软正式发布Kinect for Windows及SDK10月9日,微软正式在中国发布了Windows版Kinect感应器。
从现在起,企业可以充分利用Kinect 体感功能,为中国客户开发和部署商业解决方案。
同期,微软还发布了最新版本的Kinect for Windows软件开发工具包(SDK),以及供全球下载的运行时间。
Kinect for Windows平台支持企业和开发者利用PC及其它Windows终端使用Kinect,以开发更多应用给用户带来更多创新体验。
Kinect for Windows平台包括Kinect for Windows感应器,Kinect for Windows 开发工具包(SDK),以及商用许可。
Kinect for Windows能够帮助用户通过手势和语音与计算机进行自然交互,从而向各行业领导厂商提供全新的交互工具以改变其客户和员工的人机交互方式。
Kinect for Windows的发布意味着用户不再局限于使用键盘、鼠标或触控屏幕进行计算机操作,使用者只需给出口令即可完成应用命令操作。
如果他们想要在屏幕上移动对象,只需通过手势即可完成。
这一创新性的自然界面人机交互开启了全新的计算应用体验类别,其中包括:• 零售行业——与零售商店和公共场所数字标牌信息亭进行远程互动;• 医疗行业——充分利用语音和手势功能进行远程诊疗,以确保无菌环境和免控制要求;• 利用Kinect for Windows的人体跟踪功能来开发培训和模拟工具,如物理疗法应用、员工学习模块或体育健身应用;• 教育领域——在教室中,对数据进行可视化和操纵。
Kinect for Windows感应器中国地区建议零售价格为人民币1930元,可在京东商城网站购买。
Kinect for Windows感应器提供了Windows开发者所要求的功能和特性,其中包括:用户可在无需接触键盘或屏幕的情况下进行人机交互(例如在会议室、手术室或办公室)的近距离功能。
前7篇文件我们介绍了Kinect SDK中各种传感器的各种基本知识,我们用实验的方式演示了这些基本对象和方法的如何使用,这些都是Kinect开发最基本的知识。
了解了这些基本知识后,就可以开发出一个基于Kinect的简单程序了。
但是这些离开发出一个好的基于Kinect的应用程序还有一段距离。
后面的文章中,将会结合Kinect SDK介绍WPF以及其它第三方工具,类库来建立一个以Kinect 为驱动的有较好用户体验的程序。
我们将利用之前讲到的知识来进行下面一些比较复杂的话题。
Kinect传感器核心只是发射红外线,并探测红外光反射,从而可以计算出视场范围内每一个像素的深度值。
从深度数据中最先提取出来的是物体主体和形状,以及每一个像素点的游戏者索引信息。
然后用这些形状信息来匹配人体的各个部分,最后计算匹配出来的各个关节在人体中的位置。
这就是我们之前介绍过的骨骼追踪。
红外影像和深度数据对于Kinect系统来说很重要,它是Kinect的核心,在Kinect系统中其重要性仅次于骨骼追踪。
事实上,这些数据相当于一个输入终端。
随着Kinect或者其他深度摄像机的流行和普及。
开发者可以不用关注原始的深度影像数据,他们变得不重要或者只是作为获取其他数据的一个基础数据而已。
我们现在就处在这个阶段,Kinect SDK并没有提供给开发者访问原始红外影像数据流的接口,但是其它第三方的SDK可以这么做。
可能大多数开发者不会使用原始的深度数据,用到的只是Kinect处理好了的骨骼数据。
但是,一旦姿势和手势识别整合到Kinect SDK并成为其一部分时,可能开发者甚至不用接触到骨骼数据了。
希望能够早日实现这种集成,因为它代表这Kinect作为一种技术的走向成熟。
本篇文章和下篇文章仍将讨论骨骼追踪,但是采用不同的方法来处理骨骼数据。
我们将Kinect作为一个如同鼠标,键盘或者触摸屏那样的一个最基本的输入设备。
微软当初推出Kinect for Xbox的口号是“你就是控制器”,从技术方面讲,就是“你就是输入设备”。
[译]Kinect for Windows SDK开发入门(六):骨骼追踪基础上Kinect产生的景深数据作用有限,要利用Kinect创建真正意义上交互,有趣和难忘的应用,还需要除了深度数据之外的其他数据。
这就是骨骼追踪技术的初衷,骨骼追踪技术通过处理景深数据来建立人体各个关节的坐标,骨骼追踪能够确定人体的各个部分,如那部分是手,头部,以及身体。
骨骼追踪产生X,Y,Z数据来确定这些骨骼点。
在上文中,我们讨论了景深图像处理的一些技术。
骨骼追踪系统采用的景深图像处理技术使用更复杂的算法如矩阵变换,机器学习及其他方式来确定骨骼点的坐标。
本文首先用一个例子展示骨骼追踪系统涉及的主要对象,然后在此基础上详细讨论骨骼追踪中所涉及的对象模型。
1. 获取骨骼数据本节将会创建一个应用来将获取到的骨骼数据绘制到UI界面上来。
在开始编码前,首先来看看一些基本的对象以及如何从这些对象中如何获取骨骼数据。
在进行数据处理之前了解数据的格式也很有必要。
这个例子很简单明了,只需要骨骼数据对象然后将获取到的数据绘制出来。
彩色影像数据,景深数据分别来自ColorImageSteam和DepthImageStream,同样地,骨骼数据来自SkeletonStream。
访问骨骼数据和访问彩色影像数据、景深数据一样,也有事件模式和“拉”模式两种方式。
在本例中我们采用基于事件的方式,因为这种方式简单,代码量少,并且是一种很普通基本的方法。
KinectSensor对象有一个名为SkeletonFrameReady事件。
当SkeletonStream 中有新的骨骼数据产生时就会触发该事件。
通过AllFramesReady事件也可以获取骨骼数据。
在下一节中,我们将会详细讨论骨骼追踪对象模型,现在我们只展示如何从SkeletonStream流中获取骨骼数据。
SkeletonStream产生的每一帧数据都是一个骨骼对象集合。
每一个骨骼对象包含有描述骨骼位置以及骨骼关节的数据。
• 149•针对运动功能障碍患者的康复训练需求,设计一种基于Kinect 的康复训练辅助系统。
该系统利用Kinect 骨骼追踪技术,获取人体骨骼节点坐标,计算骨骼向量,提取动作特征,并结合DTW (Dy-namic Time Warping )算法,将患者训练动作与标准动作进行匹配,根据匹配结果对患者动作进行评估和矫正。
同时设计基于SSM (Spring 、SpringMVC 、MyBatis )框架的训练数据管理系统,对患者训练数据进行整理分析,给出可视化展示,便于跟踪患者训练状况,使康复训练更加科学高效。
随着人口老龄化,高血压、脑卒中的患病率日益增长,运动功能障碍的人数逐年上升。
医学研究表明,科学的康复训练是治疗的关键环节之一。
在医疗康复领域,传统的康复训练需要穿戴复杂的设备,并且专业的康复医师较少,整体康复医疗资源比较缺乏。
随着科技的发展,人机交互技术步入人们的视线。
作为人机交互领域的研究热点,体感交互技术开发出的康复训练系统所需设备廉价、小型轻便,能实现康复训练的家庭化,有效弥补了传统康复训练方法的缺陷。
因此,本文设计一套基于Kinect 的康复训练辅助系统,为广大患者在社区和家庭更有效地得到康复治疗提供帮助。
1 系统总体结构设计系统以Kinect 骨骼追踪技术为基础,主要由四个模块组成:标准动作生成模块、患者动作匹配模块、训练评估与矫正模块和训练数据管理模块。
图1给出了系统结构设计图。
图1 系统结构设计图(1)标准动作生成模块。
由多人录入康复医师设计的标准训练动作,利用Kinect 采集动作的骨骼数据,进行特征提取,将多人的动作特征整合后,得到该标准动作的模板特征并存入数据库。
(2)患者动作匹配模块。
通过读取患者的实时骨骼节点数据,提取动作特征,获得患者训练动作序列,再用 DTW 算法计算其与标准动作库中样本序列的匹配程度,得到动作匹配结果。
(3)训练评估与矫正模块。
系统根据患者所有动作的匹配结果计算训练得分,给出动作评级;系统会将患者动作不规范的地方标红并圈出,以达到动作矫正的效果。
Kinect核心技术之骨架追踪技术Kinect是微软最近开发出来的一个颠覆目前其他传感器的体感传感器,它利用动态捕捉,影像识别,麦克风输入,语音识别,社群互动,追焦技术以及骨架追踪技术。
将人当做遥控器,让玩家体验“免遥控的娱乐”通过自己的四肢运动来进行与其他人的交流。
作为一个新兴的技术,kinect有着较好的前景,它将可能会被利用在各个领域中。
游戏,医学,生产,科研等等。
1、研究的背景和意义“You are the controller!”是否觉得不可以思议呢?习惯了传统的传感器的我们,离开了这些设备,操作系统是基本不可能的。
但是对于那些游戏设计师和开发商的需求来说,仅仅着一些是不够的,沉浸式的游戏才是他们的最终目标。
于是Kinect就这样应运而生。
Kinect利用了体感传感技术,创造出一种新的人机对话模式,打破持续了20多年的人机对话模式。
也许,在不久的将来,这个传统的人机对话模式,将会淡出我们的视线。
基于Kinect所创造出来的游戏,不再是人坐在电脑桌前动动手指就能完成的游戏了。
而是人要跟所操作的人物一样进行相同的动作来进行游戏。
这样完全可以避免那些长期进行游戏的玩家们,缺乏运动,而且可以得到人机互动的乐趣。
同时Kinect的骨架追踪技术可以初步的解决传统游戏中关于账号安全的问题。
他不再是局限于账号密码那种简单的区别每个人的不同。
而是利用一种近似于人脑的方式来解决问题,让Kinect可以分辨出每个人的不同。
这样可以不必进行无限次的研究可能性,确定一个人的身份,还可以将人的动作捕捉,进行分析,反馈。
利用在各个领域将会取得很大的方便。
2、基于Kinect的骨架跟踪2.1 研究内容骨架追踪技术是Kinect的核心技术。
这个技术可以让Kinect去更好的捕捉人体的动作,并且可以识别人的身份问题。
而骨架追踪技术的核心在于利用红外线传感器通过黑白光谱的方式来识别环境内容。
黑与白分别对应着无穷远和无穷近。
[译]Kinect for Windows SDK开发入门(十三):语音识别下上一篇文章介绍了Kinect中语音识别的基本概念,以及一些语音处理方面的术语。
在此基础上使用Kinect麦克风阵列来进行音频录制的例子说明了Kinect中音频处理的核心对象及其配置。
本文将继续介绍Kinect中的语音识别,并以两个小例子来展示语音识别中的方向识别和语音命令识别。
1. 使用定向麦克风进行波速追踪(Beam Tracking for a Directional Microphone)可以使用这4个麦克风来模拟定向麦克风产生的效果,这个过程称之为波束追踪(beam tracking),为此我们新建一个WPF项目,过程如下:1. 创建一个名为KinectFindAudioDirection的WPF项目。
2. 添加对Microsoft.Kinect.dll和Microsoft.Speech.dll的引用。
3. 将主窗体的名称改为“Find Audio Direction”4. 在主窗体中绘制一个垂直的细长矩形。
界面上的细长矩形用来指示某一时刻探测到的说话者的语音方向。
矩形有一个旋转变换,在垂直轴上左右摆动,以表示声音的不同来源方向。
前端页面代码:界面。
后台逻辑代码和之前的例子大部分都是相同的。
首先实例化一个KinectAudioSource赋值给本身。
将BeamAngleMode设置为Adaptive,使得能够自动追踪说话者的声音。
我们需要编写KinectAudioSource对象的BeamChanged事件对应的处理方法。
当用户的说话时,位置发生变化时就会触发该事件。
我们需要创建一个名为BeamAngle的属性,使得矩形的RotateTransform可以绑定这个属性。
public partial class MainWindow : Window, INotifyPropertyChanged{public MainWindow(){InitializeComponent();this.DataContext = this;this.Loaded += delegate { ListenForBeamChanges(); };}private KinectAudioSource CreateAudioSource(){var source = KinectSensor.KinectSensors[0].AudioSource;source.NoiseSuppression = true;source.AutomaticGainControlEnabled = true;source.BeamAngleMode = BeamAngleMode.Adaptive;return source;}private void ListenForBeamChanges(){KinectSensor.KinectSensors[0].Start();var audioSource = CreateAudioSource();audioSource.BeamAngleChanged += audioSource_BeamAngleChanged;audioSource.Start();}public event PropertyChangedEventHandler PropertyChanged;private void OnPropertyChanged(string propName){if (PropertyChanged != null)PropertyChanged(this, new PropertyChangedEventArgs(propName));}private double _beamAngle;public double BeamAngle{get { return _beamAngle; }set{_beamAngle = value;OnPropertyChanged("BeamAngle");以上代码中,还需要对BeamChanged事件编写对应的处理方法。
[译]Kinect for Windows SDK开发入门(三):基础知识下1. 性能改进上文的代码中,对于每一个彩色图像帧,都会创建一个新的Bitmap对象。
由于Kinect视频摄像头默认采集频率为每秒30幅,所以应用程序每秒会创建30个bitmap对象,产生30次的Bitmap内存创建,对象初始化,填充像素数据等操作。
这些对象很快就会变成垃圾等待垃圾回收器进行回收。
对数据量小的程序来说可能影响不是很明显,但当数据量很大时,其缺点就会显现出来。
改进方法是使用WriteableBitmap对象。
它位于System.Windows.Media.Imaging命名空间下面,该对象被用来处理需要频繁更新的像素数据。
当创建WriteableBitmap时,应用程序需要指定它的高度,宽度以及格式,以使得能够一次性为WriteableBitmap 创建好内存,以后只需根据需要更新像素即可。
使用WriteableBitmap代码改动地方很小。
下面的代码中,首先定义三个新的成员变量,一个是实际的WriteableBitmap对象,另外两个用来更新像素数据。
每一幅图像的大小都是不变的,因此在创建WriteableBitmap时只需计算一次即可。
InitializeKinect方法中加粗的部分是更改的代码。
创建WriteableBitmap对象,准备接收像素数据,图像的范围同时也计算了。
在初始化WriteableBitmap的时候,同时也绑定了UI元素(名为ColorImageElement的Image对象)。
此时WriteableBitmap中没有像素数据,所以UI上是空的。
还需要进行的一处改动是,对ColorFrameReady事件响应的代码。
如下图。
首先删除之前创建Bitmap那部分的代码。
调用WriteableBitmap对象的WritePixels方法来更新图像。
方法使用图像的矩形范围,代码像素数据的数组,图像的Stride,以及偏移(offset).偏移量通常设置为0。
Kinect for Windows SDK开发初体验(一)忘记本文作者叫什么了,很是抱歉,希望大伙知道的提醒一下,再次感谢原作者!环境配置万众期待的Kinect for Windows SDK终于在广大开发者的千呼万唤中发布了beta版,作为历史上销售最快的消费电子产品,早就有无数人想将其用于其他领域了。
微软虽然在硬件接口上制造了一点小障碍,但并没有对Kinect的输出做任何加密。
于是,基于Kinect的各种应用层出不穷,也有开源社区提供了针对Kinect的USB驱动程序,比如OpenKinect等。
微软从谏如流,推出了官方版的Kinect for Windows SDK,终于让广大开发者可以名正言顺地使用Kinect SDK了。
我希望能够在第一时间为国内开发者提供Kinect开发相关的介绍,根据微软官方提供的指南,从浅入深,将自己摸索Kinect SDK 的过程记录下来。
安装环境首先来说,Kinect for Windows SDK的下载地址:/en-us/um/redmond/projects/kinectsdk/download.aspxKinect SDK目前只支持Windows 7,分为x86和x64两个版本。
开发工具方面还需要.NET Framework 4.0和Visual Studio 2010 (最低Express版本)的支持。
Kinect SDK的视频开发教程:/Series/KinectSDKQuickstarts?sort=recent#tab_sortBy_recentKinect SDK的开发指南:/en-us/um/redmond/projects/kinectsdk/guides.aspxKinect SDK的官方论坛:/Forums/en-US/kinectsdk/threads硬件设备的需求是:Kinect for Xbox 360 sensor和Xbox 360 Kinect AC Adapter/ Power Supply。
[译]Kinect for Windows SDK开发入门(九):骨骼追踪进阶下1. 基于景深数据的用户交互到目前为止我们只用了骨骼数据中关节点的X,Y值。
然而Kinect产生的关节点数据除了X,Y值外还有一个深度值。
基于Kinect 的应用程序应该利用好这个深度值。
下面的部分将会介绍如何在Kinect应用程序中使用深度值。
除了使用WPF的3D特性外,在布局系统中可以根据深度值来设定可视化元素的尺寸大小来达到某种程序的立体效果。
下面的例子使用Canvas.ZIndex属性来设置元素的层次,手动设置控件的大小并使用ScaleTransform来根据深度值的改变来进行缩放。
用户界面包括一些圆形,每一个圆代表一定的深度。
应用程序跟踪用户的手部关节点,以手形图标显示,图标会根据用户手部关节点的深度值来进行缩放,用户离Kinect越近,手形图表越大,反之越小。
创建一个新的WPF项目,主界面的XAML如下。
主要的布局容器为Cnavas容器。
它包含5个Ellipses及对应的TextBlock控件,TextBlock用来对圆形进行说明。
这几个圆形随机分布在屏幕上,但是圆形的Canvas.ZIndex是确定的。
Canvas容器也包含了两个图像控件,用来代表两只手。
每一个手部图标都定义了一个ScaleTransform对象。
手形图标是和右手方向一致的,将ScaleTransform 的ScaleX设置为-1可以将其反转,看起来像左手。
<Ellipse x:Name="Target4" Fill="Purple" Height="150" Width="150" Canvas.Left="732"Canvas.Top="320" Canvas.ZIndex="940" /><TextBlock Text="4" Canvas.Left="840" Canvas.Top="372" Panel.ZIndex="940"Style="{StaticResource TargetLabel}" /><Ellipse x:Name="Target5" Fill="Green" Height="120" Width="120" Canvas.Left="880"Canvas.Top="592" Canvas.ZIndex="840" /><TextBlock Text="5" Canvas.Left="908" Canvas.Top="590" Panel.ZIndex="840"Style="{StaticResource TargetLabel}" /><Ellipse x:Name="Target6" Fill="Blue" Height="100" Width="100" Canvas.Left="352"Canvas.Top="544" Canvas.ZIndex="740" /><TextBlock Text="6" Canvas.Left="368" Canvas.Top="582" Panel.ZIndex="740"Style="{StaticResource TargetLabel}" /><Ellipse x:Name="Target7" Fill="Red" Height="85" Width="85" Canvas.Left="378"Canvas.Top="192" Canvas.ZIndex="640" /><TextBlock Text="7" Canvas.Left="422" Canvas.Top="226" Panel.ZIndex="640"Style="{StaticResource TargetLabel}" /><Image x:Name="LeftHandElement" Source="Images/hand.png" Width="80" Height="80"RenderTransformOrigin="0.5,0.5"><Image.RenderTransform><ScaleTransform x:Name="LeftHandScaleTransform" ScaleX="1" CenterY="-1" /></Image.RenderTransform></Image><Image x:Name="RightHandElement" Source="Images/hand.png" Width="80" Height="80"RenderTransformOrigin="0.5,0.5"><Image.RenderTransform><ScaleTransform x:Name="RightHandScaleTransform" CenterY="1" ScaleX="1" /></Image.RenderTransform></Image></Canvas></Grid></Viewbox></Window不同颜色的圆形代表不同的深度,例如名为Target3的元素代表距离为3英尺。
Target3的长宽比Target7要大,这简单的通过缩放可以实现。
在我们的实例程序中,我们将其大小进行硬编码,实际的程序中,应该根据特定要求可以进行缩放。
Canvas容器会根据子元素的Canvas.ZIndex的值对元素在垂直于计算机屏幕的方向上进行排列,例如最上面的元素,其Canvas.ZIndex最大。
如果两个元素有相同的ZIndex值,那么会根据其在XAML中声明的顺序进行显示,在XAML中,后面声明的元素在之前声明的元素的前面。
对于Canvas的所有子元素,ZIndex值越大,离屏幕越近,越小离屏幕越远。
将深度值取反刚好能达到想要的效果。
这意味这我们不能直接使用深度值来给ZIndex来赋值,而要对它进行一点转换。
Kinect能够产生的最大深度值为13.4英尺,相应的,我们将Canvas.Zindex的取值范围设置为0-1340,将深度值乘以100能获得更好的精度。
因此Target5的Canvas.ZIndex设置为840(13.5-5=8.4*100=840)。
XAML文件中,包含两个名为DebugLeftHand和DebugRightHand的TextBlocks控件。
这两个控件用来显示两只手的关节点数据的深度值。
因为调试Kinect程序比较麻烦,这个值是用来调试程序的。
下面的代码用来处理骨骼数据。
SkeletonFrameReady事件处理代码除了TrackHand方法之外和之前的例子没有区别。
TrackHand 方法对手形图标使用深度值进行缩放。
方法将手所在点的坐标转换到UI界面上后,使用Canvas.SetLeft和Canvas.SetTop方法进行赋值。
Cnavas.ZIndex的使用前面讨论的计算方法。
设置好Canvas.ZIndex对于可视化元素的布局已经足够,但是不能够根据深度视觉效果对物体进行缩放。
对于Kinect应用程序,Z值其他输入设备不能提供的,如果没有根据节点深度数据进行的缩放,那么这以独特的Z值就浪费了。
缩放比例可能需要测试以后才能确定下来。
如果想要达到最好的用户体验效果。
手形图标的大小应该和用户手的实际大小一致,目前从Kinect数据不能直接获取到用户手的大小信息。
有一种方法时让用户戴上类似感应手套这一类产品以提供另外一些额外的信息,这样可以产生更加自然的交互体验。
private void KinectDevice_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e){using (SkeletonFrame frame = e.OpenSkeletonFrame()){if (frame != null){frame.CopySkeletonDataTo(this.frameSkeletons);Skeleton skeleton = GetPrimarySkeleton(this.frameSkeletons);if (skeleton != null){TrackHand(skeleton.Joints[JointType.HandLeft], LeftHandElement, LeftHandScaleTransform, LayoutRoot, true);TrackHand(skeleton.Joints[JointType.HandRight], RightHandElement, RightHandScaleTransform, LayoutRoot, false);}}}}private void TrackHand(Joint hand, FrameworkElement cursorElement, ScaleTransform cursorScale,FrameworkElement container, bool isLeft){if (hand.TrackingState != JointTrackingState.NotTracked){double z = hand.Position.Z*FeetPerMeters;cursorElement.Visibility = System.Windows.Visibility.Visible;Point cursorCenter = new Point(cursorElement.ActualWidth / 2.0, cursorElement.ActualHeight / 2.0);Point jointPoint = GetJointPoint(this.KinectDevice, hand, container.RenderSize, cursorCenter);Canvas.SetLeft(cursorElement, jointPoint.X);Canvas.SetTop(cursorElement, jointPoint.Y);编译并运行程序,将手距Kinect不同距离,界面上的手形图标会随着距离的大小进行缩放;同时界面上用于调试的信息也在变化,还可以注意到,随着远近的不同,参考深度标注图案,手形图标在界面上的深度值也会相应的发生变化,有时候在图标在某些标签的前面,有时候在某些标签后面。