您的位置:首页 > 其它

【Kinect for Windows SDK MSDN文档翻译】之一

2013-08-22 20:56 1046 查看


Kinect for Windows SDK DOC

本章由cowboylym(酒劍仙采葡萄)编写,转载请注明出处。 

作者:酒劍仙采葡萄    邮箱: cowboylym@163.com   




Kinect for windows SDK 为我们在windows平台上开发Kinect应用程序提供了 工具和API。翻译它的技术文档一方面是巩固自己的所学,另一方面是方便自己以后再回过头来翻阅,顺便锻炼下自己的英语水平 作为一个优秀的程序员 有一个好的英语基础很重要的。 首先声明我的英语水平有限,在翻译中难免会有纰漏,请大家一定要及时指正。由于官方文档包含的方面比较多,而我主要对跟程序开发相关的部分着重进行翻译。环境搭建和Kinect硬件说明部分
我就略带而过了。 英语水平好的还是建议看原版文档。原文地址:http://msdn.microsoft.com/en-us/library/hh855347.aspx

人门(Getting Started)

一、系统要求(System Requirements

 支持的操作系统和架构

Windows7

Windows8

Windows Embedded Standard 7(嵌入式win7系统)

Windows Embedded Standard 8(嵌入式win8系统)

Windows 7 N or 7 KN 版需安装 Media Feature Pack

 

硬件要求

32位或者64位处理器

双核 2.66Hz 以上的处理器

USB 2.0总线

2GB的RAM

显卡支持DirectX 9,0c

一台Kinect for window 传感器

 

软件要求

软件开发环境vs2010 或者vs2012

.NETFramework 4或者4.5

 

语音识别的例子还需要

 MicrosoftSpeech Platform Software Development Kit (Version 11),
if you needto compile the samples.

MicrosoftSpeech Platform Runtime (Version 11), which is automaticallyinstalled as
part of the Kinect runtime setup, if you want to run the samplesonly.

 

Depth-D3D和DepthWithColor-D3D例子还需要

DirectXSoftware Development Kit, if you need to compile the samples.

DirectX End-UserRuntimes (June 2010) if you want to run the samples only.

编程指南(Programming Guide)

SDK包含以下内容

1、Kinect驱动程序

2、Kinect应用程序开发所需的技术文档

3、API文档

4、示例代码

 

 

 

一、Kinect for windowsArchitecture (SDK架构)

 

SDK提供了一个复杂的软件库和工具来帮助开发人员使用丰富的基于kinect的自然输入(对真实世界事件的响应)。Kinect和软件库与你的应用程序之间的交互如图1所示。



图1
 
SDK的组件内容如下图:



图2
这些组件包括:

1、  Kinect硬件:包括Kinect传感器、USB总线。

2、  Kinect驱动

3、  音频视频组件

4、  DirectXMedia Object(DMO)

5、  Win7标准API

 

二、Kinect传感器

Kinect传感器包括 1个摄像机、1个麦克风阵列和1个加速剂以及1个处理颜色、深度和骨骼数据的软件管线。


 

2.1 传感器组件和产品规格

组件:

        1个1280x960的RGB摄像头

        1个红外发射器和1个红外深度传感器

        1个麦克风阵列

        1个3条坐标轴(x,y,z)的加速度计



Kinect产品规格:

视角:垂直43°水平57°

垂直倾斜范围:±27°

帧数:30FPS

音频格式:16kHz,24位的单脉冲编码调制方式(PCM)

音频输入特性:1个24位模数转换(ADC)的麦克风阵列和Kinect固有信号的处理包括:回声消除和降噪

加速计特性:1个2G/4G/8G的加速度计 配置有2G的范围,拥有精确度1°的上限

 

2.2设置Kinect传感器

       步骤1:将传感器安装到一个稳定的平面上

       将Kinect放在一个稳定的平面上并且使用时不要受到撞击。

1)  不要将Kinect放在扬声器前面,不要放在一个振动的或者会制造噪音的表面上。

2)  避免让Kinect受到阳光的直射。

3)  在Kinect指定的操作温度(41~95℉ 5~35℃)下使用。如果超出了这个范围 请关闭Kinect并且将温度稳定在规定温度范围内,在你再一次使用这个传感器之前。

4)  不要在Kinect基座上倾斜它,手动倾斜Kinect会损坏传感器,Kinect倾斜角由软件控制。

步骤2:安装SDK 下载地址http://www.microsoft.com/en-us/kinectforwindows/Develop/Developer-Downloads.aspx

步骤3:插上Kinect传感器

1)  接上电源

2)  将Kinect的USB接口接上PC等待Windows识别

3)  所有驱动包括音频驱动将会被无缝加载

2.3 遍历并初始化Kinect

概括:

Kinect forwindows 驱动支持在一台电脑上使用多个Kinect传感器。API中包含了遍历Kinect的方法,所以我们可以决定在电脑上连接几台Kinect。获取一个指定的Kinect传感器名字并设置每个传感器的数据流特性。当找到一个已经连接的传感器时,我们需要让任意一个或者所有的数据流(颜色、深度和骨骼数据)使能,接着启动传感器产生数据流。

 

代码段:

遍历Kinect传感器

使用KinectSensor类来遍历连接到电脑的Kinect传感器。当你声明sensor成员时,静态的KinectSensors属性已经被你系统上的Kinect集合所填充。由于属性是静态的,所以Kinect集合在程序运行时一直是可用的。

private KinectSensor sensor;

foreach (var potentialSensor in KinectSensor.KinectSensors)
{
if (potentialSensor.Status == KinectStatus.Connected)
{
this.sensor = potentialSensor;
break;
}
}

循环遍历Kinect集合通过KinectStatus判断每个Kinect是否已经连接。一旦找到连接成功的Kinect,将其保存到sensor成员,那么你就可以在下面的代码中使用它。

 

数据流使能

当遍历完所有的传感器并找到一个成功连接的传感器时,下一步就是将输出的数据流使能。这里有几种类型的数据流。颜色、深度、骨骼和红外线。下面的例子将演示如何使能所有数据流。

if (this.sensor != null)
{
this.sensor.ColorStream.Enable(ColorImageFormat.RgbResolution640x480Fps30);
this.sensor.DepthStream.Enable(DepthImageFormat.Resolution640x480Fps30);
this.sensor.SkeletonStream.Enable();
this.sensor.ColorStream.Enable(ColorImageFormat.InfraredResolution640x480Fps30);
}

对于颜色数据:KinectSensor类包含ColorStream属性用于访问ColorImageStream类。调用Enable方法使Kinect通过初始化图像数据格式(帧数,分辨率)来产生颜色数据。每个有效数据都包含在ColorImageFormat枚举类型中。默认的值为RgbResolution640x480Fps30。这表示Kinect将输出一个分辨率为640x480,帧数为30帧的RGB数据。

若使用 InfraredResolution640x480Fps30 则输出红外数据

 

对于深度数据:KinectSensor类包含DepthStream属性用于访问 ColorImageStream 类。调用Enable方法使Kinect通过初始化图像数据格式(帧数,分辨率)来产生颜色数据。每个有效数据都包含在DepthImageFormat枚举类型中。默认的值为RgbResolution640x480

Fps30。这表示Kinect将输出一个分辨率为640x480,帧数为30帧的RGB数据。

 

对于骨骼数据:KinectSensor类包含一个SkeletonStream属性用来访问SkeletonStream类。调用Enable方法使Kinect产生骨骼数据。

 

启动Kinect

当你选择了一个成功连接的传感器,并初始化数据流之后,调用Start方法启动输出数据流。

if (this.sensor != null)
{
this.sensor.Start();
}


2.4在非开发人员的机器上运行Kinect应用程序

 

安装Kinect运行时库

Kinect应用程序的安装程序应该安装它的依赖项,包括Kinect运行时库的安装。Kinect运行时库安装程序将会安装Kinect驱动和Kinect运行时库。

 

Kinect运行时库安装程序放在SDK的\Redist 子目录下面,它是一个自行安装的可执行程序,安装所有需要的运行时软件。包括驱动,Kinect运行时库和语音识别运行时库。英文以外的其他语音模型,可以在它们各自的安装程序中找到。你应该根据自己的应用程序需要,附带安装其他的语音模型。

 

给最终用户提供指导

Kinect需要给根据KinectStatus枚举类型的提供的不同状态响应的给最终用户提供正确的提示信息。

 

你需要一台Kinect

当程序无法检测到Kinect时,UI界面就会提示如下信息



在你插上Kinect之前这条提示信息会一直显示。

 

插上Kinecct

当Windows检测到一个Kinect插上之后。将会出现如下提示信息



初始化时,windows会发现和列举出合适的驱动供Kinect初始化

 

Kinect准备完毕

将提示如下信息

 


 

这里有一张KinectSensorChooser 提供的最常见的状态信息列表

