微软Project Natal三维测量原理

来源:互联网 发布:海军航空兵 知乎 编辑:程序博客网 时间:2024/04/28 10:29

由 hotdog » 2010-04-26 11:26

Natal是微软XBOX360的即将推出的外设,使用单摄像头加主动光源的方式实时的获取场景的稠密点云。


(转自新浪 山猫小队长 博客)

http://blog.sina.com.cn/s/blog_461db08c0100is8o.html



最近一段时间一直在关注微软的Project Natal,对他的测量原理非常感兴趣。离Natal的发布日期还有一段时间,网上又几乎没有任何中文的资料对他的原理进行介绍。我这里只能根据查到的几个专利,对Natal的测量原理进行一些推测。

09年微软收购了以色列公司3DV,让人们以为Natal的技术是源自3DV的ToF(time of flight)摄像头。所谓的ToF摄像头的原理,在网上可以找到一些介绍,这里就不再写了。3DV的感光芯片由于要测量光飞行时间,所以需要做到飞秒级的快门。据说他们在芯片中用到砷化镓,使其时钟频率提高到上百G。但这样做会使其成本升高(到底有多高,我也不知道),很难想象微软能把这样的技术做进游戏机这样的消费电子品里面。今年一月份,微软的开发人员明确表示:Natal并不是基于ToF的原理。而前些日子,另一家以色列公司(以色列人还真厉害)PrimeSense才确认为微软提供了其三维测量技术,并应用于Project Natal。

在PrimeSense公司的主页上提到其使用的是一种光编码(light coding)技术,这种技术确实是我以前没有听说过的。不同于传统的ToF或者结构光测量技术,light coding使用的是连续的照明(而非脉冲),也不需要特制的感光芯片,而只需要普通的CMOS感光芯片,这让方案的成本大大降低。

PrimeSense的专利里介绍了几种测量方式,几种方式大体相同,每种都能够自圆其说,或许是为了迷惑竞争对手?或许这几种方法他一个也没用到?又或许是几种方式的结合?

Light coding,顾名思义就是用光源照明给需要测量的空间编上码,说到底还是结构光技术。但与传统的结构光方法不同的是,他的光源打出去的并不是一副周期性变化的二维的图像编码,而是一个具有三维纵深的“体编码”。这种光源叫做激光散斑(laser speckle),是当激光照射到粗糙物体或穿透毛玻璃后形成的随机衍射斑点。不知道大家有没有在大学里做过激光散斑测距的实验(我之前是没听说过),这里有一些介绍http://www.bb.ustc.edu.cn/jpkc/guojia/dxwlsy/kj/part2/grade3/LaserSpeckle.html

这些散斑具有高度的随机性,而且会随着距离的不同变换图案。也就是说空间中任意两处的散斑图案都是不同的。只要在空间中打上这样的结构光,整个空间就都被做了标记,把一个物体放进这个空间,只要看看物体上面的散斑图案,就可以知道这个物体在什么位置了。当然,在这之前要把整个空间的散斑图案都记录下来,所以要先做一次光源的标定。在PrimeSense的专利上,标定的方法是这样的:每隔一段距离,取一个参考平面,把参考平面上的散斑图案记录下来。假设Natal规定的用户活动空间是距离电视机1米到4米的范围,每隔10cm取一个参考平面,那么标定下来我们就已经保存了30幅散斑图像。需要进行测量的时候,拍摄一副待测场景的散斑图像,将这幅图像和我们保存下来的30幅参考图像依次做互相关运算,这样我们会得到30幅相关度图像,而空间中有物体存在的位置,在相关度图像上就会显示出峰值。把这些峰值一层层叠在一起,再经过一些插值,就会得到整个场景的三维形状了。

从微软最近公布的视频上可以窥测到数据计算的一些中间结果http://www.gamespot.com.cn/videos/2010/0416/130861.shtml。注意大屏幕右下角的人体图像,整个人似乎是由一圈圈的“等高线”组成的。这些“等高线”很可能就是对应着标定时的参考平面。


可是,散斑测距这件事说起来容易做起来难。激光散斑一般是用来测量物体表面振动的,斑点的平均面积非常小,一般只有几个微米,对微小的位移非常敏感。但这么小的斑点投射到人体上,用摄像头拍摄根本拍不到。虽然可以通过改变激光光束的直径调整散斑的大小,但若想使其在摄像头中成像面积大于一个像素,那代价就是大大降低了其对深度上的位移的敏感度。如果按照这种方法做出来的Natal,深度上的分辨率可能要用“米”来做单位了。


也许你会发现,这种Light Coding技术是不用空间几何关系求解的。他的测量精度只和标定时取的参考面的密度有关,参考面越密测量越精确,而和传统结构光方法中的基线长度(光源与镜头光心的距离)没有任何关系。也就是说,我们不用为了提高精度而把基线拉得很宽。但反过来想,如果能把基线拉宽,并利用这一特性,用视差法求解距离,作为散斑测距的补充。双管齐下,精度和运算速度都能得到大幅提高。

还有一个问题,就是怎样可以使摄像头拍摄到“干净”的散斑图像,而不受环境光和物体本身反射效率的影响。关于这一点,专利中并没有说明。

一般主动光源测量常用的消除环境光的方法是,使用红外光源,然后在镜头上加装带通滤光片。但这种方法只能减少环境光的干扰,并不能完全将其消除。至于物体本身反射效率的影响,我猜并没有相应的硬件来解决,而只是靠纯软件的方法来处理。因为要使测量精确,散斑的平均面积就要尽可能的小,但最小也要大于一个像素的面积,否则根本拍摄不到斑点。所以最好就是把散斑控制在接近一个像素的大小。这样,散斑图像在整个图像中可以算是高频分量。而物体的反光效率在某一小区域内可以认为是不变的,算是图像的低频分量。这样的话,通过设计一个滤波器就可以消除以上的两种干扰。

以上是我对Natal测量原理的一些推测。需要指出的是,以上这些都还只是PrimeSense公司的技术,单单这些就已经超越了现有的各种三维测量技术,而微软又在其基础上加入了人脸识别,声音识别等上层的应用。如果微软真的能顺利地将其孵化成产品,在技术层面上(不谈游戏性)将是索尼和任天堂都远远不能比拟的。

期待圣诞节Natal的发售。

PrimeSense的专利:http://www.google.com/patents?as_q=&num=10&btnG=Google+Search&as_epq=&as_oq=&as_eq=&as_pnum=&as_vt=&as_pinvent=&as_pasgnee=prime+sense&as_pusc=&as_pintlc=&as_ptype=11&as_drrb_is=q&as_minm_is=0&as_miny_is=&as_maxm_is=0&as_maxy_is=&as_drrb_ap=q&as_minm_ap=0&as_miny_ap=&as_maxm_ap=0&as_maxy_ap=
原创粉丝点击