3. 相机标定基础
相机标定,说白了就是给摄像头做一次「体检」和「配镜」。
你想想看,摄像头出厂时,镜片有误差,感光元件有偏移,拍出来的画面天然就是变形的。如果不做标定,直接拿两个不同型号的摄像头做拼接,结果一定是歪歪扭扭、对不齐的。
我刚开始做多摄像头拼接时,就吃过这个亏。当时图省事,跳过了标定,结果花了三周去调拼接参数,最后还是得回头老老实实做标定。嗯,从那以后,我再也不敢跳过这一步了。
3.1 内参:摄像头自己的「基因」
内参描述的是摄像头内部的光学结构。它不随摄像头移动而改变,是每个摄像头独有的「身份证」。
内参矩阵通常写成这样:
K = [fx 0 cx
0 fy cy
0 0 1]
- fx, fy:焦距,单位是像素。它决定了物体在画面中的缩放比例。
- cx, cy:主点坐标,也就是光轴穿过成像平面的位置。理想情况下在画面正中心,但实际总有偏移。
我的经验: 同一个型号的摄像头,内参也会有细微差异。做异构摄像头融合时,每个摄像头都必须单独标定,不能偷懒用「出厂默认值」。
3.2 外参:摄像头在空间中的「位置」
外参描述的是摄像头在世界坐标系中的位置和朝向。它由旋转矩阵 R 和平移向量 t 组成。
外参的作用,就是把世界坐标系的点,转换到摄像头坐标系里。公式很简单:
P_cam = R * P_world + t
对于多摄像头系统,外参标定的核心任务,就是求出每个摄像头相对于同一个世界坐标系的 R 和 t。这样,不同摄像头看到的画面,才能映射到同一个空间里。
注意: 外参会随着摄像头移动而改变。如果摄像头被碰歪了,或者重新安装过,必须重新标定外参。我曾经在一个项目中,因为支架螺丝松动,导致拼接结果每天漂移,排查了整整两天才找到原因。
3.3 畸变系数:镜片带来的「变形」
任何镜头都有畸变,只是程度不同而已。畸变主要分两类:
| 畸变类型 | 表现 | 产生原因 |
|---|---|---|
| 径向畸变 | 画面边缘向内或向外弯曲(桶形/枕形) | 镜片曲率不完美 |
| 切向畸变 | 画面倾斜、梯形变形 | 镜片与感光元件不平行 |
畸变模型通常用多项式来描述:
x_distorted = x * (1 + k1*r^2 + k2*r^4 + k3*r^6) + [2*p1*x*y + p2*(r^2 + 2*x^2)]
y_distorted = y * (1 + k1*r^2 + k2*r^4 + k3*r^6) + [p1*(r^2 + 2*y^2) + 2*p2*x*y]
其中 k1, k2, k3 是径向畸变系数,p1, p2 是切向畸变系数。标定的目的,就是求出这 5 个参数,然后对画面做反向校正。
关键点: 畸变校正必须在图像拼接之前完成。否则,两张变形程度不同的画面,拼接时会出现明显的错位和重影。
3.4 标定板的选择与使用
标定板是标定的「尺子」。选对了,事半功倍;选错了,事倍功半。
3.4.1 常见标定板类型
| 类型 | 特点 | 适用场景 |
|---|---|---|
| 棋盘格 | 角点检测稳定,算法成熟 | 通用场景,初学者首选 |
| 圆点阵 | 圆心定位精度高,抗噪性好 | 高精度标定,工业场景 |
| ArUco/ChArUco | 自带编码,可识别单个标记 | 多摄像头同步标定 |
我个人习惯用棋盘格,因为它简单、稳定、容易上手。但如果你需要亚像素级别的精度,圆点阵是更好的选择。
3.4.2 标定板使用要点
- 尺寸要合适: 标定板在画面中至少占 1/4 到 1/3 的面积。太小了,角点检测不稳定;太大了,边缘畸变区域覆盖不全。
- 姿态要多样: 拍摄时,标定板要倾斜、旋转、前后移动,覆盖画面的各个区域。我一般会拍 20-30 张不同姿态的图片。
- 光照要均匀: 避免反光和阴影。反光会导致角点检测失败,阴影会引入额外的误差。
- 保持静止: 拍摄时,标定板可以动,但摄像头不能动。如果摄像头在动,外参就变了,标定结果会乱掉。
避坑指南: 我曾经用一张 A4 纸打印的棋盘格去做标定,结果误差一直降不下来。后来才发现,纸张受潮后轻微变形,导致棋盘格的实际尺寸和理论尺寸不一致。从那以后,我都是用玻璃基板或者铝基板打印的标定板,硬质、平整、不变形。
3.5 标定流程与知识结构
下面这张图,把相机标定的核心逻辑串起来了:
整个流程其实就三步:
- 采集数据: 用标定板拍摄多张不同姿态的图片。
- 提取特征: 检测角点或圆心,建立图像坐标和世界坐标的对应关系。
- 求解参数: 用最小二乘法或非线性优化,解出内参、外参和畸变系数。
小技巧: 标定完成后,一定要做一次「重投影误差」检查。如果平均误差超过 0.5 像素,说明标定质量不够好,需要重新采集数据。我一般要求误差控制在 0.3 像素以内。
嗯,标定这件事,看起来简单,但细节很多。把内参、外参、畸变系数理解透,标定板选对、用对,后面的图像拼接才能有一个扎实的基础。