OpenNI体感应用开发实战
上QQ阅读APP看书,第一时间看更新

第2章 Xtion硬件设备

体感作为一个新兴的技术,其发展过程中融合了多种技术,但是这些技术的基础,都是建立在体感设备之上的,书中给读者介绍的Xtion设备就是其中之一,Xtion其主要功能是获取所需空间的深度数据,并在此基础上集合了彩色数据,声音数据功能,从而使得体感开发更加多元化,本章介绍的这些概念中,有些是Xtion硬件设备的介绍,比如“设备规格”、“感应器架构”,而有些则是Xtion设备的一些工作原理,比如“光编码技术”、“深度分析”、“遮蔽效果”。

这些概念之间的联系比较紧密,并且对开发者后续的体感开发有很大的帮助,读者可以选择多了解一些这方面的概念。

2.1 Xtion设备简介

Xtion设备的核心是由红外线激光发射器、红外线激光接收器、处理芯片这三个部分组成。除此之外还会有一些附加的功能设备,比如麦克风以及RGB摄像头。

2.1.1 Xtion设备的类型

目前来说,Xtion设备分为两类,分别为ASUS Xtion Pro和ASUS Xtion Pro Live,如图2-1和图2-2所示。图2-1中的ASUS Xtion Pro即仅包含最基本的三项功能的体感设备,图左侧的镜头为红外线激光发射器,右侧的镜头为红外线激光接收器,处理芯片(ps1080)在机体之中。

图2-1 ASUS Xtion Pro(仅有深度感应器)

图2-2中的ASUS Xtion Pro Live则额外包含一个红外线深度摄影机和一个麦克风设备,设备右侧偏中间的镜头即是RGB摄像头,设备两边的孔状区域则是麦克风。

图2-2 ASUS Xtion Pro Live(具备深度感应器、彩色影像感应器、立体麦克风)

2.1.2 Xtion设备的功能

Xtion体感设备最基本的功能是获取空间深度数据,并计算出其余数据,比如深度影像、人物影像、人物骨架等,图2-3所演示的就是通过Xtion设备在获取原始深度数据之后,进一步计算得到骨架图的效果。

图2-3 Xtion设备获取的人体骨架图

在ASUS Xtion Pro Live中,设备还可以附加获取声音信息和彩色影像,以用于摄像、彩色图识别、语音识别、语音控制等,这些信息的加入,可以使得体感操控更加人性化。

2.1.3 Xtion设备的规格

在基于Xtion设备的体感开发中,了解Xtion设备的规格对开发者来说起着最为基础的作用,以Xtion Pro Live为样例来详细了解Xtion设备的规格,如表2-1所示。

表2-1 Xtion设备的规格

2.2 Xtion设备的优势

就目前情况来看,一部分开发者在使用OpenNI SDK进行体感相关开发的过程中,以微软的Kinect(for Xbox 360)设备为主,但实际上,OpenNI并不是原生支援Microsoft Kinect的,在OpenNI环境下使用Kinect,并不能使用官方驱动程序,而必须使用修改过的驱动程序,这一点比之于ASUS的Xtion感应器来说,Xtion才是真正对应OpenNI的设备,它不需要特殊版本的驱动程序,可以直接使用OpenNI的公版驱动程序。本书中所使用的体感设备即是Xtion,这里也为读者来细数一下Xtion和Kinect之间的区别。

2.2.1 Xtion和Kinect的区别

1.体积轻便

相比于Kinect设备,Xtion设备体积上小了不少,相对的重量上也轻了不少,便于携带、移动、放置。图2-4是两款设备的对比图片,可以明显看出Xtion设备比Kinect设备体积更小,重量更轻。

图2-4 Xtion与Kinect比对

2.供电便捷

Xtion设备采用的是USB供电,而Kinect设备则需要额外供电,因此在使用Xtion设备时只需要插入USB接口,即可直接使用,而Kinect设备则需要额外的供电器进行供电。当然该区别的原因在于Xtion设备上没有可以上下调控角度的马达,所以Xtion设备的耗电量相对低了不少,只需要通过USB供电就可以驱动设备。而Kinect设备上有一个上下调整角度的马达,使得Kinect必须通过外接电源的方式才能正常使用,这一点在使用时就没有Xtion设备方便,当然由于Xtion设备没有马达,所以要调整角度,就必须手动去调整。不过Xtion设备基本设计上是能够无段式上下调整倾角,可调整范围也比Kinect的电机调整范围稍大。

3.驱动支持

