全景图消影点估计

全景图,因为其全 FOV,用来估计消影点非常适合。对于室内场景来说,如果基于曼哈顿假设,可以很稳定求的消影点。从而进一步估计曼哈顿方向。如果只想估计重力方向,也可以只检测南北极的消影点。

demo.jpg 图 1 一个全景图,其中红、绿、蓝色色的线分别表示不同方向的平行线,对应的消影点用相同颜色的小圆圈表示。

思路

  • 三维空间中的任意两条平行线,都可以相交到消影点。真实空间中,无论是室内空间还是城市室外空间,都存在大量的平行线。如果对这些平行线按照互相平行进行分组,互相平行的分为一组,那么可以发现一个特点,就是分成的组的数量是有限的。比如建筑物上大量存在的竖直的线,其消影点只有两个:天、地。对于室内空间来说,很多情况只有 6 个消影点,即东、南、西、北、 天、地。 按照平行线来分组,东、西两个消影点对应的是其实是一个组平行线,对于南北、天地来说其实也是一组。也就是说,通常只有 3 组。
  • 如果对全景图切分成针孔图,可以很方便的检测直线段,这些线段是空间中直线的像。对于任意两个直线段如果虚交,那么他们可能平行。虚交点就是消影点。对于一个可能的消影点我们可以计算其在全景图中的坐标。如果其是消影点,那么所有的平行线的消影点坐标只有两个,对应球面坐标中两个相反的方向。
  • 如果对于任意两个可能平行的线进行相交计算,投影到球面坐标。然后统计这些球面坐标。如果对这些球面坐标点进行聚类,那么类别最多的几类就是真正的消影点。这些消影点对应的方向可以进一步用来估计位姿、做曼哈顿假设、做重力方向估计等等。

方法

  • 全景图切割成多个针孔图 因为全景图并不是射影变换,三维空间映射到全景图后并不保持直线,所以首先可以将全景图切成多个针孔图。切的方式可以切成 6 张 Cube 图,也可以自定义的方法去切。需要记录针孔图与全景图的 rotation matrix。
  • 对针孔图像提取直线段 使用 lsd 算法提取直线段,并计算直线段的方向。当然也可以使用 lbd,霍夫变换等方法。
  • 计算可能的消影点 对针孔图中的任意两个直线段进行虚交检测,如果虚交,那么他们可能平行。计算虚交点坐标,就是可能的消影点。将其坐标计算到单位球面坐标上。
  • 统计与聚类 可以对球面坐标按照经纬度构建一个直方图用来统计哪些点可能是消影点。

曼哈顿假设和重力方向估计

  • 如果是曼哈顿假设,那么可以进一步找到消影点对应满足互相垂直的曼哈顿方向。可以使用 RANSAC 方法去求解。
  • 如果是重力方向估计,可以根据全景图的初始位姿来约束可能的重力方向,进而找到对应的消影点以及平行线,估计出重力方向。估计出重力方向后,可以进行全景图的重力矫正。

球面索引

  • 对于一个球面坐标构建直方图并不直观。可以直接使用压缩的全景图来构建一个二维直方图。正常一个全景图,南北极一个点被拉伸成一条线,南北极出现很大的变形。对于一个全景图的 uv 坐标,对应的我们可以使用 v 坐标计算纬度,并根据纬度余弦值来压缩 u 坐标,从而形成一个压缩的全景图。这个全景图像一个“子弹头”,我尝尝习惯称之为子弹头全景图坐标,不知道行业内有么有对应的名字。我们可以使用这个子弹头全景图来构建一个二维直方图。从而很方便的统计哪些点可能是消影点。 compressPano.jpg 图 2 左侧是球面坐标,右侧是图 1 对应的压缩后的子弹头的二维直方图。白色点是可能的消影点。可以看到明显有很多聚集在一起的消影点,他们是真正的消影点,一共有 6 个,分别对应东、南、西、北、 天、地。

结果

一些结果: demo2.jpg demo3.jpg demo4.jpg

这些图中,南北极的消影点因为全景图的坐标在南北极有很大的拉伸,导致消影点绘制出来在有很大的水平随机性。

Written on March 20, 2020