Camera models beyond pinhole

带径向-切向畸变的针孔模型在窄视场和中等视场下表现良好,但许多 SLAM 平台使用的镜头和传感器会打破它的假设。广视场镜头能看到更多场景——这意味着更大的视差、更多可跟踪的特征,以及在快速旋转时更好的鲁棒性——但代价是需要不同的投影模型。

投影函数一览

所有中心相机模型都可以通过图像半径 rr 如何随入射角 θ\theta(入射光线与光轴之间的夹角)增长来比较:

模型r(θ)r(\theta)θ90°\theta \to 90° 时的行为
透视(针孔)ftanθf\tan\theta发散——无法表示视场角 ≥ 180°
等距鱼眼fθf\theta有限
等立体角鱼眼2fsin(θ/2)2f\sin(\theta/2)有限
体视投影2ftan(θ/2)2f\tan(\theta/2)有限

当入射光线接近与光轴成 90° 时,针孔投影会发散,这正是鱼眼镜头需要专门的模型,而不能仅靠更高阶畸变多项式来解决的根本原因。

鱼眼模型:Kannala-Brandt

鱼眼镜头的视场角可以达到 180° 甚至更大,此时针孔透视投影(r=ftanθr = f\tan\theta)会发散。Kannala-Brandt 模型转而将图像半径直接表示为入射角的多项式:

r(θ)=k1θ+k2θ3+k3θ5+k4θ7r(\theta) = k_1\theta + k_2\theta^3 + k_3\theta^5 + k_4\theta^7

这个通用模型可以拟合等距、等立体角以及其他鱼眼投影方式,是 OpenCV(cv::fisheye)中实现的鱼眼模型,也被 ORB-SLAM3 等系统用于广角相机。请注意其结构:它是对投影函数本身的替代,其中奇数次幂级数所扮演的角色,相当于畸变多项式在针孔相机模型中所扮演的角色。

双球面模型与全方位模型

**双球面模型(double-sphere model)**将 3D 点先通过两个单位球体投影,再进行一次针孔投影。它拟合鱼眼镜头的精度与 Kannala-Brandt 模型相当,同时具有闭式、计算开销低的反投影(unprojection)——这在实时 VIO 中是一个实用的优势,因为反投影(像素到射线)需要在每一帧的每个特征上运行;而像 Kannala-Brandt 这样的多项式模型对同样的操作需要迭代求根。该模型源自 Basalt VIO 系统背后的团队。

全方位模型(例如统一相机模型,它通过一个带有镜面/球面偏移参数 ξ\xi 的单一球体进行投影,以及 Scaramuzza 的多项式模型)覆盖了折反射相机(带镜面的相机)以及超广角鱼眼镜头。Kalibr 和 OpenCV 的 omnidir 模块等标定工具支持这些模型。

卷帘快门感知

大多数低成本 CMOS 相机使用卷帘快门:图像的各行是依次曝光的,而不是同时曝光。当相机或场景快速运动时,每一行的拍摄位姿都略有不同,从而产生偏斜和抖动。假设每帧只有一个位姿的几何模型在此时是错误的:在第 vv 行观测到的点实际上是在如下时刻拍摄的

t(v)=t0+vHtreadoutt(v) = t_0 + \frac{v}{H}\,t_{\text{readout}}

其中 t0t_0 是帧读出的起始时间,HH 是图像高度,treadoutt_{\text{readout}} 是总读出时间。高速 SLAM 系统要么使用全局快门硬件,要么显式地建模每一行的拍摄时间,在读出过程中对相机位姿进行插值。至少应该在信任几何计算之前,先弄清楚自己的相机是哪种快门类型。

常见陷阱

对SLAM的意义

把鱼眼图像硬塞进针孔+畸变模型,或者在高速运动平台上忽略卷帘快门效应,都会在不知不觉中破坏流水线中的每一个测量值。选择正确的相机模型——并使用支持该模型的工具进行标定——是在无人机、AR 头显和汽车环视系统上实现精确跟踪的前提条件,而这些平台几乎总是使用广角或鱼眼光学系统。

相关条目