从体感开发的角度来看,读者应该更加重视两款设备在感应器上面的差异,不过实际上这两者在硬件上的配置大同小异。在彩色感应器和深度感应器方面,Xtion设备和Kinect设备所使用的都是以色列PrimeSence公司的PS1080芯片,所以这一点上,两者的功能实际上基本是相同的。

不过在声音部分,Xtion设备和Kinect设备就有区别了,相对来说Kinect设备的四单元麦克风阵列更为优秀,然而可惜的是目前的驱动程序是无法正确地通过OpenNI来获取Kinect的声音资料的,所以虽然Kinect有比较好的声音硬件,但是目前还没有办法使用。同样的情况还有Kinect设备的马达,虽然Kinect的马达是可控制的,但是目前还没有办法通过开放的软件来控制它。

Xtion设备这点比较好,开发者是可以通过OpenNI及驱动程序获取到声音信息的。所以在完整体验性上面,Xtion设备反而有着较为完整的功能(尤其是声音)。

4.软件开发包(SDK)支持

相对于上面这些区别来说,Xtion Pro/Xtion Pro Live比之于Kinect目前最大的优势就是可以直接由OpenNI来支援,所以驱动程序的支援更加完整、快捷,而Kinect其最本源还是应用于Xbox360,所以针对基于Windows和Linux系统的体感开发来说,更多地会使用OpenNI SDK,因此Xtion无疑是更好的选择。

2.2.2 硬件设备的软件支持

通常以Xtion硬件设备为基础的体感应用开发所使用的软件开发包名为OpenNI,本质上作为一种API(Application Programming Interface,应用程序编程接口),OpenNI搭建了以下两方面的通信桥梁:

·视觉和音频传感器(包括分析周围环境的设备);

·视觉和音频感知中间件(用于实时的记录音频和视觉分析的数据并理解它们的软件组件)。

OpenNI可以将人体的空间深度信息从背景中剥离出来,并且演化出更丰富的人体空间位置信息,让抽象的视觉信息转化为具体的数字信息,从而使得计算机以及开发者可以去识别并使用这些信息。除了支持体感开发最基础的深度信息之外,OpenNI还包含了对常用彩色图像已经声音信息的支持,这样开发者的体感应用开发之路就会更加的丰富多元。

实际上对于体感开发者来说,除了OpenNI之外,Kinect也有一个应用于Windows系统上的SDK,这两者所对应的硬件设备的区别本章之前内容也有所涉及。在做体感应用开发的时候,除了硬件上的区别,这两者软件开发包上的区别一定程度也影响着体感功能的开发体验,这里介绍一下这两者软件开发包之间的异同。

1.平台支持

在平台支持方面,作为开放式软件OpenNI的多平台支持要明显比Microsoft Kinect for Windows SDK丰富,而Kinect仅仅只能用于Windows 7及以后的平台系统,这点难免让开发者有点遗憾。OpenNI在跨平台上几乎支持目前所有的主流系统Window、Mac OS X、Linux、Android等,在目前便携式设备大放异彩的当下,多平台支持的OpenNI无疑会在这些方面有着更进一步的优势。

2.开发语言支持

作为一款软件开发包,多语言的支持也在一定程度上影响着相应设备的使用广泛程度。OpenNI以C语言开发为主,同时还支持C++、.NET、Java这些语言。Microsoft Kinect for Windows SDK相应地支持C++/C#/Visual Basic,实际上这两者的语言支持上并无太大区别,仅在应用于Android平台时产生区别。OpenNI由于其多平台性,会支持Java开发。

3.支持硬件

前面提到过,Xtion设备可以完全支持OpenNI,但是OpenNI并非只支持Xtion设备,实际上OpenNI也可以一定程度地支持Kinect,以及一些使用OpenNI硬件协议的产品。这一点上Microsoft Kinect for Windows SDK则仅仅支持Kinect。

4.功能区别

实际上,作为一名体感开发者,最为看重的还是这两者开发包之间的功能上的差异。

·从支援感应器角度来看,OpenNI支持的感应器包括3D深度影像、彩色影像、红外线影像、声音。相应的Microsoft Kinect for Windows SDK支持的感应器少了一个红外线影像,因此从这一点看这两者并无太大差异。

·从功能上看,这两者在很多方面并无特别大的差异,但是还是存在不同之处。从追踪人数来看,OpenNI并没有人数限制,而Kinect仅提供四个使用者,并且只能追踪两个人骨架;在骨架关节数上,OpenNI可以追踪15个关节,这一点上Kinect较多,可以追踪20个关节。考虑到OpenNI以及其中间件NITE的两者结合,OpenNI相比于Kinect来说多出了手势侦测、姿势侦测、手部追踪的功能。

