1. 畸变校正基础:从成像模型到数学参数

各位同学好。我是老张,在嵌入式视觉领域摸爬滚打了十几年。今天咱们开始《实时畸变校正系统部署与性能调优》的第一章。

畸变校正,说白了就是让拍出来的照片「变直」。你想想看,广角镜头拍出来的建筑边缘是弯的,鱼眼镜头更是夸张得像哈哈镜。这些都不是镜头坏了,而是光学系统的物理限制。我们要做的,就是用数学模型把这些弯曲「拉直」。

嗯,这一章是地基。地基不牢,后面部署和优化全是空中楼阁。咱们从最基础的相机成像模型讲起。

1.1 相机成像模型:小孔成像的数学化

相机成像,本质上就是小孔成像。但现实中没人用小孔,都用透镜。透镜让更多光线进来,但也带来了畸变。

数学上,我们用一个理想模型来描述这个过程——针孔相机模型。它把三维世界映射到二维图像平面。

核心公式(齐次坐标形式):

λ * [u, v, 1]^T = K * [R | t] * [X, Y, Z, 1]^T

其中:
- (X, Y, Z):世界坐标系中的三维点
- [R | t]:外参矩阵(旋转+平移),把世界坐标转到相机坐标
- K:内参矩阵,把相机坐标投影到像素坐标
- (u, v):像素坐标
- λ:深度缩放因子

这里我要强调一下内参矩阵 K,它长这样:

K = [fx,  0, cx;
      0, fy, cy;
      0,  0,  1]

fx、fy 是焦距(以像素为单位),cx、cy 是光心偏移。这些参数怎么来的?标定来的。我当年第一次做标定,用棋盘格拍了50张图,结果标出来的 cx 是负数……后来发现是图像坐标系搞反了。这种坑,你们迟早也会踩。

1.2 畸变从哪来?径向畸变与切向畸变

理想模型很完美,但现实很骨感。透镜的物理形状和装配误差,让光线发生了偏移。这就是畸变。

畸变分两大类:

1.2.1 径向畸变

这是最常见的畸变。原因很简单——透镜表面的曲率不是完美的球面,尤其是边缘部分。光线越靠近边缘,折射角度偏差越大。

径向畸变有两种表现:

  • 桶形畸变:图像向外膨胀,像木桶。广角镜头常见。
  • 枕形畸变:图像向内收缩,像枕头。长焦镜头常见。

数学上,我们用泰勒级数来建模:

x_distorted = x * (1 + k1*r^2 + k2*r^4 + k3*r^6)
y_distorted = y * (1 + k1*r^2 + k2*r^4 + k3*r^6)

其中 r 是像素到光心的距离,k1、k2、k3 是径向畸变系数。r 越大,畸变越明显。所以画面边缘的弯曲最严重。

我的经验: 大部分镜头用 k1、k2 就够了。k3 通常用于鱼眼镜头或大广角。我曾经在一个项目中只标定了 k1、k2,结果边缘还是有明显弯曲。后来加上 k3,效果立竿见影。但注意,参数越多,标定越不稳定,容易过拟合。

1.2.2 切向畸变

切向畸变是「装配病」。透镜和成像平面不平行,有夹角。光线穿过时发生了切向偏移。

数学表达式:

x_distorted = x + [2*p1*x*y + p2*(r^2 + 2*x^2)]
y_distorted = y + [p1*(r^2 + 2*y^2) + 2*p2*x*y]

p1、p2 是切向畸变系数。这个畸变通常很小,但在高精度测量场景(比如机器视觉定位)里,必须校正。

注意: 切向畸变和径向畸变是叠加的。实际校正时,先算径向畸变,再算切向畸变,顺序不能乱。我曾经见过有人把公式顺序搞反,校正完图像反而更扭曲了。

1.3 畸变数学模型与参数总览

好了,我们把所有畸变参数汇总一下。OpenCV 等工具库用的就是这套模型。

参数 符号 含义 典型值范围
径向畸变系数 k1, k2, k3 控制径向扭曲程度 -1.0 ~ 1.0
切向畸变系数 p1, p2 控制切向偏移程度 -0.1 ~ 0.1
焦距 fx, fy 以像素为单位的焦距 几百到几千
光心 cx, cy 图像中心点坐标 图像宽高的一半

这些参数合起来,就是相机的内参。标定的目的,就是求出这组参数。

1.4 知识体系:一张图看懂畸变校正

下面这张 SVG 图,把整个畸变校正的知识脉络串起来了。你仔细看一遍,后面几章的内容其实都在这张图里。

畸变校正知识体系 畸变校正知识体系 相机成像模型 理想:针孔模型 现实:透镜畸变 径向畸变(k1, k2, k3) 切向畸变(p1, p2) 畸变数学模型:多项式 + 泰勒展开 相机标定(求内参+畸变系数) 畸变校正(映射+插值) 核心目标:从弯曲图像 → 无畸变图像,为后续部署和优化打基础

1.5 避坑指南:我踩过的三个坑

讲完理论,分享几个实战教训。这些坑我当年都踩过,你们能绕就绕。

  1. 标定板不平:我曾经用一张打印在A4纸上的棋盘格,贴在纸箱上标定。结果纸面有褶皱,标出来的畸变系数全是错的。后来换了玻璃基板的陶瓷标定板,一次过。标定板必须平整,这是铁律。
  2. 图像数量不够:有人觉得拍三五张就能标定。我告诉你,至少15-20张,覆盖不同角度和距离。我习惯拍30张,剔除模糊的,留20张好的。数量不够,参数方差大,校正效果不稳定。
  3. 忽略切向畸变:很多教程只讲径向畸变。但在高精度场景(比如机械臂视觉抓取),切向畸变会导致定位偏差几个像素。我做过一个项目,忽略切向畸变,抓取误差0.5mm,加上后降到0.1mm。所以,别偷懒。

本章核心要点:

  • 相机成像用针孔模型 + 畸变模型来描述
  • 畸变分径向(k1,k2,k3)和切向(p1,p2)两类
  • 畸变数学模型是泰勒级数展开,r越大畸变越严重
  • 标定就是求内参和畸变系数,是校正的前提