Back to case study

Detailed technical write-up.

单张全景图重力方向纠正

单张全景图重力方向纠正

只用一张全景图,估计相机相对重力的倾斜并对齐

1. 项目信息

项目 内容
项目名 单张全景图重力方向纠正 (Pano Gravity Rectify)
时间 2020-12 起,主开发约 3 个月,后续为维护
应用场景 消费级全景相机的室内三维重建、SLAM、全景漫游
角色 独立完成算法设计、C++ 实现、生产链路对接
输入 单张等距柱状 (equirectangular) 全景图
输出 与重力方向对齐的全景图 + 更新后的相机外参

整体分四个阶段:先将全景图重采样为六张透视子视图;在每张子视图上做线段检测,把每条线段抬升到球面并计算它对应的大平面法向量;再用 RANSAC 在这堆法向量中拟合出一个大圆,其法轴即为估计的重力方向;最后基于该方向对全景图做一次重投影,得到重力对齐的输出,并同步更新相机外参。整个流程仅依赖单张图,不需要 IMU、多帧或人工标注。

2. 项目背景

消费级全景相机的采集姿态通常不水平。三脚架不平、地面倾斜、手持颤抖都会让实拍全景图相对重力方向偏 1° 到 8°。下游多数几何模块——位姿优化、平面拟合、正射切片、Manhattan 世界求解——都依赖”图像里竖直的东西就是世界里竖直的东西”这一前提,倾斜会破坏该前提并放大后续误差。

本模块的定位是流水线前端的独立预处理阶段,负责估计并消除相机相对重力的倾斜量,使后续所有阶段可以在”重力已对齐”的前提下运行。

3. 问题描述

3.1 倾斜带来的下游影响

上图是一个合成场景:世界中的 12 根竖直柱子,被一台绕 X 轴倾斜 8°、绕 Z 轴倾斜 5° 的相机采集后,在等距柱状投影下呈现为弯曲的正弦曲线;纠正后所有柱子沿图像 v 方向直立。倾斜带来的下游影响主要有四类:

位姿维度冗余。 多帧对齐通常假定”相邻位姿只差绕重力轴的一个方向角 + 平移”,是一个 4 自由度问题。若重力方向未对齐,需要额外拟合 2 个倾斜自由度,收敛速度与抗噪能力均下降。

Manhattan 与平面模块失效。 基于消失点估计墙面法向、分割地板/天花板、生成正射底图等模块,均以”图像竖直方向 = 重力方向”作为输入约定。倾斜会使输出错位甚至无法收敛。

深度融合出现分层与鬼影。 TSDF 融合、多帧点云对齐对相机 Z 轴指向敏感。每帧重力方向不一致会导致地板高度不齐、墙面倾斜方向不一致,融合结果出现分层和重影。

可视化不一致。 全景漫游、平面图切片等消费端呈现对”墙是否竖直”较为敏感,即使几度的偏差也会造成明显失真。

综合以上四点,倾斜需要在流水线前端修正,而不是留给后续模块承担。

3.2 观测源选择

单张图不能直接给出重力方向,需要一个可观测的替代量。可选方案有四类:IMU 读数、地面法向量、消失点方法、竖直线段。

IMU 读数。 精度依赖硬件,且并非所有采集平台都提供。即便有 IMU,读数存在漂移和刻度误差,跨帧不一致,仅适合作为先验,不适合作为唯一观测。

地面法向量。 直觉上”地面 = 水平面”,实践中并不成立。住宅楼常有 1°—2° 的建造倾斜,商场、车库存在排水找坡与斜坡,室外和展厅经常有意做成缓坡。地面本身不水平时,用地面法向量拟合出的重力方向会带有系统偏差,且这类偏差在流水线内部没有额外信号可以校正。

消失点方法。 与本报告采用的方法本质上是对偶关系:消失点方法求的是所有竖直线在图像上共交的那个点,本方法求的是所有竖直线对应大平面法向量所在的大圆——一个是点几何,一个是平面几何,等价性来自”点的对偶是通过该点的平面族”。区别在于消失点方法需要先将线段聚类为若干方向族再拟合,聚类的成败依赖场景纹理;本方法则跳过聚类,直接对所有法向量做鲁棒平面拟合,退化路径更平滑。

竖直线段。 门框、墙角、柱子、家具边缘、路灯杆、货架立柱在室内外场景中普遍存在,且每条线段都独立提供一个几何约束。竖直线段的检测不依赖 Manhattan 假设,也不假设地面水平,可以在多种场景下稳定获得几十到几百条观测。本模块因此选用竖直线段作为唯一观测源。

4. 解决方法

4.1 立方体分块与透视线段检测

等距柱状投影在纬度接近极点处存在明显拉伸,一条空间直线在图像上会呈现为曲线。LSD、EDLines 等常见线段检测器基于”直线在图像上仍为直线”的先验,直接在原始全景图上运行会产生断裂片段与误检。

