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::undistortImagecv::undistort 函数验证模型参数是否正确。如果校正后的图像边缘直线还是弯的,那多半是参数没估计准。

2.7 知识体系总览

下面这张 SVG 图总结了 Brown-Conrady 模型的完整逻辑:

Brown-Conrady 畸变模型知识体系 理想归一化坐标 (x, y) 径向畸变 k1, k2, k3 切向畸变 p1, p2 畸变坐标 (x_d, y_d) 内参矩阵 (fx, fy, cx, cy) 像素坐标 (u, v)

这张图清晰地展示了从理想坐标到像素坐标的完整流程:先分别计算径向和切向畸变,叠加得到畸变坐标,再通过内参矩阵映射到像素平面。我在做项目时,经常把这张图贴在工位上,方便随时对照。


好了,Brown-Conrady 模型的数学表达就讲到这里。记住:模型是工具,理解它背后的物理意义才是关键。下一章我们会聊聊如何用 OpenCV 实际标定这些参数,到时候我会分享一些踩坑经验。