4、切向畸变原理:镜头与传感器不平行导致的畸变
聊完径向畸变,咱们来看看另一种常见的畸变——切向畸变。说实话,很多初学者容易忽略它,觉得径向畸变校正完就万事大吉了。但我在实际项目中吃过这个亏,有一次做高精度测量,径向校正后误差还是超了,排查了半天才发现是切向畸变在捣乱。
4.1 切向畸变的物理成因
切向畸变的根源很简单:镜头的光学中心与成像传感器平面不平行。你想想看,镜头安装时哪怕歪了一点点,光线穿过镜头后到达传感器的路径就会发生偏移。
为什么会这样?主要有两个原因:
- 制造公差:镜头模组在组装时,镜片与传感器之间很难做到平行
- 物理冲击:设备摔过或长期震动,可能导致镜头位置发生微小的偏移
我记得有一次帮客户调试工业相机,他们反映画面边缘总有一侧模糊。我拆开检查发现,镜头固定环松了半圈,导致传感器平面倾斜了不到0.1度。就这点偏差,切向畸变就明显到肉眼可见。
核心结论:切向畸变本质上是镜头与传感器之间的"对位误差"在成像上的体现。它不像径向畸变那样对称,而是呈现非对称的拉伸或压缩效果。
4.2 Brown-Conrady模型中的切向畸变参数
说到数学模型,业界最通用的就是Brown-Conrady畸变模型。这个模型把畸变拆成径向和切向两部分,切向部分用两个参数来描述:p1 和 p2。
公式长这样:
// 切向畸变校正公式
x_corrected = x + [2 * p1 * x * y + p2 * (r² + 2 * x²)]
y_corrected = y + [p1 * (r² + 2 * y²) + 2 * p2 * x * y]
// 其中:
// (x, y) —— 畸变图像上的像素坐标(归一化后)
// (x_corrected, y_corrected) —— 校正后的坐标
// r² = x² + y² —— 像素到光心的距离平方
// p1, p2 —— 切向畸变系数
说白了,这个公式就是在原始坐标上加上一个偏移量。偏移量的大小和方向由 p1、p2 以及像素位置共同决定。
4.3 参数p1和p2的物理含义
这两个参数到底代表什么?我习惯这样理解:
| 参数 | 物理含义 | 主导影响方向 |
|---|---|---|
| p1 | 传感器在水平方向上的倾斜分量 | 主要影响垂直方向的偏移 |
| p2 | 传感器在垂直方向上的倾斜分量 | 主要影响水平方向的偏移 |
注意看公式里的交叉项 x * y,这就是切向畸变非对称性的来源。它不像径向畸变那样只跟距离有关,而是跟坐标的乘积挂钩。
我的经验:在OpenCV的标定结果中,p1 和 p2 的数值通常比径向畸变系数 k1、k2 小1-2个数量级。如果标定出来的 p1、p2 特别大(比如超过0.1),多半是标定板图像质量有问题,或者相机本身有机械故障。
4.4 切向畸变对图像的影响分析
切向畸变到底会让图像变成什么样?我画了一张示意图,帮你直观理解:
从图上你能看到,切向畸变会让原本方方正正的网格变成梯形或平行四边形。具体来说:
- 边缘拉伸:图像的一侧被拉长,另一侧被压缩
- 非对称性:畸变程度在不同方向上不一样,不像径向畸变那样中心对称
- 中心稳定:图像中心区域几乎不受影响,越往边缘畸变越明显
曾经踩过的坑:我在做双目视觉测距时,左右相机分别标定后,发现视差图总是有系统性偏差。排查了三天,最后发现是其中一个相机的切向畸变参数 p1 达到了0.08,导致左右图像校正后对应点不在同一水平线上。从那以后,我每次标定完都会先看一眼 p1、p2 的数值,超过0.05就重新标定。
4.5 切向畸变 vs 径向畸变:一张表说清楚
很多同学容易把这两种畸变搞混。我整理了一个对比表,你一看就明白:
| 对比维度 | 径向畸变 | 切向畸变 |
|---|---|---|
| 根本原因 | 镜头透镜曲率不完美 | 镜头与传感器不平行 |
| 对称性 | 中心对称(桶形/枕形) | 非对称(梯形/平行四边形) |
| 主要参数 | k1, k2, k3 | p1, p2 |
| 影响区域 | 从中心到边缘逐渐增强 | 边缘区域,且方向性明显 |
| 校正难度 | 相对简单,模型成熟 | 需要精确标定,对棋盘格角度敏感 |
| 典型数值范围 | k1: -0.5 ~ 0.5 | p1, p2: -0.05 ~ 0.05 |
4.6 实际项目中的切向畸变处理建议
基于我这些年做相机标定的经验,给你几条实用建议:
- 不要跳过切向校正:即使你觉得相机安装得很正,也建议把
p1、p2加入标定。多两个参数不会增加太多计算量,但能显著提升精度。 - 关注标定残差:如果标定后重投影误差很大,先检查切向畸变参数是否异常。我曾经遇到一个案例,标定残差0.8像素,把切向校正关掉后反而降到0.3——这说明标定板本身不平整,强行拟合切向参数反而引入了误差。
- 硬件排查:如果
p1、p2持续偏大(比如超过0.1),别光想着用软件校正。检查一下镜头接口是否松动、传感器是否倾斜,有时候拧紧一颗螺丝比调参更管用。
个人习惯:我在做批量标定时,会写一个脚本自动检查 p1、p2 的值是否超过阈值(比如0.03)。超过的就标记为"疑似硬件问题",单独处理。这样能避免把有问题的相机混入产线。