·从体感开发多元化的角度来看,这两者在对各自硬件上的声音和彩色图片的支持都比较完全。它们都可以对声音信息进行杂音抑制、消除回音、来源方向判断等处理;对彩色图信息都可以进行获取,匹配等处理。

·从扩展角度讲,目前OpenNI 2.0之后的版本,可以支持更多的中间件,这也意味着OpenNI的功能会更加的丰富,更为全面,可扩展性更强。在这一点上Kinect或许会相对逊色一点。

2.3 深度感应器原理

本节介绍Xtion设备纯硬件的一些结构,可能会对大家认知Xtion设备,和对体感开发源数据的理解有很好的帮助,有兴趣的读者可以自行选择阅读。

2.3.1 感应器架构

Xtion体感设备所采用的架构为PS1080架构,这个架构的核心是一颗PS1080芯片,用于控制其他设备和处理其他设备返回的信息。在这个架构中,PS1080芯片所控制的核心的模块深度模块,由IR Light(红外激光器)和Depth CMOS(深度感应器)组成,PS1080芯片控制着IR Light和Depth CMOS两个感应器的工作,接收并处理这两个感应器所返回的数据。这两个感应器也是Xtion设备最为基础的功能。除此之外PS1080还可以选择性地控制其他外接模块,以ASUS Xtion Pro Live为例,PS1080芯片还控制着一个声音模块,其包含2个麦克风(Microphone)和4个外接音频源(External digital audio source),同时控制一个彩色图像模块,包含一个彩色图像感应器(Color Image CMOS),PS1080芯片控制这两个外接模块的工作,并接收和处理其返回数据。

PS1080架构中,PS1080芯片除了控制一些模块之外,还与其他的底层存在着一定的协议通信,比如设计到图像功能的Flash与传输数据所使用的USB,图2-5所表示的就是USB 1080架构的形象图,图中IR Light和Depth CMOS所组成的深度模块为PS1080芯片所控制的基础模块,其他模块为可选择的模块。不过图中有一点值得注意的是,PS1080芯片与USB通信所标注的是USB 2.0,实际上在OpenNI 1.5及后续版本,并且Xtion设备分位(firmware)在5.7.9及以上版本的情况下,Xtion设备已经可以使用USB 3.0通信了。

图2-5 PS1080架构

2.3.2 深度感应器工作原理

Xtion设备中3D深度感应模块所使用的技术称为光编码技术(Light Coding),这是一种光学式技术。其本质就是产生一张红外激光编码图(IR Light Coding Image),透过红外线投影机打到空间中,也就是用红外线发出发射前经过编码后、肉眼不可见的红外线散斑,打到空间中,使得空间中被加上标记,由于散斑具有高度的随机性,因此空间中任何两处的散斑都会是不同的图案。接收器在截取空间中的红外线影像后,把影像交给PS1080芯片进行计算,算出深度图。

把这个技术放到客厅这样的场景中,简单来说就是Xtion设备通过红外激光源(IR Light Source)发出有编码的红外线激光,这串激光打到客厅中的场景内的物体上之后,也就是所说的场景被这种不可见的已编码的红外激光给标记过了,而后接收器(一个标准的CMOS感应器)接收到返回来的红外激光,并把接收到的信息交给PS1080芯片进行处理,最后把结果返回给应用程序前台,也就形成了我们所看到的场景深度图像(Scene Depth Image),如图2-6所示。

图2-6 Light Coding技术

在Xtion设备中,PS1080芯片计算场景中不同处的距离所采用的方法涉及一种散斑的概念,所谓散斑就是当相干光从粗糙表面反射或从含有散射物的介质内部后向散射或透射时,会形成不规则的强度分布,出现随机分布的斑点,这些随机分布的斑点就称为散斑(Laser Speckles)。

粗糙表面和介质中散射子可以看做是由不规则分布的大量面元构成,相干光照射时,不同的面元对入射相干光的反射或散射会引起不同的光程差,反射或者散射的光波动在空间相遇时会发生干涉现象,当数目很多的面元不规则分布时,可以观察到随机分布的颗粒状结构的图案。如图2-7所示,左侧部分为深度效果图,右侧部分为散斑效果图。

图2-7 散斑效果图

