2. 相机模型与内参标定:针孔相机模型、内参矩阵K、畸变模型(径向/切向)、张正友标定法原理
好,咱们正式开始聊传感器标定。这一章,我打算把相机模型和它的内参标定讲透。你想想看,在SLAM系统里,相机就是我们的眼睛。如果眼睛本身是“近视”或者“散光”的,那后面的跟踪、建图,全都会跑偏。所以,搞懂相机是怎么成像的,以及怎么给它“配眼镜”,是咱们做传感器融合的第一步。
2.1 针孔相机模型:最朴素的成像原理
先说最经典的针孔相机模型。说白了,它就是模拟了一个小孔成像的过程。光从物体表面反射,穿过一个小孔,投射到后面的感光元件上。这个模型虽然简单,但它是所有复杂相机模型的基础。
这里有几个关键坐标系,我建议你记牢:
- 世界坐标系:我们生活的三维空间,单位是米。
- 相机坐标系:以相机光心为原点,Z轴指向镜头前方。
- 图像物理坐标系:在成像平面上,单位是毫米。
- 图像像素坐标系:在图像上,单位是像素。
嗯,这里要注意。从世界坐标到像素坐标,其实经历了一系列的刚体变换和投影变换。我个人习惯把整个过程拆成三步:
- 世界坐标 → 相机坐标(刚体变换,外参干的活)
- 相机坐标 → 图像物理坐标(透视投影)
- 图像物理坐标 → 图像像素坐标(离散化采样)
核心公式: 从相机坐标 (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 张正友标定法:为什么它是工业标准?
好了,理论讲完了,怎么干活?目前最主流、最实用的方法,就是张正友标定法。这个方法牛在哪里?它只需要你打印一张棋盘格,然后拿着相机从不同角度拍几张照片,就能解算出内参和畸变参数。
它的核心思想,我总结为三步:
- 检测角点:在每张图片里,找到棋盘格的内角点。这是后续所有计算的基础。
- 求解单应性矩阵:对于每一张图片,棋盘格平面和成像平面之间有一个单应性矩阵 H。通过角点坐标,可以解出 H。
- 利用约束求解内参:单应性矩阵 H 包含了内参和外参的信息。通过多张图片的 H 矩阵,利用旋转矩阵的正交性约束,可以线性求解出内参矩阵 K 的闭式解。然后再用最大似然估计进行非线性优化,得到畸变参数。
我个人觉得,这个方法最巧妙的地方,就是利用了“平面”这个约束。你不需要知道棋盘格在空间中的精确三维坐标,只需要知道它是个平面就够了。这大大降低了标定的门槛。
标定流程建议:
- 拍摄15-20张不同姿态的棋盘格图片。姿态要丰富:左右倾斜、上下俯仰、前后移动。
- 棋盘格要占图片面积的1/4到1/2,不要太小。
- 确保图片清晰,不要有运动模糊。
- 使用OpenCV的
cv::calibrateCamera()函数,它会帮你完成所有计算。
为什么这个方法能成为工业标准?因为它稳定、精度高、操作简单。你想想看,一个方法能同时满足学术界和工业界的苛刻要求,那肯定是有两把刷子的。
2.5 知识体系与核心逻辑
为了让你更直观地理解这一章的知识结构,我画了一张图。它展示了从物理世界到像素坐标的完整流程,以及标定在其中扮演的角色。
这张图清晰地展示了:世界坐标经过外参变换到相机坐标,再经过内参投影和畸变模型,最终得到像素坐标。而张正友标定法,就是通过已知的棋盘格角点,反向求解出内参矩阵和畸变参数。只有把这些参数标定准了,后续的畸变矫正和特征点匹配才能可靠。
好了,这一章的内容就到这里。记住,相机内参是SLAM系统的基石。地基不稳,楼盖得再高也是危楼。下一章,我们会聊聊IMU的标定,那又是另一番天地了。