Kinect有发射、捕捉、计算视觉重现的类似过程。严格说来,Kinect的“深度眼睛”是由一个红外投影机和红外摄像头组合而成的,投影和接收互为重叠,如图3-27所示。
可以说,Kinect的成功也在于其能廉价而有效地捕捉到深度图像。它能收集视野范围内的每一点,并形成一幅代表周围环境的景深图像。传感器以每秒30帧的速度生成景深图像流,实时3D地再现周围环境。
3.4.1 ToF光学测距与结构光测量红外摄像头大体可以划分为两类(见图3-28):
基于飞行时间(Time of Flight,ToF)原理的摄像头,它通过测量光脉冲之间的传输延迟时间来计算深度信息。例如Mesa Imaging SwissRanger 4000和PMD Technologies CamCube 2.0,它们都价格不菲。
结构光测量,基于光编码,投射已知的红外模式到场景中,通过另外一个红外CMOS成像器所捕获到的该模式的变形,从而最终来确定深度信息的摄像头,如PrimeSensor和Microsoft Kinect。事实上,图3-28c和图3-28d使用的是同一红外摄像头。Kinect属于图3-28d所示情况。
2009年微软收购了以色列公司3DV Systems,它拥有ToF摄像头的专利。ToF是“Time of Flight”的缩写,从字面上也可大致猜出其含义:计算光线飞行的时间。首先让装置发出脉冲光,并且在发射处接收目标物的反射光,即由测量时间差算出目标物的距离。3DV的ZCam就是采用ToF技术,使用红外线以及Accelerometers加速度计感应器,感测立体空间的相对位置变化,建构灰阶距离影像的深度感应器。感光芯片需要飞秒级的快门来测量光飞行时间,据说芯片中用到砷化镓,使其时钟频率提高到上百GHz。于此同时也提高了工艺成本。
光学测距方法是ToF目前较为精确可行的技术,也有诸如LDM激光测距、IDM红外测距等具体产品,但都价格不菲。因此,该项技术对于Kinect这种消费电子产品来说不适用:一方面是测量环境的限制,更主要的是成本因素。这样看来,微软收购3DV Systems,只是为了动作感测的专利权、并取得领先地位。
“结构光”指一些具有特定模式的光,其模式图案可以是点、线、面等。结构光扫描法的原理是首先将结构光投射至物体表面,再使用摄像机接收该物体表面反射的结构光图案,由于接收图案必会因物体的立体型状而发生变形,故可以试图通过该图案在摄像机上的位置和形变程度来计算物体表面的空间信息。普通的结构光方法仍然是部分采用了三角测距原理的深度计算。
结构光测量技术作为一种快速、便携、高精度的三维测量技术,在汽车、航空、模具、医疗等领域均得到了广泛的应用。相位计算是基于相位测量的结构光三维测量中的关键技术之一,最终输出是三维点云,进行相关的三维建模和测量。
3.4.2 Light Coding技术PrimeSense将其深度测量技术命名为Light Coding,顾名思义,就是用光源照明给需要测量的空间编上码,属于结构光技术的一种,只是深度计算方式不一样,微软Kinect深度图像就是采用了这种技术。
与结构光法不同的是,Light Coding的光源称为“激光散斑”,是激光照射到粗糙物体或穿透毛玻璃后随机形成的衍射斑点。这些散斑具有高度的随机性,而且会随着距离的不同而变换图案。也就是说空间中任意两处的散斑图案都是不同的。只要在空间中打上这样的结构光,整个空间就都被做了标记,把一个物体放进这个空间,只要看看物体上面的散斑图案,就可以知道这个物体在什么位置了。当然,在这之前要把整个空间的散斑图案都记录下来,所以要先做一次光源标定,如图3-29所示。
概括一下,Light Coding与传统的ToF、结构光技术的不同之处在于:
1)和传统的ToF、结构光的光源不同,使用“Light Coding”技术的PrimeSense的PS1080系统级芯片负责对红外光源进行控制,投射出具有三维纵深的“立体编码”。这种光源称为激光散斑,是当激光照射到粗糙物体或穿透毛玻璃后形成的随机衍射斑点。
2)不需要特制的感光芯片,只需要普通的CMOS感光芯片,这让方案的成本大大降低,对Kinect消费及电子产品的市场化至关重要。
3)Light Coding技术不是通过空间几何关系求解的,它的测量精度只和标定时取的参考面的密度有关,参考面越密测量越精确。传统结构光方法采用三角视差测距,基线长度(光源与镜头光心的距离)越长越好。换句话说,不用为了提高精度而将基线拉宽。这其中的奥秘就是“激光散斑原理”。
3.4.3 激光散斑原理
激光在散射体表面的漫反射或通过一个透明散射体(如毛玻璃)时,在散射表面或附近的光场中可以观察到一种无规分布的亮暗斑点,这种斑点称为激光散斑(Laser Speckles)。
如果散射体足够粗糙,这种分布所形成的图样是非常特殊和美丽的,如图3-30所示。
散斑现象普遍存在于光学成像的过程中,很早以前牛顿就此解释过恒星闪烁而行星不闪烁的现象。由于激光的高度相干性,激光散斑的现象就更加明显。最初人们主要研究如何减弱散斑的影响。在研究的过程中发现散斑携带了光束和光束所通过的物体的许多信息,于是激光散斑产生了许多的应用,例如用散斑的对比度测量反射表面的粗糙度,利用散斑的动态情况测量物体运动的速度,利用散斑进行光学信息处理,甚至利用散斑验光等。
激光散斑是由无规散射体被相干光照射产生的,因此是一种随机过程。要研究它必须使用概率统计的方法。通过统计方法的研究,可以认识到散斑的强度分布、对比度和散斑运动规律等特点。最重要的特点就是,这种散斑具有高度的随机性,而且随着距离的不同会出现不同的图案,也就是说,在同一空间中任何两个地方的散斑图案都不相同。只要在空间中打上这样的结构光然后加以记忆就让整个空间都像是被做了标记,然后把一个物体放入这个空间后只需要从物体的散斑图案变化就可以知道这个物体的具体位置。
3.4.4 标定原理
PrimeSense的专利中是这样解释“标定方法”的:每隔一段距离,取一个参考平面,把参考平面上的散斑图案记录下来。
假设Kinect规定的用户空间是距离摄像头1~4m的范围,每隔1cm取一个参考平面,那么标定下来我们就保存了300幅散斑图像。标定的间距越小,精度越高,如图3-31所示。需要进行测量的时候,拍摄一幅待测量的散斑图像,将这幅图像和我们保存下来的300幅参考图依次做互相关运算,进而得到300幅相关度图像。而空间中的物体存在的位置,会在相关图像上会显示出峰值,把这些峰值叠加在一起,再经过插值运算后就会得到整个场景的三维形状了。
注 “插值运算”是一种增加图像尺寸的方法。很多数码相机通过此技术实现数字变焦(DigitalZoom)。插值算法有许多种,目的都是有效地平滑扩大图像而不导致锯齿产生。
如果你有一台夜视摄像机(比如Sony HDR-CX700E,启用NIGHTSHOT模式),晚上在房间关掉灯,你可以观察到Kinect红外散斑投影在房间里,星星点点。画面因为红外拍摄的原因都显示为绿色,如图3-32所示。
为什么Kinect注意事项中警告:不要让阳光直射传感器,不要让传感器接近任何热源?
这个问题现在很好理解了,Kinect投射出近红外光源,通过目标物体产生的“散斑”进行“深度计算”。太阳光谱和热源会干扰Kinect投射出的近红外光源,正如微波炉对手机信号或者FM广播的干扰一样。
关于Light Coding的其他相关内容可以到Micosoft Academy或者Google Patents上查询两篇文档:
Range mapping using speckle decorrelation(No. US7433024B2)
DEPTH MAPPING USING PROJECTED PATTERNS(No. 0118123 A1)
http://book.2cto.com/201211/9227.html