截至目前,最精确可行的光学测距方法可能就是ToF(time of flight),例如LDM激光测距、IDM红外测距等等具体技术已经实现了产品化;另一方面,如今许多三维扫描仪都采用了三角测距法,特别是对手持式扫描设备而言。然而上述这些技术都不太适用于Kinect这种家用设备:首先是测量环境的限制,其次还要考虑成本因素。
PrimeSense的测距技术类似一部分结构光技术,“结构光”指一些具有特定模式的光,其pattern的图案可以是线、点、面等多种图形。结构光扫描法的原理是首先将结构光投射至物体表面,再使用摄像机接收该物体表面反射的结构光图案,由于接收图案必会因物体的立体形状而发生变形,那么就可以试图通过该图案在摄像机上的位置和形变程度来计算物体表面的空间信息。普通的结构光方法仍然是部分采用了三角测距原理进行深度计算。
参考Google Patents上的Range mapping using speckle decorrelation(No. US7433024B2)以及DEPTH MAPPING USING PROJECTED PATTERNS(No. 0118123 A1)两篇技术文档,已经有前人对PrimeSense的方法进行了详细解释。
PrimeSense将其深度测量技术命名为Light coding,与结构光法不同的是,Light coding的光源被称为“激光散斑(laser speckle)”,是当激光照射到粗糙物体或穿透毛玻璃后形成的随机衍射斑点。这些散斑具有高度的随机性,而且会随着距离的不同变换图案。也就是说空间中任意两处的散斑图案都是不同的。只要在空间中打上这样的结构光,整个空间就都被做了标记,把一个物体放进这个空间,只要看看物体上面的散斑图案,就可以知道这个物体在什么位置了。
当然,在这之前要把整个空间的散斑图案都记录下来,所以要先做一次光源的标定。在PrimeSense的专利上,标定的方法是这样的:每隔一段距离,取一个参考平面,把参考平面上的散斑图案记录下来。假设Natal规定的用户活动空间是距离电视机1米到4米的范围,每隔10cm取一个参考平面,那么标定下来我们就已经保存了30幅散斑图像。需要进行测量的时候,拍摄一副待测场景的散斑图像,将这幅图像和我们保存下来的30幅参考图像依次做互相关运算,这样我们会得到30幅相关度图像,而空间中有物体存在的位置,在相关度图像上就会显示出峰值。把这些峰值一层层叠在一起,再经过一些插值,就会得到整个场景的三维形状了。