2. 鱼眼相机模型:针孔模型 vs 鱼眼模型、等距投影模型、畸变参数(k1,k2,k3,k4)
做环视算法这几年,我接触最多的就是鱼眼相机。说实话,刚入行那会儿我也纳闷——为什么不用普通的针孔相机?后来在车厂做项目时才发现,一个鱼眼镜头能覆盖 180° 甚至更大的视野,四个鱼眼就能把车周围看全。但代价就是,它的成像模型比针孔复杂得多。
这一节,我们就来掰扯清楚鱼眼相机的数学模型。你搞懂了这些,后面的标定和去畸变才能做得顺手。
2.1 针孔模型 vs 鱼眼模型:本质区别在哪?
先说说针孔模型。它假设光线是直线传播的,穿过小孔后在成像平面上投影。这个模型简单、直观,但有个硬伤——视野越大,成像平面就得越大。你想想看,要是想拍 180°,成像平面得无限大,这显然不现实。
鱼眼模型就不一样了。它通过镜头组把光线「弯折」到一个小尺寸的传感器上。说白了,就是故意引入畸变,来换取大视野。
核心区别一句话:针孔模型是「直线投影」,鱼眼模型是「非线性投影」。鱼眼镜头用畸变换视野,针孔镜头用视野换保真度。
我在实际项目中做过对比:同样一个 1/2.3 英寸的传感器,针孔镜头最多做到 60° 视场角,而鱼眼镜头轻松做到 190°。代价是什么?图像边缘的物体被严重拉伸,你看着会觉得很「扭曲」。
2.2 等距投影模型:鱼眼相机的数学基础
鱼眼相机的投影方式有好几种,但环视算法里最常用的是 等距投影模型。它的数学表达式很简单:
r = f * θ
其中:
- r:像点到图像中心的距离(像素单位)
- f:焦距(像素单位)
- θ:入射光线与光轴的夹角(弧度)
你看,这个公式意味着:入射角每增加一度,像点就往外移动固定的像素数。这跟针孔模型的 r = f * tan(θ) 完全不同。当 θ 接近 90° 时,tan(θ) 会趋向无穷大,而 θ 本身只有 1.57 弧度——这就是鱼眼能覆盖大视野的数学原因。
我的经验:在标定鱼眼相机时,我习惯先用等距模型做初标定。因为它的参数少、收敛快,能快速得到一个可用的初始值。然后再用完整的多项式模型做精标定。
除了等距投影,还有几种常见的鱼眼投影模型:
| 模型名称 | 投影公式 | 特点 |
|---|---|---|
| 等距投影 | r = f * θ | 角度与像距线性,环视最常用 |
| 等立体角投影 | r = 2f * sin(θ/2) | 保持立体角不变,天文摄影常用 |
| 正交投影 | r = f * sin(θ) | 边缘压缩严重,很少用于环视 |
| 体视投影 | r = 2f * tan(θ/2) | 保持角度不变,全景拼接常用 |
环视算法里,我们几乎只用等距投影。为什么?因为它的畸变分布最均匀,后续做鸟瞰变换时误差最小。
2.3 畸变参数 k1,k2,k3,k4:鱼眼畸变的数学描述
实际鱼眼镜头不可能完美符合等距投影。镜头加工有公差、装配有误差,所以我们需要用多项式来拟合真实的畸变曲线。
OpenCV 里用的鱼眼畸变模型是这样的:
θ_d = θ * (1 + k1 * θ² + k2 * θ⁴ + k3 * θ⁶ + k4 * θ⁸)
然后:
r = f * θ_d
这里的 k1, k2, k3, k4 就是畸变参数。它们的作用是修正理论模型和实际镜头之间的偏差。
注意:鱼眼相机的畸变参数是 4 个(k1~k4),而普通针孔相机只需要 2 个(k1,k2)或者 3 个(k1,k2,k3)。千万别搞混了!我曾经见过有人用针孔模型的标定方法去标鱼眼,结果畸变校正得一塌糊涂。
这些参数的具体含义:
- k1:主要控制径向畸变的幅度,是影响最大的参数
- k2:修正高阶畸变,通常比 k1 小一个数量级
- k3, k4:更高阶的修正项,对于边缘畸变明显的镜头很重要
我在项目中遇到过一款国产鱼眼镜头,k1 大约是 -0.15,k2 是 0.02,k3 和 k4 都在 1e-3 量级。如果只标 k1 和 k2,边缘的畸变校正后还有 3-4 个像素的残差。加上 k3,k4 后,残差降到了 0.5 像素以内。
2.4 鱼眼相机模型完整流程
下面这张图展示了从 3D 世界点到鱼眼图像像素的完整流程:
2.5 实际标定中的注意事项
做鱼眼标定时,有几个坑我踩过,分享给你:
- 棋盘格要足够大:鱼眼视野大,小棋盘格在边缘根本看不清。我一般用 A2 大小的棋盘格,格子边长 30mm 以上。
- 覆盖全视野:标定图片必须覆盖整个视场角,尤其是边缘。我曾经只拍了中心区域,结果标出来的参数在边缘完全不能用。
- 图片数量要够:鱼眼参数多,至少需要 20-30 张有效图片。我习惯拍 40 张,然后挑出 25 张质量好的。
- 注意重投影误差:标定完成后一定要看重投影误差。鱼眼相机的重投影误差一般在 0.3-0.8 像素之间。如果超过 1 个像素,说明标定质量有问题。
我的习惯:标定完成后,我会用一张棋盘格放在车前方 2 米处,拍一张图,然后用标定参数做去畸变。如果棋盘格的直线变直了,说明标定没问题。这个方法简单粗暴,但非常有效。
2.6 小结
鱼眼相机模型的核心就三件事:
- 理解等距投影
r = f * θ为什么能覆盖大视野 - 掌握 k1~k4 四个畸变参数的作用
- 知道完整的成像流程:世界点 → 相机坐标系 → 归一化平面 → 畸变校正 → 投影到像面