3. 摄像头标定原理:内参标定、外参标定、标定板设计要点
各位工程师朋友,咱们今天聊聊摄像头标定的核心原理。说实话,标定这件事,看着简单,做起来坑不少。我见过太多项目,算法模型跑得挺好,一上车就偏,十有八九是标定没做好。
摄像头标定,说白了就是搞清楚两件事:镜头本身长什么样,以及镜头装在车上什么位置。前者叫内参,后者叫外参。
3.1 内参标定:焦距与畸变
内参标定,就是给摄像头做「体检」。你得知道它的焦距是多少,画面有没有变形。
3.1.1 焦距
焦距决定了视野范围。焦距越短,看得越宽,但远处物体越小。焦距越长,看得越远,但视野窄。
内参矩阵长这样:
K = [fx 0 cx]
[ 0 fy cy]
[ 0 0 1]
其中 fx、fy 是焦距(单位是像素),cx、cy 是主点坐标(光轴与成像平面的交点)。
我的经验: 我习惯在标定前先检查一下 cx、cy 是否接近图像中心。如果偏差太大,说明镜头安装可能有物理偏移。有一次我在项目中遇到这个问题,排查了半天,最后发现是镜头座没拧紧。
3.1.2 畸变
镜头不是完美的,光线经过透镜会发生弯曲。这就是畸变。常见的有两种:
- 径向畸变:画面像鱼眼一样向外凸(桶形畸变)或向内凹(枕形畸变)。
- 切向畸变:镜头和成像平面不平行,导致画面倾斜。
畸变模型用多项式表示:
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 是切向畸变系数。
注意: 我曾经遇到一个案例,标定出来的畸变系数特别大,但画面看起来还行。后来发现是标定板太脏了,角点检测不准。所以标定前,先把镜头擦干净,标定板也保持整洁。
3.2 外参标定:旋转与平移
内参搞定了,接下来就是外参。外参解决的是「摄像头在车上的什么位置,朝哪个方向看」。
外参包含两部分:
- 旋转矩阵 R:描述摄像头坐标系相对于车辆坐标系的旋转关系。
- 平移向量 t:描述摄像头坐标系原点在车辆坐标系中的位置。
从世界坐标系到像素坐标系的完整变换:
s * [u, v, 1]^T = K * [R | t] * [X, Y, Z, 1]^T
这里 s 是尺度因子,K 是内参矩阵,[R | t] 是外参矩阵。
3.2.1 旋转矩阵
旋转矩阵有 3 个自由度:俯仰角(Pitch)、偏航角(Yaw)、翻滚角(Roll)。
举个例子:
- 俯仰角:摄像头是抬头看还是低头看。
- 偏航角:摄像头是正前方还是偏左/偏右。
- 翻滚角:摄像头有没有歪(比如安装时拧了一下)。
关键点: 外参标定最怕的是「旋转和平移耦合」。什么意思?就是摄像头稍微歪一点,你很难判断是旋转造成的还是平移造成的。我建议在标定过程中,先固定平移,再优化旋转,或者反过来,分步进行。
3.2.2 平移向量
平移向量就是摄像头在车上的物理位置。比如:
t = [x, y, z]^T
其中 x 是左右方向,y 是上下方向,z 是前后方向。
平移向量的精度直接影响测距。你想想看,如果摄像头位置标定偏差了 5 厘米,那 50 米外的物体测距误差可能就超过 1 米了。
避坑指南: 我曾经在量产项目中,发现同一款车不同批次的摄像头外参差异很大。后来查原因,是车辆装配公差导致的。所以量产阶段,外参标定一定要做在线标定,不能只靠设计值。
3.3 标定板设计要点
标定板是标定的「尺子」。尺子不准,标定结果肯定不准。
3.3.1 棋盘格 vs 圆点阵
| 类型 | 优点 | 缺点 |
|---|---|---|
| 棋盘格 | 角点检测简单、成熟 | 对光照敏感、边缘模糊时精度下降 |
| 圆点阵 | 抗噪能力强、亚像素精度高 | 需要圆心检测、算法稍复杂 |
我个人更倾向于棋盘格,因为 OpenCV 的 findChessboardCorners 函数太成熟了,省事。但如果项目对精度要求极高,我会用圆点阵。
3.3.2 标定板尺寸
标定板尺寸有讲究:
- 格子大小:一般 20mm-50mm 之间。太小了远距离看不清,太大了近距离拍不全。
- 格子数量:建议 7x9 或 9x11。太少角点不够,太多容易遮挡。
- 板子材质:一定要用平整的板材。我见过有人用纸打印贴在墙上,结果墙面不平,标定出来全是错的。
重要提醒: 标定板一定要是刚性的,不能弯曲。我曾经用亚克力板做过一块标定板,结果运输过程中压弯了,标定出来的焦距偏差了 3%。后来换了铝合金板才解决。
3.3.3 标定板摆放
标定过程中,标定板的摆放姿势要多样化:
- 正对摄像头拍几张
- 左右倾斜拍几张
- 上下倾斜拍几张
- 远近不同距离拍几张
- 旋转不同角度拍几张
为什么要这样?因为标定算法需要从不同视角观察同一个物体,才能解算出内参和外参。如果所有照片都是正对着拍的,那畸变参数根本算不准。
我的习惯: 我一般拍 20-30 张照片,覆盖整个视野范围。拍完后检查一下重投影误差,如果超过 0.5 像素,就重新拍。嗯,这个标准有点严,但量产项目值得这么做。
3.4 小结
摄像头标定,内参解决「镜头本身的问题」,外参解决「镜头安装的问题」,标定板是「标定的基准」。三者缺一不可。
下一章咱们聊聊标定失效的常见故障模式,以及怎么快速定位问题。到时候我会分享一些实际项目中的踩坑经历,保证让你少走弯路。