因此先将全景图重采样为 6 张 90°×90° 的透视子视图,覆盖前、后、左、右、上、下六个方向。在透视子视图下,直线在图像上仍为直线,检测器的先验重新成立,检出质量与速度都恢复正常。六个视锥彼此重叠冗余,任何一条真实竖直线都可能被多个面观测到。

4.2 从像素线段到球面法向量

相机中心与空间直线的两个端点三点共面,该平面的单位法向量即为该线段的球面几何描述。对每张子视图检出的每条线段:先用子视图内参把两个像素端点反投影到相机坐标系下的单位球,再乘以子视图相对全景中心的外参,得到两端点在世界坐标下的球面位置,取叉乘即为该线段所属大平面的法向量。

若线段方向沿重力方向,则重力向量位于该大平面内,因此该线段的法向量与重力方向严格正交(左图)。所有沿重力方向的线段,其法向量均落在以重力方向为法轴的大圆上,即赤道(右图)。这将”估计重力方向”化归为”在一组三维单位向量中拟合一个 2 自由度大平面”的问题。

拟合前对法向量做一次粗筛:与重力初值夹角小于 30° 的丢弃,只保留夹角大于 60° 的候选。这一步压低了非竖直线段带来的外点比例。

4.3 RANSAC 拟合赤道大圆

拟合的模型只有 2 个自由度(一个大平面 = 一个法向量),最小样本数为 2:随机取两个法向量做叉乘得到候选重力方向,用它到其他所有法向量的角距离计数内点。

RANSAC 外围有三个约束:

角度门控。 每次候选重力方向先与”竖直向上”这一先验做夹角检查,超出 5° 直接丢弃。生产环境中该门限默认为 5°(三脚架采集),手持采集时可放宽至 15°。角度门控将搜索空间从整个球面收窄到重力先验附近的锥体,避免两条水平线偶然叉乘出的伪解通过。

迭代次数自适应。 按 Fischler-Bolles 公式随当前最佳内点率动态调整迭代次数,并夹在 [500, 2000] 之间。下限保证低内点率场景下试探次数足够,上限避免高置信度时无谓迭代。

内点验收。 收敛后要求内点数不少于 30,且估出的方向与重力先验夹角小于设定阈值。任一条件不满足则整体回退为单位阵,即本次不对全景图做任何旋转。回退策略的取舍是:错误的重力估计会污染下游整条链路,而回退只是让下游按未纠正的输入继续工作,代价较小。

得到重力方向后,用 Gram-Schmidt 补齐一个正交基,得到 3×3 的旋转矩阵。绕重力轴的方位角在单帧下不可观,用一个固定的辅助方向补齐。

4.4 重投影与外参同步

对输出图每个像素做反向查找:将其对应的球面方向向量按估计的旋转矩阵旋转,查其在输入图上的经纬度,再插值取色。经度方向做周期性绕接以保证左右接缝连续。一张 3200×1600 的全景图在通用 x86 服务器上单核约 0.6 秒完成,生产环境以 4 线程并行处理同一项目内的多张全景图。

同一采集会话内所有帧的外参同步更新:将估计到的纠正旋转乘到每帧的旋转上,再将旋转的轴角表达中的 X、Z 两个分量置零,只保留绕重力轴的方位分量。这一步将”重力已对齐”从软约定固化为下游外参严格满足的硬性性质。

4.5 效果指标

指标 优化前 优化后
单帧竖直方向与重力夹角 1°—8° ≤ 1°
相邻帧重力方向一致性 独立漂动 完全一致
下游位姿求解自由度 3(旋转)+ 3(平移) 1(方位角)+ 3(平移)
平面图切片竖直线肉眼歪斜 明显

合成实验中,只要单张图能稳定检出 100 条以上竖直线,即使每条线的方向噪声达到 2°—5°,最终重力方向误差的中位数仍在 1° 以内:

5. 总结

本模块的三条主要设计取舍:

单帧观测、仅用线特征。 不依赖 IMU、不需要多帧、不与后续位姿模块耦合,使其可以放在流水线最前端作为独立预处理阶段,与上下游算法解耦。

用法向量族拟合替代消失点聚类。 由于消失点法与本方法在几何上互为对偶,两者精度理论下限相同;本方法跳过聚类步骤,将问题化归为标准的 2 自由度鲁棒平面拟合,在稀疏纹理场景下退化更平缓。

外围约束保护 RANSAC 结果。 5° 角度门控、30 条最小内点数、二次角度验收共同构成一组保守约束,任一条不满足即整体回退为单位阵,避免错误的重力估计传播到下游。

后续可扩展的方向:

  • 用 IMU 或陀螺仪读数作为更紧的先验,进一步收窄 RANSAC 的搜索锥
  • 在纠正重力方向的同时融合 Manhattan 假设对齐水平主方向,为正射投影和自动户型图提供更强初值
  • 用可微分的球面损失替代 RANSAC,将本模块嵌入端到端的全景重建训练框架