散斑这种光学效果还有一个最重要的特点,就是具有高度的随机性,而随着距离的不同会出现不同的图案,也就是说,在同一空间中任何两个地方的散斑图案都不相同。只要在空间中打出这样的光并加以记忆,就等于是在整个空间中做了标记,然后把一个物体放入这个空间中根据物体散斑的变化就可以知道物体的位置,如图2-8所示。

图2-8 光源标定

Xtion设备中所使用的光源标定方法也是根据这样的原理设计的:每隔一段距离取一个参考平面,把参考平面上的散斑图案记录下来,根据比对接收器接收到的散斑图案,来判断该散斑点的具体位置。

依据Xtion设备中深度感应器的一些设备原理,再结合实际场景来回味分析一下Xtion设备的工作情形。以抓取客厅中的人物为例,通过Xtion设备上的IR Light Source向客厅空间发射出已经编码的红外线激光,这些红外线激光打到人的身上,并形成散斑,也就是对人物的位置进行了标定,这些光线经过散射之后被Xtion设备上的感应设备感知到,也就是一个标准的CMOS感应器。感应器将感应到的数据,交给Xtion设备中的PS1080 SoC,芯片内部根据这些数据计算出场景中的人物图像位置,并标定人物深度位置,生成一张立体的深度图像,通过USB传送给PC设备。Xtion设备的工作原理,如图2-9所示。

图2-9 Xtion设备工作原理

2.3.3 深度精确度分析

对于光学设备来说,其不可避免地要涉及精度问题和使用范围问题。作为开发者,熟悉这款设备的这些功能,对于基于这些设备所进行的开发有着决定性的作用,这里会给读者介绍一些关于Xtion设备的深度和精度内容,供读者阅读。

Xtion设备采用的是基于散斑原理的光源标定技术,所以散斑的形成与否对深度图有着决定性作用,图2-10是一张在彩色图中标注深度信息的图片,图中黑色部分表示无法精确获得深度信息。我们分析图中的黑色部分,首先在图靠近镜头的地方会无法获取深度,这是因为在这么近的距离无法形成有效的散斑。其次图片中照明灯部分也无法获取深度,因为Xtion所使用的是光学式探测,所以直接光照会对感应器的接收产生比较强的干扰,最后一部分黑色是在图片中最远的地方,以黑色斑点的形式出现,这是因为距离过远,散斑的密度也会相应降低,当距离过远时也不能形成有效的散斑。

图2-10 深度图样例

由红外线散斑打出去的特性可知,越近的地方散斑的密集度越高,精确度越高,反之越远深度精确度越低。而在开发的过程中,数据的精确度,稳定度通常也会给开发者处理带来一定程度上的差异,因此清楚地了解不同距离下的深度精确度,会给开发者带来意想不到的帮助。基于这样的需求,可以从数据方面精确地看出深度图在不同距离所有的精确度表现,由图2-11可知,Xtion设备的最佳工作范围为0.8~3.5m。

图2-11 深度精确分析图(距离范围:0~10000mm、建议范围:800~3500mm)

2.3.4 无法侦测物体深度

上面内容在介绍Xtion设备的原理时提到是由红外激光发射器发射的激光,激光在物体表面通过漫反射形成散斑,因此会出现一种情况,因为物体的材质问题而不能形成有效的散斑,所以Xtion设备并不能抓取到这些物体的深度数据,比如透明材质和镜面材质,对于这两种材质,Xtion设备均不能获取到有效的深度。

实际上在Xtion设备的工作中,包括材质的颜色也会影响到深度的侦测。如图2-12所示,图中包含了镜面材质、透明材质、不同颜色材质的不同表现。

图2-12 不同颜色对深度侦测的影响

除了材质问题,在遮蔽的情况下,Xtion设备也不能获取到物体的深度。当一个物体被其他非透明物体所遮挡,这样红外激光不能照射到物体,也就不能被Xtion设备的接收器所接收到,这时物体就没有正确的深度。如图2-13所示,椅子背部就对后方空间形成了遮蔽,深度图像以黑色部分显示。

图2-13 遮蔽效果图

2.4 本章小结

作为一名Xtion体感开发的初学者,如何入门体感开发,如何了解它的基础知识和技术支持,是每一个初学者所面临的问题,本章用简短的篇幅,结合笔者自身的体会来阐述和介绍体感技术所基于的硬件基础Xtion设备的相关知识。学习本章,了解作为体感技术硬件层面上基础的原理,有助于开发者理解体感技术,把握体感技术功能。