1. 鱼眼图像校正概述
鱼眼镜头这东西,我第一次接触是在一个全景监控项目里。甲方要求一个摄像头看住整个大厅,普通镜头根本做不到,最后只能上鱼眼。结果画面是拍全了,但人都是弯的——嗯,这就是我们今天要聊的核心问题。
说白了,鱼眼图像校正就是把那些扭曲得不成样子的画面,还原成我们肉眼看着舒服的样子。这活儿看着简单,做起来门道不少。
鱼眼镜头的成像原理
普通镜头追求的是「所见即所得」,光线直线传播,成像符合小孔成像模型。鱼眼镜头不一样,它故意让光线弯着走。
怎么做到的呢?前组镜片做得特别凸,像个半球一样鼓出来。光线射进来先被狠狠折射一次,然后才进入后面的镜组。这样一来,原本只能看到 50° 视野的传感器,硬生生能拍到 180° 甚至 220°。
关键点:鱼眼镜头用「压缩边缘」换「广阔视野」。画面中心区域保持得还行,越往边缘走,压缩越厉害,畸变越明显。
我习惯把鱼眼镜头的成像模型分成两类:
- 等距投影模型:入射角与像高成正比。这是最常见的模型,OpenCV 里用的就是它。
- 等立体角投影模型:入射角与像高满足正弦关系。某些全景相机用这个。
- 正交投影模型:入射角与像高满足正弦关系,但角度范围有限。
- 体视投影模型:保持局部角度不变,适合做全景拼接。
实际项目中,我遇到过最头疼的事:同一款镜头,不同批次的光学参数居然有差异。所以千万别信厂家给的那张参数表,老老实实自己标定才是正道。
畸变类型:径向畸变与切向畸变
鱼眼镜头的畸变不是一种,是两种叠加的结果。我刚开始做校正时没分清这两者,结果调了半天效果都不对。
| 畸变类型 | 产生原因 | 表现特征 | 校正难度 |
|---|---|---|---|
| 径向畸变 | 镜片曲率导致光线弯曲 | 直线变曲线,越靠边缘越明显 | 中等,可用多项式拟合 |
| 切向畸变 | 镜片与传感器不平行 | 画面倾斜、梯形失真 | 较低,通常用仿射变换 |
径向畸变
这是鱼眼镜头的主要畸变。你想想看,一个直线从画面中心延伸到边缘,在鱼眼图像里就变成了一条弧线。为什么会这样?因为镜头对边缘光线的折射率比中心大。
数学上通常用泰勒级数展开来描述:
// 径向畸变模型
x_distorted = x * (1 + k1*r² + k2*r⁴ + k3*r⁶)
y_distorted = y * (1 + k1*r² + k2*r⁴ + k3*r⁶)
// 其中 r² = x² + y²,k1、k2、k3 是畸变系数
我记得有一次做车载环视系统,用了 4 个鱼眼镜头。每个镜头的 k1、k2 都不一样,最离谱的那个 k1 值比标称大了 30%。从那以后,我养成了一个习惯:每个镜头单独标定,绝不复用参数。
避坑指南:我曾经因为偷懒,用同一个标定文件处理两个同型号镜头,结果拼接缝处差了 15 个像素。后来老老实实逐个标定,问题才解决。鱼眼镜头个体差异比你想象的大得多。
切向畸变
切向畸变相对好理解。镜片安装时不可能平行于传感器平面,哪怕偏了 0.1°,画面就会出现梯形失真。
校正公式也不复杂:
// 切向畸变模型
x_distorted = x + (2*p1*x*y + p2*(r² + 2*x²))
y_distorted = y + (p1*(r² + 2*y²) + 2*p2*x*y)
// p1、p2 是切向畸变系数
实际项目中,切向畸变通常比径向畸变小一个数量级。但别忽视它——在精度要求高的场景(比如视觉测量),这点偏差足以让结果不可用。
校正的必要性与应用场景
为什么要校正?说白了,鱼眼图像虽然看得广,但人眼看着难受,机器也认不出来。我见过一个安防项目,人脸识别算法在鱼眼图像上直接崩溃——因为人脸都变形了,特征点根本对不上。
校正的必要性体现在三个层面:
- 人眼可读性:监控画面、全景照片,用户需要看到正常的画面。
- 算法兼容性:目标检测、人脸识别、SLAM 等算法,大多假设输入是透视图像。
- 测量精度:畸变会引入像素级误差,影响距离、角度等测量结果。
应用场景我列几个典型的:
- 车载环视系统:4-6 个鱼眼镜头拼接成 360° 鸟瞰图,每个镜头必须先校正再拼接。
- 安防监控:一个鱼眼摄像头覆盖整个大厅,校正后可以分区查看。
- 全景相机:消费级全景相机(如 Insta360)内部都在做实时校正。
- 视觉 SLAM:鱼眼镜头视野大,特征点丰富,但必须先校正才能用传统算法。
- 工业检测:管道内壁检测、大范围表面缺陷检测。
个人经验:我建议你在选校正算法前,先想清楚应用场景。如果是实时视频流,就别用迭代优化算法,太慢了。如果是离线处理,精度优先,计算时间可以放宽。场景决定算法,这个顺序别搞反了。
下面这张图是我自己整理的鱼眼图像校正知识体系,帮你快速建立整体认知:
嗯,这一章的内容就到这里。鱼眼图像校正不是一锤子买卖,从理解成像原理到标定畸变系数,每一步都有坑。后面我们会深入具体的校正算法,到时候再细聊。