2. 相机模型与内参标定:针孔相机模型、内参矩阵K、畸变模型(径向/切向)、张正友标定法原理

好,咱们正式开始聊传感器标定。这一章,我打算把相机模型和它的内参标定讲透。你想想看,在SLAM系统里,相机就是我们的眼睛。如果眼睛本身是“近视”或者“散光”的,那后面的跟踪、建图,全都会跑偏。所以,搞懂相机是怎么成像的,以及怎么给它“配眼镜”,是咱们做传感器融合的第一步。

2.1 针孔相机模型:最朴素的成像原理

先说最经典的针孔相机模型。说白了,它就是模拟了一个小孔成像的过程。光从物体表面反射,穿过一个小孔,投射到后面的感光元件上。这个模型虽然简单,但它是所有复杂相机模型的基础。

这里有几个关键坐标系,我建议你记牢:

  • 世界坐标系:我们生活的三维空间,单位是米。
  • 相机坐标系:以相机光心为原点,Z轴指向镜头前方。
  • 图像物理坐标系:在成像平面上,单位是毫米。
  • 图像像素坐标系:在图像上,单位是像素。

嗯,这里要注意。从世界坐标到像素坐标,其实经历了一系列的刚体变换和投影变换。我个人习惯把整个过程拆成三步:

  1. 世界坐标 → 相机坐标(刚体变换,外参干的活)
  2. 相机坐标 → 图像物理坐标(透视投影)
  3. 图像物理坐标 → 图像像素坐标(离散化采样)

核心公式: 从相机坐标 (X, Y, Z) 到像素坐标 (u, v) 的投影关系,可以写成:

u = fx * (X / Z) + cx
v = fy * (Y / Z) + cy

其中 fx, fy 是焦距在像素单位下的表示,cx, cy 是主点偏移。这个公式,你闭着眼都得能写出来。

2.2 内参矩阵 K:相机的“身份证”

上面提到的 fx, fy, cx, cy,把它们组合成一个矩阵,就是大名鼎鼎的内参矩阵 K。

K = | fx  0  cx |
    |  0  fy  cy |
    |  0   0   1 |

这个矩阵,就是相机的“身份证”。每一台相机,哪怕是同一型号,它的K矩阵都有细微差别。为什么?因为制造公差、镜头安装误差等等。我在项目中遇到过,两台标称参数完全一样的工业相机,装在同一台机器人上,融合出来的点云就是有重影。后来一查,就是内参差了那么零点几个像素。

所以,千万别偷懒。每台相机,每次重新安装镜头后,都必须重新标定内参。

我的小技巧: 在标定内参时,我习惯把棋盘格摆满整个视野的各个角落,尤其是边缘和角落。这样标定出来的畸变参数会更鲁棒。

2.3 畸变模型:为什么直线会变弯?

针孔模型是理想情况。现实中的镜头,尤其是广角镜头,会引入畸变。你想想看,如果拍出来的照片里,原本笔直的门框变成了弧形,那SLAM系统肯定要懵圈。

畸变主要分两种:

2.3.1 径向畸变

这是由镜头形状引起的。光线在镜头边缘比在中心弯曲得更厉害。它又分两种:

  • 桶形畸变:图像向外凸出,像木桶。广角镜头常见。
  • 枕形畸变:图像向内凹陷。长焦镜头常见。

数学模型通常用泰勒级数展开的前几项来描述:

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

其中 r 是像素点到图像中心的距离。k1, k2, k3 就是径向畸变参数。

2.3.2 切向畸变

这个主要是因为镜头和成像平面不平行造成的。说白了,就是镜头装歪了。数学模型是:

x_corrected = x + [2 * p1 * x * y + p2 * (r^2 + 2 * x^2)]
y_corrected = y + [p1 * (r^2 + 2 * y^2) + 2 * p2 * x * y]

p1, p2 就是切向畸变参数。

避坑指南: 我曾经在标定一个鱼眼镜头时,只用了3个径向畸变参数(k1, k2, k3),结果去畸变后的图像边缘还是有明显的“波浪”。后来我意识到,对于大畸变镜头,必须用更多的参数(比如k4, k5, k6)或者使用特定的鱼眼模型。千万别拿针孔模型的畸变参数去套鱼眼镜头,会出大问题。

2.4 张正友标定法:为什么它是工业标准?

好了,理论讲完了,怎么干活?目前最主流、最实用的方法,就是张正友标定法。这个方法牛在哪里?它只需要你打印一张棋盘格,然后拿着相机从不同角度拍几张照片,就能解算出内参和畸变参数。

它的核心思想,我总结为三步:

  1. 检测角点:在每张图片里,找到棋盘格的内角点。这是后续所有计算的基础。
  2. 求解单应性矩阵:对于每一张图片,棋盘格平面和成像平面之间有一个单应性矩阵 H。通过角点坐标,可以解出 H。
  3. 利用约束求解内参:单应性矩阵 H 包含了内参和外参的信息。通过多张图片的 H 矩阵,利用旋转矩阵的正交性约束,可以线性求解出内参矩阵 K 的闭式解。然后再用最大似然估计进行非线性优化,得到畸变参数。

我个人觉得,这个方法最巧妙的地方,就是利用了“平面”这个约束。你不需要知道棋盘格在空间中的精确三维坐标,只需要知道它是个平面就够了。这大大降低了标定的门槛。

标定流程建议:

  • 拍摄15-20张不同姿态的棋盘格图片。姿态要丰富:左右倾斜、上下俯仰、前后移动。
  • 棋盘格要占图片面积的1/4到1/2,不要太小。
  • 确保图片清晰,不要有运动模糊。
  • 使用OpenCV的 cv::calibrateCamera() 函数,它会帮你完成所有计算。

为什么这个方法能成为工业标准?因为它稳定、精度高、操作简单。你想想看,一个方法能同时满足学术界和工业界的苛刻要求,那肯定是有两把刷子的。

2.5 知识体系与核心逻辑

为了让你更直观地理解这一章的知识结构,我画了一张图。它展示了从物理世界到像素坐标的完整流程,以及标定在其中扮演的角色。

相机模型与内参标定核心逻辑 世界坐标系 (Xw, Yw, Zw) 外参 相机坐标系 (Xc, Yc, Zc) 投影 图像物理坐标 (x, y) 采样 像素坐标 (u, v) 内参矩阵 K + 畸变参数 fx, fy, cx, cy, k1, k2, p1, p2, ... 张正友标定法 棋盘格角点检测 → 单应性矩阵 → 闭式解 → 非线性优化 去畸变图像 用于SLAM跟踪

这张图清晰地展示了:世界坐标经过外参变换到相机坐标,再经过内参投影和畸变模型,最终得到像素坐标。而张正友标定法,就是通过已知的棋盘格角点,反向求解出内参矩阵和畸变参数。只有把这些参数标定准了,后续的畸变矫正和特征点匹配才能可靠。

好了,这一章的内容就到这里。记住,相机内参是SLAM系统的基石。地基不稳,楼盖得再高也是危楼。下一章,我们会聊聊IMU的标定,那又是另一番天地了。

可可精品资料库