Back to case study

Detailed technical write-up.

全景图消影点估计

全景图消影点估计

立方体分块 + 球面权值 LUT + 曼哈顿 RANSAC,稳定估出三个正交主方向

1. 项目信息

项目 内容
项目名 全景图消影点估计 (Pano Vanishing Point)
时间 2023-03 前后完成主开发,后续为维护
应用场景 全景图重力对齐、Manhattan 主方向估计、线段结构化聚类
角色 独立完成算法设计、C++ 实现、评测
输入 单张等距柱状 (equirectangular) 全景图 (典型 1280×640)
输出 三个球面主方向 (曼哈顿假设下互相正交) + 每条线段所属的方向族标号

整体分五个阶段:先将全景图重采样为若干张透视子视图;在每张子视图上做线段检测;把所有线段按其贡献累积到一张球面权值查找表 (LUT) 上;用 RANSAC 结合曼哈顿假设在球面上搜索三个正交方向;最后按最优的三方向把所有线段回聚到对应的方向族。整个流程仅依赖单张全景图,无需先验位姿。

2. 项目背景

透视投影下,世界中一族平行线在图像上会汇聚到一个公共点,称为消影点。消影点仅由线的世界方向决定,与平行线的位置无关,因此它本质上是一个”方向”的图像表示。在场景中存在人造结构(墙面、门框、柱子、路面标线等)时,消影点是最容易获取、最稳定的方向观测。

对于针孔图像,消影点估计已有大量成熟做法(Hough 变换、RANSAC、EM 聚类等)。全景图有所不同:等距柱状投影不是简单的透视投影,一条空间直线在图像上会呈现为曲线,直接照搬针孔场景下的做法会失效。本模块的目标是把针孔场景下的消影点估计流程迁移到全景图上,输出与针孔管线兼容的三个正交主方向。

在 Cyclops 全景重建流水线中,消影点是若干下游模块的直接输入:重力方向纠正模块依赖竖直方向消影点,Manhattan 场景对齐依赖三个正交方向,墙面法向估计依赖水平主方向。因此这个模块需要在多类场景(住宅、办公室、走廊、大厅)下稳定给出结果,且对失败要有明确的退化行为。

3. 问题描述

3.1 消影点的几何定义

在针孔相机 $P = K[I \mid 0]$ 下,世界中一条方向为 $d$、起点为 $A$ 的直线,其图像随参数 $\lambda$ 变化为 $x(\lambda) = a + \lambda K d$。当 $\lambda \to \infty$ 时,$x(\lambda)$ 收敛到 $v = Kd$。这个 $v$ 就是消影点,它只由方向 $d$ 决定。

反过来,只要在图像上找到某个消影点 $v$,就可以恢复对应的世界方向:$d = K^{-1} v / | K^{-1} v |$。也就是说,消影点估计与方向估计是同一件事。

3.2 从图像点到球面方向

在针孔图像上,两条线段的交点是一个二维点。将它通过 $K^{-1}$ 反投影后归一化,就得到单位球上的一个点。因此图像上的消影点等价于球面上的一个单位方向,这是把全景图与针孔图统一起来的关键——两种成像方式下消影点的最终表达都是球面方向。

这一等价性带来两个直接后果:一是消影点估计可以完全在球面上进行,图像域的畸变差异被隔离在前置阶段;二是曼哈顿假设可以表述为”球面上的三个方向互相正交”,这是一个纯几何条件,不依赖成像模型。

3.3 全景图相对针孔图的差异

在等距柱状全景图上,一条空间直线的像不是直线,而是随经纬度变化的曲线。这使得直接在原图上跑 LSD、EDLines 之类的线段检测器会得到大量断裂片段与误检,后续基于线段的交点计算也会失去几何意义。因此需要一个前置阶段,把全景图局部还原到”直线映射为直线”的透视投影下再做检测。

4. 解决方法

4.1 立方体分块与线段检测

将全景图重采样为多张 90°×90° 的透视子视图,覆盖前、后、左、右、上、下六个方向。在这些子视图下,透视投影的直线保直特性重新成立,标准线段检测器(LSD、EDLines)可以直接使用。检出的每条线段带有子视图下的两个端点,通过子视图内参可以映射回相机坐标系下的球面表示。

这一步的动机与配套的重力纠正模块相同:把畸变问题交还给投影本身,让检测算法在它擅长的场景下工作。

4.2 球面参数化与权值查找表

球面上的任意方向都可以用两个角度 $(\phi, \lambda)$ 表示——$\phi$ 是与赤道的夹角(纬度),$\lambda$ 是经度。取合适步长将 $(\phi, \lambda)$ 平面离散化,得到一张二维网格。这张网格在几何上是把球面按经度均匀展开,视觉上会呈现出”两端尖、中间宽”的子弹头形状——因为高纬度处经度圈周长按 $\cos\phi$ 压缩,展开后网格单元也随之收窄。

左图:球面方向由 $(\phi, \lambda)$ 参数化(图片来自参考文献)。右图:把 500 张全景图上所有线段对的贡献累加到这张 $(\phi, \lambda)$ 平面上得到的实拍热度图,三个正交主方向表现为三个明显的亮斑。

权值累加规则来自 Lu 等人(WACV 2017):对图像上的任意两条线段 $l_1, l_2$,它们在球面上的大圆交点对应一个 $(\phi, \lambda)$,把权重 $|l_1|\cdot|l_2|\cdot\sin(2\theta)$($\theta$ 是两大圆夹角)累加到该单元。线段越长、夹角越接近直角,贡献越大;同一个真实消影点会被大量线段对反复投票,热度自然聚集。