KinectStatus
Message
Details on hover over "Tell me more"
More Information
Disconnected (with IsRequired==true)
"Required"
"This application needs a Kinect for Windows sensor in order to function. Please plug one into the PC."
Details
Initializing
"Initializing…"
n/a
n/a
Connected
"All set!"
n/a
n/a
Disconnected (with IsRequired==false)
"Get the full experience by plugging in a Kinect for Windows sensor"
"This application will use a Kinect for Windows sensor if one is plugged into the PC."
Details
Connected (but the KinectSensor.Start method raised an IOException, which means another app is using it).
"This Kinect is being used by another application."
"This application needs a Kinect for Windows sensor in order to function. However, another application is using the Kinect."
Details
DeviceNotGenuine
"This sensor is not genuine!"
"This application needs a genuine Kinect for Windows sensor in order to function. Please plug one into the PC."
Details
DeviceNotSupported
"Kinect for Xbox 360 not supported."
"This application needs a Kinect for Windows sensor in order to function. Please plug one into the PC."
Details
InsufficientBandwidth
"Too many USB devices! Please unplug one or more."
"The Kinect needs the majority of the USB bandwidth of a USB Controller. If other devices are in contention for that bandwidth, the Kinect may not be able to function."
Details
NotReady or Error
"Oops, there is an error."
"The Kinect is plugged in, but an error has occurred."
Details
NotPowered
"Plug my power cord in!"
"The Kinect is plugged into the computer with its USB connection, but the power plug appears to be not powered."
Details
 

 

2.5在开发人员的机器上运行Kinect应用程序

当在开发者的机器上和在非开发者的机器上Kinect for Xbox360时kinectstatus工作的方法是不一样的。下面是Kinect在不同硬件上由初始化到成功连接过度时的状态变化。

Sensor Hardware
Kinect for Windows
Kinect for Xbox 360
Developer PC
Initializing -> Connected
Initializing -> Connected (with
debugger warnings)
End-user PC
Initializing -> Connected
Initializing -> DeviceNotSupported
在装有KinectSDK的开发者的机器上,开发者在开发过程中可以使用Kinect for Xbox360,这表示KinectStatus属性将返回正常的连接状态,如果你在调试程序使用的是Xbox360,将会出现类似下面的警告内容。

The Kinect plugged into your computer is for use on the Xbox 360.

  You may continue using your Kinect for Xbox 360 on your computer for development purposes.

  Microsoft does not guarantee full compatibility for Kinect for Windows applications

    and the Kinect for Xbox 360.

在最终用户的电脑上,windows版的Kinect是功能齐全的而在同一台电脑上,使用Xbox 360就会返回“设备不支持”的消息

 

对于上面所说的异常情况为用户提供必要的提示信息是非常重要的。如下

 


 

2.6 交互空间

Kinect的交互区域是在Kinect正前方的一片区域,是由红外线摄像头和彩色摄像头决定的前方的一片视野。如果光线不是太强也不是太暗,被跟踪到的物体反光不是太强烈,那你将会很好的跟踪到人体骨架。Kinect一般放在人前方与头部持平的位置,它可以被放在各种位置上。

 

交互空间有Kinect的摄像机的视野决定。为了提高交互的空间。可以使用Kinect内置的倾斜马达。这个倾斜马达支持±27°角调节。



我们可以通过调用 INuiSensor::NuiCameraElevationSetAngle (C++)或者KinectSensor.ElevationAngle (C#)来调节角度。

马达是为了调节罕见的角度而设计的,也许在你每次启动程序时会调节一下。经常反复的调节会降低马达寿命。

 

2.7 加速度计

Kinect传感器包含一个三个坐标轴的坐标系和2g的范围g取决于当前的重量加速度。它使得传感器可以反馈当前重力环境下的Kinect朝向。加速度计可以帮助Kinect检测当前是否处于一个不寻常的位置。它可以帮助SDK计算出平滑表面的数据。用来提供更加准确的增强现实场景中的3D投影。

 

加速度计拥有下限为1度的精确度。此外,精确度对于温度是敏感的。在正常工作温度下最多存在3度的偏差。偏差可以是正或者是负的。但是一个被给定的传感器总是展现出相同的偏差。如果需要这个偏差是可以矫正的,通过比对加速度计的垂直坐标(y轴)和检测到的光滑平面的深度数据。

 

阅读并理解加速度计数据

Kinect SDK为读取加速度计数据提供本地 INuiSensor.NuiAccelerometerGetCurrentReading和托管的 KinectSensor.AccelerometerGetCurrentReading方法。Kinect
SDK不提供加速度计改变的事件提示。加速度计返回一个3D矢量沿着重力的方向。这个3D矢量以Vector4(x,y,z,w)的形式返回。w总是设置为0.0。传感器在坐标系的中心原点。该坐标系是一个右手坐标系。z轴的正方向为传感器的朝向。矢量以重力加速(g或者 9.81m/s^2)的为单位。传感器默认的旋转由(x,y,z,w)矢量 表示。他的值为(0,-1.0,0,0)

 


加速度计的数据和数据记录

当记录加速度计数据流时,加速度计的读数在每一帧更新时都会被读取并且被记录下来。播放时,加速度计的读数由最新被索引到帧上返回。

To be continued…

                                                                                                                   ——  貳零壹叁 年 捌 月 貳拾貳 日

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Kinect