2. 数学模型:径向畸变与切向畸变的数学表达(Brown-Conrady模型)
聊到畸变校正,就绕不开一个核心模型——Brown-Conrady模型。这个模型在工业界和学术界都相当普及,说白了,它就是一套描述镜头畸变的数学公式。我个人习惯把它当作“畸变世界的通用语言”,掌握了它,你就能看懂大部分标定工具的输出。
2.1 畸变从哪来?先分清楚两类
镜头畸变主要分两种:径向畸变和切向畸变。嗯,这里要注意,它们不是独立存在的,实际镜头里往往是两者叠加。
- 径向畸变:光线通过镜头中心时,折射路径偏离了理想直线。离中心越远,变形越明显。我遇到过不少新手,以为只有鱼眼镜头才有径向畸变,其实普通广角镜也一样,只是程度不同。
- 切向畸变:这通常是因为镜头模组装配时,透镜光轴没有完全对齐传感器平面。说白了,就是“装歪了”。
你想想看,如果只校正径向畸变而忽略切向畸变,图像边缘的直线还是会弯曲,只是弯曲的方向不同罢了。
2.2 Brown-Conrady模型的数学表达
Brown-Conrady模型的核心思想是:用多项式拟合畸变偏移量。它把畸变分解为径向分量和切向分量,分别建模。
假设理想归一化坐标为 (x, y),畸变后的坐标为 (x_d, y_d),那么:
x_d = x * (1 + k1*r^2 + k2*r^4 + k3*r^6) + [2*p1*x*y + p2*(r^2 + 2*x^2)]
y_d = y * (1 + k1*r^2 + k2*r^4 + k3*r^6) + [p1*(r^2 + 2*y^2) + 2*p2*x*y]
其中:
- r^2 = x^2 + y^2,表示像素到光心距离的平方
- k1, k2, k3 是径向畸变系数
- p1, p2 是切向畸变系数
这个公式看起来有点吓人,但拆开看其实很简单:前半部分是径向校正,后半部分是切向校正。
关键点:k1 控制主要桶形/枕形畸变,k2 控制高阶变形,k3 通常只在鱼眼镜头或大畸变场景下才需要。我一般只用 k1 和 k2 就能搞定大部分手机镜头。
2.3 径向畸变:桶形与枕形
径向畸变有两种典型形态:
- 桶形畸变:k1 < 0,图像边缘向外凸出,像木桶一样。广角镜头最常见。
- 枕形畸变:k1 > 0,图像边缘向内凹陷,长焦镜头容易出现。
我曾经在调试一款车载环视镜头时,发现 k1 值竟然达到了 -0.35,边缘的直线弯得跟弓一样。校正后,整个画面才恢复正常。
2.4 切向畸变:透镜偏移的代价
切向畸变的公式里,p1 和 p2 分别对应水平和垂直方向的偏移。它们的影响通常比径向畸变小一个数量级,但绝不能忽略。
举个例子:如果 p1 = 0.001,p2 = -0.0005,在图像角落(比如 r=0.8 处),切向偏移可能达到 2-3 个像素。对于高精度测量来说,这已经不可接受了。
我的经验:在 OpenCV 的 calibrateCamera 函数中,默认只估计 k1, k2, p1, p2 四个参数。如果你发现校正后边缘仍有轻微弯曲,可以尝试启用 k3(设置 CALIB_RATIONAL_MODEL 标志)。
2.5 模型参数的实际意义
为了让你更直观地理解这些参数,我整理了一个表格:
| 参数 | 典型范围 | 物理意义 | 我的建议 |
|---|---|---|---|
| k1 | -0.5 ~ 0.5 | 主要径向畸变强度 | 必须估计 |
| k2 | -0.2 ~ 0.2 | 高阶径向畸变 | 建议估计 |
| k3 | -0.1 ~ 0.1 | 更高阶畸变 | 鱼眼镜头才用 |
| p1 | -0.01 ~ 0.01 | 水平切向偏移 | 必须估计 |
| p2 | -0.01 ~ 0.01 | 垂直切向偏移 | 必须估计 |
避坑指南:我曾经在标定一款工业相机时,发现 k3 估计值异常大(超过 0.5),后来检查发现是标定板不平整导致的。记住:模型参数异常往往是标定数据质量有问题,而不是镜头本身的问题。
2.6 从畸变坐标到像素坐标
上面讨论的都是归一化坐标(焦距 f=1 时的坐标)。要得到实际像素坐标,还需要乘上相机内参矩阵:
u = fx * x_d + cx
v = fy * y_d + cy
其中 fx, fy 是焦距(像素单位),cx, cy 是光心坐标。这一步其实就是把畸变校正后的坐标映射到图像平面上。
我建议你在实际项目中,先用 OpenCV 的 cv::fisheye::undistortImage 或 cv::undistort 函数验证模型参数是否正确。如果校正后的图像边缘直线还是弯的,那多半是参数没估计准。
2.7 知识体系总览
下面这张 SVG 图总结了 Brown-Conrady 模型的完整逻辑:
这张图清晰地展示了从理想坐标到像素坐标的完整流程:先分别计算径向和切向畸变,叠加得到畸变坐标,再通过内参矩阵映射到像素平面。我在做项目时,经常把这张图贴在工位上,方便随时对照。
好了,Brown-Conrady 模型的数学表达就讲到这里。记住:模型是工具,理解它背后的物理意义才是关键。下一章我们会聊聊如何用 OpenCV 实际标定这些参数,到时候我会分享一些踩坑经验。