3. 相机内参矩阵:K矩阵与畸变参数

聊到相机标定,内参矩阵K和畸变参数是绕不开的核心。说白了,它们就是相机的“身份证”——告诉你这台相机到底是怎么看世界的。

我刚开始做视觉的时候,总觉得内参就是个公式,套进去算就行。直到有一次做多相机拼接,图像边缘怎么都对不齐,折腾了两天才发现是畸变参数没标对。从那以后,我对这两个东西就特别上心。

3.1 内参矩阵K的定义

内参矩阵K,描述的是从相机坐标系到像素坐标系的映射关系。它长这样:

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

四个关键参数:

  • fx, fy:焦距在x和y方向上的像素度量。单位是像素,不是毫米。
  • cx, cy:主点坐标,也就是光轴与成像平面的交点。理想情况下在图像中心,但实际总有偏差。

你可能会问:为什么焦距会有两个值?

嗯,这是因为传感器像素不一定是正方形的。我见过不少工业相机,fx和fy能差出好几个像素。如果你做高精度测量,这个差异不能忽略。

核心理解:K矩阵把三维空间中的点投影到二维图像上。它决定了“一个三维点到底落在图像的哪个像素位置”。

3.2 畸变参数:为什么图像会变形?

理想情况下,相机成像遵循小孔成像模型。但现实中的镜头不是完美的——光线经过透镜会发生弯曲,这就产生了畸变。

畸变主要分两类:

3.2.1 径向畸变

径向畸变是镜头本身形状导致的。离光轴越远,畸变越明显。我习惯把它想象成“镜头边缘的放大率跟中心不一样”。

数学上用三个参数描述:k1, k2, k3。

  • k1:主要畸变系数,影响最大
  • k2:高阶畸变系数,修正边缘
  • k3:用于大畸变镜头(比如鱼眼),一般标定用不到

径向畸变有两种表现:

类型 现象 k1符号
桶形畸变 图像向外凸出,像吹气球 负值
枕形畸变 图像向内凹陷,像枕头 正值

我的经验:普通手机镜头通常是桶形畸变,k1为负。长焦镜头容易出现枕形畸变。标定的时候看一眼畸变图就能判断个大概。

3.2.2 切向畸变

切向畸变是镜头和传感器不平行导致的。说白了就是“镜头装歪了”。

用两个参数描述:p1, p2。

  • p1:x方向的切向畸变
  • p2:y方向的切向畸变

切向畸变在工业相机中比较常见。我曾经遇到过一台相机,p1值特别大,拆开一看,镜头座里有个垫片装反了。重新装配后,p1直接降了一个数量级。

3.3 畸变校正的数学过程

标定得到畸变参数后,校正过程其实不复杂:

  1. 对每个像素坐标(x, y),计算其到主点的归一化距离r
  2. 用畸变公式计算校正后的坐标
  3. 重新采样得到校正图像

畸变校正公式:

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

看着有点吓人?其实核心就两部分:径向部分用多项式修正,切向部分用偏移量修正。

注意:畸变校正会改变图像边缘的像素分布。校正后的图像边缘可能会有拉伸或压缩,这是正常现象。做图像拼接时,一定要先校正再拼接,顺序不能乱。

3.4 内参与畸变的关系

内参和畸变参数是“捆绑销售”的。标定时,它们一起被优化求解。

我个人习惯把标定结果存成这样的结构:

{
  "camera_matrix": {
    "fx": 825.43,
    "fy": 824.97,
    "cx": 640.12,
    "cy": 360.08
  },
  "distortion_coefficients": {
    "k1": -0.283,
    "k2": 0.073,
    "p1": 0.0012,
    "p2": -0.0008,
    "k3": -0.015
  }
}

你看,fx和fy很接近,说明传感器像素接近正方形。k1为负,典型的桶形畸变。p1和p2都很小,说明镜头安装得还不错。

3.5 本章知识结构

下面这张图把内参矩阵和畸变参数的关系梳理清楚了:

相机内参与畸变参数知识结构 相机标定输出 内参矩阵 K 畸变参数 fx, fy 焦距 cx, cy 主点 径向畸变 k1,k2,k3 切向畸变 p1,p2 关键理解 K矩阵决定“投影位置”,畸变参数修正“镜头变形” 应用:畸变校正 → 图像拼接 → 三维重建

3.6 避坑指南

最后分享几个我踩过的坑:

  • 标定板要覆盖整个视野:我曾经只拍了中心区域的标定板,结果边缘畸变完全没标出来,拼接时边缘全对不上。
  • 不要用单张图标定:至少10-20张不同角度的图,否则内参和畸变会耦合在一起,结果不可靠。
  • 检查重投影误差:标定完成后,看一眼重投影误差。一般小于0.5像素算合格,大于1像素就要重新标了。

我的习惯:每次标定完,我都会把畸变校正后的图像和原图叠在一起看。如果边缘的直线变直了,说明标定没问题。如果反而更弯了,那肯定是参数搞反了。

内参矩阵和畸变参数,是相机标定的“基本功”。搞懂了它们,后面的图像拼接和三维重建才能站得稳。嗯,这一章就到这里。