深度估计
深度估计这件事,是要弄清楚一个画面里每一个点离摄像头有多远——把一张本身完全没有距离感的平面图像,变成对“远近”的认识。它的输出通常是一张深度图:图里每个像素存的不是颜色,而是一段距离,用亮度来表示每个点有多近(或者按约定表示有多远)。一个知道深度的机器人,就能判断门口在前方两米、椅子在它左侧半米处——而这正是它移动和伸手却不撞到东西所必需的。
获取深度没有唯一的办法,而是有一整套各有取舍的方法。立体摄像头从并排两个视角之间的视差里推出深度。结构光会把一组已知的点阵或条纹图案投到场景上,再读取这图案在物体表面上是怎样错位和弯曲变形的,据此算出距离——许多室内深度摄像头就是这么工作的。飞行时间传感器和激光雷达则发射光线,测量它弹回来要花多长时间。还有基于学习的方法:用一个研习过数百万张图像的神经网络,单凭一张普通照片就去猜测深度,靠的是人也会用的那些线索,比如东西离得越远看起来越小、纹理在远处会变得越细。
每一种方法都有它的甜蜜点和短板。立体视觉和单图学习在空白、没有纹理的表面上都很吃力;结构光和飞行时间在强烈阳光下可能被冲刷得失效;激光雷达精确、测程远,却价格昂贵,而且给出的是稀疏的点而不是一张稠密的图。因此,真实的机器人常常把好几种来源结合起来——把它们融合在一起,让一种方法的长处去补上另一种方法的盲区——以构建出一幅可靠到足以据此行动的深度图景。
一台室内机器人的深度摄像头,把一组看不见的红外点阵投满整个房间;这些点在远处的墙上散得很开,在近旁的沙发上则挤得很密,摄像头据此构建出一张深度图,显示沙发近、墙远。
结构光通过一组已知图案在物体表面上被拉伸的方式来读取距离。
立体视觉只是估计深度的一种具体办法;深度估计是更宽泛的目标,也可以靠结构光、激光雷达或一个学出来的单图模型来实现。