这张 $(\phi, \lambda)$ 累积图有两个直接用途:

支撑常数时间的候选评估。 后续 RANSAC 需要反复给”候选三方向”打分,若每次都重新扫描线段代价过高。有了 LUT 后,任意候选方向的支持强度都是一次查表操作,评估复杂度从 $O(N_\text{线段})$ 降到 $O(1)$。

天然提供聚类基础。 累积图上的亮斑本身就是所有候选消影点的密度极大值点。RANSAC 采样若从亮斑区域出发,收敛速度比在全球面上均匀采样快得多;曼哈顿假设进一步把三消影点的联合搜索绑定成一个整体,见 4.3 节。

参考文献:Lu, X., Yao, J., Li, H., Liu, Y., Zhang, X. “2-Line Exhaustive Searching for Real-Time Vanishing Point Estimation in Manhattan World,” WACV 2017, pp. 345–353.

4.3 曼哈顿假设与三元组构造

曼哈顿假设下,场景中存在三组互相正交的主方向。在球面上,对应三个互相正交的方向 $v_1, v_2, v_3$,满足 $v_1 \cdot v_2 = v_2 \cdot v_3 = v_1 \cdot v_3 = 0$,即 $v_3 = v_1 \times v_2$。

这条约束把三个消影点的联合估计从 6 自由度(三个球面方向各 2 自由度)降到 3 自由度($v_1$ 的 2 自由度 + $v_2$ 沿 $v_1$ 正交圆上的 1 自由度),第三个消影点由前两个自动决定。这一降维使得穷举式采样成为可能:$v_1$ 从线段对中取,$v_2$ 沿正交圆按 1° 步长扫过 360 次。

4.4 RANSAC 主循环

单次迭代的流程如下:

  • 取 $v_1$。 从线段集合中随机选两条线段,它们所在球面大圆的交点作为 $v_1$。
  • 扫 $v_2$。 在与 $v_1$ 垂直的大圆上,以 1° 步长采样 360 个候选,每个都是一个候选 $v_2$。
  • 算 $v_3$。 由曼哈顿假设 $v_3 = v_1 \times v_2$ 直接得到第三个方向。
  • 算 score。 三个方向各自在球面 LUT 上查一个支持强度,三者之和即为本次候选三元组的 score。
  • 更新最优。 保留 score 最高的三元组作为当前最优 model。

RANSAC 迭代次数按当前最佳内点率自适应调整,直至达到置信度门限。整体在 1280×640 的全景图上平均耗时约 合理测距上限s,包含立方体切分、线段检测、消影点估计和线段聚类四个阶段。

4.5 线段聚类

得到最优的三个正交方向后,把每条线段按其球面大圆到三个方向的角距离,归入距离最近的方向族。距离超出阈值的线段视为不属于任何主方向,标记为孤立。这个聚类结果是本模块除方向本身之外的第二类输出,可以直接供下游墙面法向估计、结构化线段建模使用。

5. 效果与失败模式

5.1 主观评测

在一个 500 张全景图的测试集上逐一目检,多数场景下三个正交方向估计正确。样例效果如下:

四张全景图上的消影点估计与线段聚类结果,红/绿/蓝分别对应三个主方向的线段族。

5.2 性能

阶段 单张 1280×640 耗时
立方体切分 约 15ms
线段检测 约 40ms
消影点估计 (含 LUT 建表 + RANSAC) 约 30ms
线段聚类 约 15ms
合计 约 合理测距上限s

5.3 失败模式

主观评测中识别到的失败集中在三类,分别对应算法链路的三个不同薄弱环节:

线段聚类错误。 一条真实的世界线段的延长线上可能同时经过两个主方向的消影点,导致这条线段被归入哪个方向族存在歧义。这类错误影响的是聚类标签,方向估计本身仍是正确的。

线段过少导致 RANSAC 失败。 空旷房间、纯色墙面等纹理稀疏场景,可检出的线段数低于 RANSAC 所需的最小样本量,方法整体退化。

曼哈顿假设不成立。 某些场景(斜墙、圆形走廊、非正交建筑结构)本身就没有三个互相正交的主方向,本模块强行套用曼哈顿假设会得到几何上没有对应物的第三方向。

6. 总结

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

在球面上做估计,隔离成像模型差异。 无论输入是针孔图还是全景图,消影点的最终表达都是球面上的一个单位方向。将估计过程放在球面上,前置的透视/等距柱状差异只影响到”如何把线段抬到球面”这一个步骤,后续所有环节完全共用。

用球面权值 LUT 换来暴力采样的可行性。 曼哈顿假设把三消影点的联合搜索降到 3 自由度,本可以直接穷举,但每次评估都重新扫描线段代价过高。LUT 把评估摊平为常数时间查询后,暴力”$v_1$ 采 + $v_2$ 扫 360°”就成为可行方案,避免了 EM/迭代优化那类会陷入局部极小的做法。

明确划分失败模式并保留退化路径。 聚类歧义、样本不足、曼哈顿失配三类失败原因不同,处理策略也不同。模块本身不试图掩盖失败,而是把这三类失败留给上层调用方按业务需求决定回退策略(例如重力纠正模块只使用第一个正交方向的估计,即使另两个方向不可靠仍可工作)。

后续可扩展的方向:

  • 对曼哈顿假设不成立的场景,退化为只估计单一竖直方向(即重力方向),保留部分下游模块可用性
  • 在 RANSAC 采样阶段引入 IMU 或重力先验,将 $v_1$ 的搜索范围从”任意线段对”收窄到”竖直附近”,进一步降低失败率
  • 将 LUT 权值函数替换为可学习的贡献度模型,让线段的加权方式适应不同的场景类型