Camera models beyond pinhole
带径向-切向畸变的针孔模型在窄视场和中等视场下表现良好,但许多 SLAM 平台使用的镜头和传感器会打破它的假设。广视场镜头能看到更多场景——这意味着更大的视差、更多可跟踪的特征,以及在快速旋转时更好的鲁棒性——但代价是需要不同的投影模型。
投影函数一览
所有中心相机模型都可以通过图像半径 如何随入射角 (入射光线与光轴之间的夹角)增长来比较:
| 模型 | 当 时的行为 | |
|---|---|---|
| 透视(针孔) | 发散——无法表示视场角 ≥ 180° | |
| 等距鱼眼 | 有限 | |
| 等立体角鱼眼 | 有限 | |
| 体视投影 | 有限 |
当入射光线接近与光轴成 90° 时,针孔投影会发散,这正是鱼眼镜头需要专门的模型,而不能仅靠更高阶畸变多项式来解决的根本原因。
鱼眼模型:Kannala-Brandt
鱼眼镜头的视场角可以达到 180° 甚至更大,此时针孔透视投影()会发散。Kannala-Brandt 模型转而将图像半径直接表示为入射角的多项式:
这个通用模型可以拟合等距、等立体角以及其他鱼眼投影方式,是 OpenCV(cv::fisheye)中实现的鱼眼模型,也被 ORB-SLAM3 等系统用于广角相机。请注意其结构:它是对投影函数本身的替代,其中奇数次幂级数所扮演的角色,相当于畸变多项式在针孔相机模型中所扮演的角色。
双球面模型与全方位模型
**双球面模型(double-sphere model)**将 3D 点先通过两个单位球体投影,再进行一次针孔投影。它拟合鱼眼镜头的精度与 Kannala-Brandt 模型相当,同时具有闭式、计算开销低的反投影(unprojection)——这在实时 VIO 中是一个实用的优势,因为反投影(像素到射线)需要在每一帧的每个特征上运行;而像 Kannala-Brandt 这样的多项式模型对同样的操作需要迭代求根。该模型源自 Basalt VIO 系统背后的团队。
全方位模型(例如统一相机模型,它通过一个带有镜面/球面偏移参数 的单一球体进行投影,以及 Scaramuzza 的多项式模型)覆盖了折反射相机(带镜面的相机)以及超广角鱼眼镜头。Kalibr 和 OpenCV 的 omnidir 模块等标定工具支持这些模型。
卷帘快门感知
大多数低成本 CMOS 相机使用卷帘快门:图像的各行是依次曝光的,而不是同时曝光。当相机或场景快速运动时,每一行的拍摄位姿都略有不同,从而产生偏斜和抖动。假设每帧只有一个位姿的几何模型在此时是错误的:在第 行观测到的点实际上是在如下时刻拍摄的
其中 是帧读出的起始时间, 是图像高度, 是总读出时间。高速 SLAM 系统要么使用全局快门硬件,要么显式地建模每一行的拍摄时间,在读出过程中对相机位姿进行插值。至少应该在信任几何计算之前,先弄清楚自己的相机是哪种快门类型。
常见陷阱
- 把鱼眼镜头强行套入径向-切向针孔模型:在图像中心附近拟合得很好,但越靠近图像边缘就失败得越严重——如果标定视角避开了边缘区域,重投影误差统计数字看起来会有欺骗性的良好。
- 将鱼眼图像去畸变为针孔视图会丢失广视场(裁剪掉部分图像)或使外围区域被极度拉伸;现代系统通常保留原生模型,转而调整求解器来适配。
- 不同工具之间约定的混用:同一个镜头分别在 Kalibr、OpenCV 以及某个 SLAM 系统的配置中标定时,可能使用不同的参数顺序和模型名称;应通过重投影点来验证,而不是凭肉眼判断数字。
对SLAM的意义
把鱼眼图像硬塞进针孔+畸变模型,或者在高速运动平台上忽略卷帘快门效应,都会在不知不觉中破坏流水线中的每一个测量值。选择正确的相机模型——并使用支持该模型的工具进行标定——是在无人机、AR 头显和汽车环视系统上实现精确跟踪的前提条件,而这些平台几乎总是使用广角或鱼眼光学系统。