相机模型怎么选:针孔+畸变、鱼眼、双球、EUCM、FOV 与除法模型
介绍常用相机模型的数学形式与适用范围:针孔加畸变(含有理与薄棱镜扩展)、Kannala-Brandt 鱼眼、双球、EUCM、FOV 和 HALCON 除法模型,并说明如何避免过拟合、如何理解参数间的强相关。
要点
- 普通工业镜头:针孔 + 5 参数畸变(k1 k2 p1 p2 k3)是默认选择;畸变很小的镜头可以只用 k1 k2。
- 广角、畸变大的镜头:考虑 8 参数有理模型;精度要求极高且数据充分时,再加薄棱镜项。
- 视场接近或超过 180° 的鱼眼:选 Kannala-Brandt、双球(DS)或 EUCM。
- 需要与 HALCON 交换参数:选除法模型。
- 参数越多越容易过拟合:用留出数据验证,查看参数标准差和相关性,不要只看 RMS。
相机模型描述的是什么?
相机模型是一个函数:输入相机坐标系中的三维点 (X, Y, Z),输出它在图像上的像素坐标 (u, v)。各种模型都包含焦距 fx、fy 和主点 cx、cy,区别在于如何把一条三维光线映射到图像平面,以及如何描述实际镜头与理想模型之间的偏差。
BDB 相机标定工作台支持下文介绍的全部模型。
镜头畸变从哪里来?
理解畸变的成因,有助于判断该用哪些参数:
- 径向畸变:由镜头的光学设计决定,与光阑位置、镜片曲面形状有关,表现为像点沿径向偏离理想位置。广角镜头多为桶形,部分长焦镜头为枕形。它是绝大多数镜头的主要畸变,对应 k1、k2、k3 等参数。
- 切向畸变(又称偏心畸变):镜片的光轴彼此不重合,像点除了径向偏移,还有垂直于径向的偏移,对应 p1、p2。
- 薄棱镜畸变:镜片或传感器相对光轴有微小倾斜,效果类似在光路中加入一片很薄的棱镜,对应 s1–s4。
制造和装配质量较好的工业镜头,切向和薄棱镜分量通常很小,径向畸变占绝对主导。
针孔 + 畸变(Brown-Conrady,与 OpenCV 一致)
先做透视投影:x = X / Z,y = Y / Z,r² = x² + y²。然后加入径向畸变(k 项)和切向畸变(p 项):
x_d = x·(1 + k1·r² + k2·r⁴ + k3·r⁶) + 2·p1·x·y + p2·(r² + 2x²)y_d = y·(1 + k1·r² + k2·r⁴ + k3·r⁶) + p1·(r² + 2y²) + 2·p2·x·y- 最后换算成像素:
u = fx · x_d + cx,v = fy · y_d + cy。
常用变体如下:
| 变体 | 畸变参数个数 | 适用 |
|---|---|---|
| 理想针孔 | 0 | 畸变可以忽略的镜头,或作为远心镜头的近似 |
| 径向 k1 k2 | 2 | 低畸变镜头 |
| 径向 + 切向 | 4(k1 k2 p1 p2) | 对应 Kalibr 的 pinhole-radtan |
| 标准 5 参数 | 5(k1 k2 p1 p2 k3) | 大多数工业镜头的默认选择 |
| 有理模型 | 8(增加 k4 k5 k6) | 广角、畸变大的镜头 |
| 有理 + 薄棱镜 | 12(再增加 s1–s4) | 镜片或传感器存在倾斜、偏心,高精度测量 |
有理模型把径向因子写成分式:(1 + k1·r² + k2·r⁴ + k3·r⁶) / (1 + k4·r² + k5·r⁴ + k6·r⁶)。分母让它能描述更强的畸变,但在数据覆盖不到的区域,分母可能接近 0,外推时表现很差。所以使用有理模型时,特征点必须覆盖到画面的边角。
薄棱镜项在 x 方向加上 s1·r² + s2·r⁴,y 方向加上 s3·r² + s4·r⁴,用来描述镜片或传感器的轻微倾斜。它很容易与切向畸变、主点相关,只有在数据量大、覆盖好,并且残差中确实存在对应规律时才值得启用。
对视场较小、畸变较轻的镜头,k3 往往约束不住,可以固定为 0(OpenCV 中对应 CALIB_FIX_K3 选项)。
关于远心镜头:物方远心镜头的成像本质上是平行投影,放大倍率不随距离变化。用理想针孔模型近似时,等效焦距和拍摄距离都会变得很大,而且二者无法分开,只有它们的比值(即放大倍率)是确定的。用这种近似做测量是可以的,但不要把解出的“焦距”和“距离”当成真实的物理量。
鱼眼:Kannala-Brandt(OpenCV fisheye)
针孔模型的像高与 tanθ 成正比(θ 为光线与光轴的夹角),θ 接近 90° 时像高趋于无穷,无法描述大视场。Kannala-Brandt 模型改为对角度做多项式:
θ_d = θ × (1 + k1·θ² + k2·θ⁴ + k3·θ⁶ + k4·θ⁸)
像点到主点的距离(归一化后)等于 θ_d,再乘以 fx、fy 换算成像素。k1–k4 全为 0 时就是等距投影。该模型与 OpenCV 的 fisheye 模块、Kalibr 的 pinhole-equi 一致,常用于视场在 120° 以上、接近 180° 的鱼眼镜头。
双球模型(Double Sphere)
双球模型用两个参数 ξ、α 描述大视场投影:
d1 = sqrt(X² + Y² + Z²)d2 = sqrt(X² + Y² + (ξ·d1 + Z)²)u = fx · X / (α·d2 + (1 − α)·(ξ·d1 + Z)) + cx,v 同理。
它能描述超过 180° 的视场,投影和反投影都有解析式,计算量小,常用于视觉 SLAM 和环视多相机系统。
使用双球模型时要特别注意 fx 与 ξ 的强相关。在光轴附近 d1 ≈ Z,分母约为 (1 + ξ)·Z,有效焦距约为 fx / (1 + ξ)。也就是说,画面中央的数据只能确定 fx 与 ξ 的这个组合,二者各自的数值要靠大角度区域的数据来区分。因此双球模型的 fx 和 ξ 标准差往往都比较大,投影本身却可以很准确——评价时应看投影不确定度,而不是单个参数。两次标定的 fx、ξ 相差较大,也不一定说明标定失败。
EUCM(增强统一相机模型)
d = sqrt(β·(X² + Y²) + Z²)u = fx · X / (α·d + (1 − α)·Z) + cx,v 同理。
EUCM 有 α、β 两个参数,适用于鱼眼镜头和折反射相机(带反射镜的全景相机),同样有解析的反投影。把公式在光轴附近展开可以发现,中等角度范围内起主要作用的是 α 与 β 的乘积,因此二者强相关,初值的选取会影响收敛。
FOV 模型
FOV 模型只有一个畸变参数 ω:
r_d = arctan(2 · r_u · tan(ω/2)) / ω
其中 r_u、r_d 分别是归一化平面上无畸变和有畸变的半径。它参数少、计算简单,适合中等到较大视场的广角镜头,在一些视觉里程计系统中使用。参数少也意味着灵活性有限,镜头的畸变形状与模型不符时,残差会呈现明显的规律。
除法模型(HALCON area_scan_division)
除法模型用一个参数 κ 描述径向畸变,形式是由畸变坐标求无畸变坐标:
x_u = x_d / (1 + κ · r_d²),y 同理,r_d 为畸变后的半径。
反方向也有闭式解。它与 HALCON 的 area_scan_division 相机模型等价。需要注意单位:HALCON 的 κ 定义在传感器平面上,单位是 1/m²,与像元尺寸、焦距有关;与归一化坐标下的 κ 换算时需要知道像元尺寸,κ_HALCON = κ / f²,其中 f 是以米为单位的焦距。BDB 相机标定工作台可以完成这一换算。使用 HALCON 的用户可参考 Halcon 兼容标定板。
鱼眼图像能“完全去畸变”吗?
不能在保留全部视场的同时做到。针孔投影的像高与 tanθ 成正比,视场接近 180° 时,边缘需要无限大的画面。把鱼眼图像校正成针孔图像时,只能保留中间一部分视场,而且越靠边缘拉伸越严重、细节越模糊。
需要保留大视场时,可以改用柱面投影、等距柱状(经纬度)投影等方式展开;更好的做法往往是不生成去畸变图像,直接在鱼眼模型下计算,例如把检测到的特征像素反投影成三维光线,再做后续的几何计算。
不同模型的参数能互相比较、互相转换吗?
不能直接比较。 同一个镜头用不同模型标定,参数的含义各不相同,连 fx 都不一样:例如双球模型的 fx 与针孔模型的 fx 相差约 (1 + ξ) 倍。比较两个模型时,应比较它们对同一组光线的投影结果,而不是比较参数。
可以近似转换。 常用的做法是在图像上取足够密的一组像素点,用原模型把它们反投影成光线,再求目标模型的参数,使这些光线经目标模型投影后与原像素位置之差最小。转换是否可靠,要看拟合残差在整幅图像上的分布:两个模型能描述的畸变形状不同时,误差通常集中在画面边角。BDB 相机标定工作台在标定非 OpenCV 模型时,也是先用 OpenCV 求出可靠的初解,再用这种方法转换为目标模型的初值,最后整体优化。
哪些参数可以固定?
固定参数相当于给模型加先验约束,能减少过拟合,但前提是这个约束本身成立:
- fx = fy:像元为正方形且没有特殊的光学设计时可以考虑,参数少一个;
- k3 或更高阶系数:视场小、畸变轻时常固定为 0;
- 切向畸变:数据量少、覆盖一般时,可以先固定为 0,观察残差是否出现规律;
- 主点:一般不建议固定在图像中心。它与图像中心可能有可观的偏差,强行固定会把误差转嫁给其他参数。只有在数据确实不足、又有可靠先验时才考虑。
BDB 相机标定工作台支持逐个参数固定,以及 fx = fy 的约束。
怎么选?一个决策顺序
- 看视场。 对角视场在约 100° 以内,先试针孔 + 5 参数;接近或超过 120° 时,直接用鱼眼类模型。这只是经验分界,具体取决于镜头设计。
- 看残差。 先用简单模型标定,观察残差分布:如果在图像中呈径向或旋涡状规律,再逐步增加参数或更换模型。
- 看验证误差。 留出几张图像不参与标定,比较各模型在这些图像上的误差。参数多的模型训练 RMS 不会更高,验证误差却可能变大——这就是过拟合。
- 看参数质量。 如果新增参数的标准差与它本身的数值相当,说明数据约束不住它,应当固定或去掉。
- 看下游兼容性。 参数最终要交给哪个软件或设备使用,就选它支持的模型,或者确认能够准确转换。
哪些迹象说明过拟合了?
- 增加了很多参数,训练 RMS 却只下降了一点;
- 留出图像的误差明显高于训练 RMS;
- 高阶参数的标准差很大,或者数值大得异常;
- 去畸变后,画面边缘出现不自然的拉伸或弯曲;
- 重复标定时,高阶参数的数值大幅跳动。
一个实用的原则是:在验证误差相近的前提下,优先选参数更少的模型。少参数的模型更稳定,重复标定的结果更一致,也更容易在不同软件和设备之间传递。