4. 畸变类型

聊完相机模型,咱们得面对一个现实——镜头不是完美的。任何工业镜头都会引入畸变,只是程度不同。说白了,畸变就是光线穿过镜头时,因为镜片形状、装配误差等原因,成像位置发生了偏移。

我刚开始做视觉项目时,总觉得标定是“走个过场”。直到有一次,一个高精度测量项目死活达不到0.01mm的重复精度。折腾了两天,最后发现是畸变没校正干净。嗯,从那以后,我再也不敢轻视畸变模型了。

工业相机标定中,我们主要处理三类畸变:径向畸变、切向畸变和薄棱镜畸变。下面我一个个拆开讲。

4.1 径向畸变:桶形与枕形

径向畸变是最常见、影响最大的畸变。它沿着镜头半径方向产生,离图像中心越远,畸变越明显。

为什么会这样?因为实际镜头的曲率不是理想的,光线在边缘的折射角度和中心不一样。你想想看,一个球面透镜,边缘的放大率和中心能一样吗?

径向畸变分两种:

  • 桶形畸变:图像边缘向外膨胀,直线变成向外弯曲的弧线。常见于广角镜头、短焦距镜头。
  • 枕形畸变:图像边缘向内收缩,直线变成向内弯曲的弧线。常见于长焦镜头、变焦镜头长焦端。

关键点:径向畸变只与像素到光心的距离有关,与方向无关。数学上用泰勒级数展开来建模:

x_corrected = x * (1 + k1*r² + k2*r⁴ + k3*r⁶)
y_corrected = y * (1 + k1*r² + k2*r⁴ + k3*r⁶)

其中 r 是像素到光心的距离,k1、k2、k3 是径向畸变系数。一般用 k1、k2 就够了,k3 只在鱼眼镜头等大畸变场景才需要。

我在项目中遇到过一批工业镜头,出厂报告上写着“畸变小于0.1%”。结果上机一测,边缘的桶形畸变导致定位误差超过5个像素。后来发现是镜头和相机接口的机械公差导致的。所以,不要迷信出厂参数,自己标定才是王道。

4.2 切向畸变

切向畸变,也叫离心畸变。它是因为镜头的光学中心和图像传感器的中心不重合,或者镜片组的光轴不共线造成的。

说白了,就是镜头装歪了。在工业相机中,C接口的螺纹配合、镜头座的加工精度,都会引入切向畸变。

切向畸变的数学模型:

x_corrected = x + [2*p1*x*y + p2*(r² + 2*x²)]
y_corrected = y + [p1*(r² + 2*y²) + 2*p2*x*y]

其中 p1、p2 是切向畸变系数。注意,切向畸变和径向畸变是叠加的,标定时需要同时求解。

我的经验:在普通工业镜头中,切向畸变通常比径向畸变小一个数量级。但如果你用的是高分辨率相机(比如5000万像素以上),或者镜头是多次转接的,切向畸变就不能忽略了。我曾经在一个线阵相机项目中,因为镜头安装座加工误差,切向畸变导致图像拼接出现周期性错位,排查了很久才发现。

4.3 薄棱镜畸变

薄棱镜畸变,这个名字听起来有点玄乎。它是因为镜头设计或制造中的微小缺陷,导致光线在通过镜头时产生了类似棱镜的偏折效果。

这种畸变在消费级镜头中比较常见,在高质量的工业镜头中通常很小。但如果你做的是亚像素级别的测量,或者用到了非常规的光路设计,薄棱镜畸变就可能成为瓶颈。

薄棱镜畸变的模型:

x_corrected = x + (s1*r² + s2*r⁴ + ...)
y_corrected = y + (s3*r² + s4*r⁴ + ...)

实际上,在OpenCV等主流标定库中,默认不包含薄棱镜畸变模型。因为它的影响通常被径向和切向畸变覆盖了。只有在极高精度的场景下,才需要单独建模。

避坑指南:我曾经在一个晶圆检测项目中,用了高倍率显微镜头。标定后发现残差始终在0.3像素左右下不去。后来查阅文献,发现是薄棱镜畸变在作祟。加上薄棱镜模型后,残差降到了0.05像素。所以,如果你的标定残差一直降不下来,可以考虑是不是薄棱镜畸变没处理。

4.4 三种畸变的对比与选择

下面这张表,是我在实际项目中总结的,帮你快速判断该用哪种畸变模型:

畸变类型 产生原因 影响程度 参数数量 适用场景
径向畸变 镜片曲率非理想 最大(通常占畸变90%以上) 2~3个(k1, k2, k3) 所有镜头,必选
切向畸变 镜头/传感器装配误差 中等(通常占畸变5~10%) 2个(p1, p2) 高精度测量、多相机系统
薄棱镜畸变 镜片设计/制造缺陷 很小(通常占畸变1%以下) 4个(s1~s4) 亚像素级精度、显微镜头

我个人习惯是:默认使用径向+切向模型(共5个畸变参数)。如果标定残差大于0.2像素,再考虑加入薄棱镜模型。不要一上来就用全参数模型,参数越多,标定越不稳定。

4.5 畸变模型的知识体系

为了让你更直观地理解这三种畸变的关系,我画了一张结构图:

畸变类型知识体系 镜头畸变 径向畸变 切向畸变 薄棱镜畸变 桶形畸变 枕形畸变 离心畸变 棱镜效应 实际标定中的选择策略 • 默认使用径向(k1,k2) + 切向(p1,p2) 共4个参数 • 残差 > 0.2 像素时,增加径向 k3 参数 • 残差仍不达标,考虑加入薄棱镜模型(s1~s4)

4.6 畸变校正的工程要点

最后,分享几个我在项目中踩过的坑:

  1. 标定板要覆盖整个视场。畸变在边缘最严重,如果标定板只拍了中间区域,边缘的畸变参数就估计不准。我一般要求标定板图像占满视场的80%以上。
  2. 不同焦距分别标定。变焦镜头在不同焦距下,畸变参数完全不同。不要偷懒只标一个焦距。
  3. 温度影响不可忽视。工业现场温度变化大,镜头和相机材料的热胀冷缩会改变畸变参数。我曾经在夏天标定好的系统,冬天精度就漂了。后来加了温度补偿,才稳定下来。
  4. 畸变校正会损失边缘视野。校正后的图像,边缘部分会被裁剪或拉伸。设计视觉系统时,要预留这个余量。

一句话总结:径向畸变是主角,切向畸变是配角,薄棱镜畸变是龙套。先把主角搞定,再考虑配角,龙套能省则省。