3. 内参矩阵

相机内参,说白了就是相机自己“心里那本账”。它记录了镜头和传感器之间最核心的映射关系。我刚开始接触视觉时,总觉得内参就是个3x3的矩阵,套公式算就完了。直到有一次在现场,标定完发现测量偏差总是差几个像素,排查了半天——原来是内参里的主点位置偏了半个像素,导致整个坐标系都歪了。

嗯,从那以后我养成了一个习惯:拿到任何相机的内参,先看主点坐标是不是在图像正中心附近,再看焦距值跟镜头标称值差多少。这两个数,能告诉你很多故事。

3.1 内参矩阵的数学形式

内参矩阵,通常记作 K。它是一个3x3的上三角矩阵:

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

这里面每个参数都有明确的物理含义:

  • fx, fy:分别是x和y方向上的焦距(单位:像素)
  • cx, cy:主点坐标(单位:像素),也就是光轴与成像平面的交点

你可能会问:为什么焦距会有两个值?按理说镜头只有一个焦距啊。

其实,fx = f / dx,fy = f / dy。这里的f是镜头物理焦距(毫米),dx和dy是单个像素在x和y方向的物理尺寸(毫米/像素)。如果像素是正方形的,那fx就等于fy。但工业相机里,像素不一定是正方的,所以两个值会有差异。

关键点:内参矩阵把三维空间中的点(在相机坐标系下)投影到二维图像平面上。它描述的是“从相机坐标到像素坐标”的映射关系。

3.2 焦距参数详解

焦距参数 fx 和 fy 决定了成像的缩放比例。值越大,视野越窄,物体在图像上显得越大;值越小,视野越宽,物体显得越小。

我在项目中遇到过一台8mm镜头的工业相机,标定出来的fx大约是2800像素。当时甲方工程师问我:“为什么焦距不是8mm?”我解释了半天——这个2800是等效像素焦距,不是物理焦距。物理焦距8mm除以像素尺寸2.8μm,刚好就是2857像素左右。对上了。

参数物理含义典型值范围(工业相机)
fxx方向等效焦距(像素)1000 ~ 5000
fyy方向等效焦距(像素)1000 ~ 5000
fx/fy像素纵横比0.99 ~ 1.01(近正方形)

经验技巧:标定得到的fx和fy如果相差超过1%,先检查一下标定板是不是贴歪了,或者图像采集时有没有发生拉伸。我见过不少案例,最后发现是采集卡设置把图像宽高比改了。

3.3 主点参数详解

主点 (cx, cy) 是光轴与成像平面的交点。理想情况下,它应该在图像的正中心。比如一张1920x1080的图像,主点应该是(960, 540)。

但现实没那么完美。镜头安装时会有微小的偏心,传感器也不是居中。所以实际标定出来的主点,往往偏离中心几个像素到几十个像素。

我记得有一次做高精度测量项目,要求重复精度0.02mm。标定出来的主点偏离中心12个像素,我当时没在意。结果测量结果总是有系统偏差,后来把主点手动修正到中心附近,精度立刻上来了。嗯,从那以后我对主点格外敏感。

注意:主点偏差过大(超过图像尺寸的5%),通常意味着镜头安装有问题,或者相机传感器有物理偏移。这时候不要强行用标定去“补偿”,先检查机械结构。

3.4 畸变参数详解

畸变,说白了就是镜头让图像“变形”了。主要有两类:

  • 径向畸变:光线通过镜头边缘时弯曲程度不同,导致直线变弯。分为桶形畸变和枕形畸变。
  • 切向畸变:镜头和传感器不平行,导致图像倾斜。

畸变模型通常用多项式来描述:

径向畸变:k1, k2, k3
切向畸变:p1, p2

畸变矫正的数学过程是这样的:

// 假设归一化坐标 (x, y)
r² = x² + y²

// 径向畸变
x_distorted = x * (1 + k1*r² + k2*r⁴ + k3*r⁶)
y_distorted = y * (1 + k1*r² + k2*r⁴ + k3*r⁶)

// 切向畸变
x_distorted += 2*p1*x*y + p2*(r² + 2*x²)
y_distorted += p1*(r² + 2*y²) + 2*p2*x*y

你想想看,这个公式其实就是在说:离图像中心越远的点,畸变越严重。所以标定时,标定板一定要覆盖整个视野,尤其是四个角。

畸变参数典型范围说明
k1-0.5 ~ 0.5主要径向畸变系数
k2-0.3 ~ 0.3次要径向畸变系数
k3-0.1 ~ 0.1高阶径向畸变(鱼眼镜头常用)
p1, p2-0.05 ~ 0.05切向畸变系数

避坑指南:我曾经遇到一个案例,标定出来的k1只有-0.02,但图像边缘畸变很明显。后来发现是标定板只拍了中心区域,没有覆盖边缘。畸变参数在边缘区域才“激活”,所以标定板一定要拍满整个视野。

3.5 内参矩阵与畸变参数的关系

内参矩阵和畸变参数是“搭档”。内参矩阵负责“理想投影”,畸变参数负责“修正现实”。

完整的映射流程是这样的:

  1. 三维空间点 → 相机坐标系(外参负责)
  2. 相机坐标系 → 归一化平面(除以Z)
  3. 归一化坐标 → 畸变矫正(用k1,k2,k3,p1,p2修正)
  4. 畸变后坐标 → 像素坐标(内参矩阵K)

说白了,畸变参数是在归一化平面上做修正,然后才用内参矩阵投影到像素坐标。这个顺序不能乱。

内参矩阵与畸变参数在成像流程中的位置 3D世界点 相机坐标系 归一化平面 畸变矫正 像素坐标 畸变参数(k1,k2,k3,p1,p2)在这里修正坐标 内参矩阵(fx,fy,cx,cy)在这里完成投影

3.6 实际工程中的注意事项

讲到这里,我想分享几个实际工程中的经验:

  • 内参不是一成不变的:变焦镜头、自动对焦镜头,焦距变了内参就得重新标。定焦镜头也要定期复标,尤其是温度变化大的环境。
  • 畸变参数不是越大越好:有些标定算法会把畸变参数调得很大来“拟合”噪声。我见过k1标到-0.8的,图像边缘都扭成麻花了。这时候要怀疑标定数据质量。
  • 主点偏移有物理意义:如果主点偏移超过50个像素,先检查镜头接口是不是松动,或者传感器有没有移位。别急着用软件补偿。

重要提醒:内参矩阵和畸变参数是“配套”的。换镜头、换相机、甚至重新拧紧镜头,都要重新标定。不要偷懒用之前的数据,我吃过这个亏。

好了,内参矩阵这部分就讲到这里。记住一句话:内参是相机的“身份证”,畸变是镜头的“脾气”。搞清楚了这两样,标定就成功了一半。