中国开发网: 论坛: 程序员情感CBD: 贴子 725098
Water-E
zt:转篇通俗点的说明贴
这两天看了大家不少讨论,没有一个人真正能说得清楚透彻的,作为一个身在美国的phd,
我现在就来给大家科普一下三家公司的体感技术原理:

老任的:这个大家想必都比较清楚了,电视机上的sensor bar实际上是两个固定距离的红外光源,手柄上则是一个红外camera,原理不复杂,根据两个红外光源在camera上的成像点坐标,可以计算出手柄相对于屏幕的方位。

反过来,老任的东西也可以这么玩:电视机顶上放两个camera(手柄),手上拿一个红外led光源。于是根据两个camera的位置,和光源在两个camera上的成像坐标,也可以计算出光源的三维坐标,就好比人用两只眼睛可以知道物体的远近一样。在计算几何学里,这是一个最最最最普通的multi-view geometry问题,属于本科生毕业设计水平,或者研究生课堂项目的水平。本人就在去年用两只wii手柄和OpenCV实现过,还挺准的。

sony:我不想批评sony,不过这次sony展出的震动棒其实就是我上面说的原理,用两台camera来对手柄上的那个光球作三维定位,再配合手柄内部的加速度计。当然了,我那个课堂项目是用来混学分的,鲁棒性可用性自然比sony的差了不少,还需要不少改进。但定位原理是一样的,每本computational geometry的教材里都会当作基础知识来讲。不过sony把本科毕设级别的东西拿到E3上来show,未免要让业内人士给看轻了。

微软:这次微软的东西确实比较让外行人震撼,大家可能搞不清楚这到底是怎么做的吧。怎么对全场景的所有东西,而不是仅仅几个光源点,进行三维定位???
我先稍微列举一下外行们直觉上容易想到的办法:

1. 只用一个camera,但依靠神奇的模式识别技术,把图里的东西都认出来,然后比对它们实际的大小和在图像中的大小,就能知道它的大概距离了。
评论:这是最最外行的想法。没错,人闭上一只眼睛以后,还能靠上述原理估算出物体的距离。但是,计算机哪有人那么多知识啊,它怎么知道那东西原来该是多大呢?何况这对模式识别技术要求也太高了。最后,靠这种方法得不到精确的结果。

2. 用两个camera,和multi-view geometry的技术。这个做法是很多computer vision applications的基础,尤其是在augument reality方面。做法变化非常多,我只说个简单的:
首先,对每个camera返回的图像,依靠模式识别把图像里的关键点,关键线找出来,比如桌子的边,人的眼睛等等;然后把两幅图像上的关键点、线进行配对;配对以后就能计算它们三维空间的座标了。依靠这些关键点、线的三维信息,就可以得到整个场景的三维信息。

3. 以上说的两个办法都太依赖模式识别了,而这玩意又往往靠不住。所以实际最常用的,大家在好莱坞大片花絮里看到的,就是用人工的关键点替代模式识别。比如在人身上布满容易识别的小球,周围布上一堆camera。这个大家最容易理解,我就不说了。

那微软的natal用的是什么?以上三个皆不是,natal甚至跟multi-view geometry一点关系都没有。natal使用的是一种叫做“深度摄像机”的特殊camera。英文叫做Time-of-flight camera。国内如果没有被封的话可以看这里:http://en.wikipedia.org/wiki/Time-of-flight_camera

这到底是个什么东西呢?简单讲,这个camera在返给你每一帧图像的同时,也告诉你每个像素点离camera的距离,也就是一幅带有深度信息的图像。这玩意儿简直就像一个雷达一样,直接就把multi-view geometry辛辛苦苦要算的三维信息测出来了。你可以想象一下,这个camera给你的就不是一个平面图像,而是一个三维曲面。微软的软件,就可以直接在这基础上识别目标,和目标的运动。

最后再说两句这个camera。它的原理说起来很简单,初中物理即可理解,但要做出来可不简单。它里面有个光源,以100Hz的频率发光,光线照射到目标,然后反射回来,被sensor探测到。于是,到目标的距离就是(光线来回的时间差/2)/光速。例如,对于一个2.5米以外的目标,这个时间差是16纳秒。至于这么短的时间差怎么能被精确测量到,请自己google吧。

最最后,本人不是任何公司的fans。但我还是要对微软研究院里的天才们,为他们长期以来在computer vision上的杰出贡献,脱帽致敬。
嘿嘿

相关信息:


欢迎光临本社区,您还没有登录,不能发贴子。请在 这里登录