2. 相机参数基础:内参矩阵、外参矩阵、畸变系数
做感知联调,说白了就是在跟相机的「脾气」打交道。你给相机一个三维世界,它给你一张二维图片。这中间怎么映射的?全靠三个东西:内参、外参、畸变系数。我刚开始接触这块时,总觉得这些矩阵就是些数学公式,背下来就行。后来踩了坑才明白——不理解它们,联调时你连问题出在哪都找不到。
2.1 内参矩阵:相机自己的「基因」
内参矩阵描述的是相机内部的光学特性。它告诉你:三维空间里的一个点,投影到图像平面上,到底落在哪个像素坐标上。
公式长这样:
K = [fx 0 cx]
[0 fy cy]
[0 0 1]
其中:
- fx, fy:焦距,单位是像素。说白了就是镜头到成像面的距离,换算成像素个数。
- cx, cy:主点偏移。理论上应该在图像正中心,但实际装配总有偏差。
我遇到过一件事。有一次联调,检测框总是整体往右偏。排查了半天,最后发现是标定文件里的 cx 值写错了。你想想看,一个像素的偏差,在 50 米外就是半米多的误差。所以内参一定要标定准,别偷懒用厂家给的默认值。
核心要点:内参矩阵是相机的「出厂设置」,但它会随温度、震动、老化而变化。量产车每半年最好重新标定一次。
2.2 外参矩阵:相机在车上的「站位」
外参描述的是相机相对于车体坐标系的位置和朝向。它由旋转矩阵 R 和平移向量 t 组成:
[R | t]
外参解决的核心问题是:我知道车在哪儿,相机在车的哪个位置、朝哪个方向看?
举个例子。前视相机一般装在挡风玻璃后面,它的坐标系和车体坐标系之间有个固定的变换。这个变换就是外参。如果外参不准,你算出来的障碍物距离就会整体偏移。
我建议你在联调时,先做一步「外参验证」:找一个静止的参照物,比如路边的杆子,用激光雷达和相机分别测它的位置。如果两者对不上,八成是外参出了问题。
个人经验:外参标定最好在平整地面上进行,用棋盘格或者 AprilTag。我曾经在斜坡上标定过一次,结果上路后所有目标都往左偏了 30 厘米。嗯,那次教训挺深刻的。
2.3 畸变系数:镜头天生的「近视」
没有镜头是完美的。畸变就是镜头带来的图像变形。主要有两种:
- 径向畸变:光线经过透镜边缘时弯曲得更厉害。表现为图像边缘的直线变弯了。像鱼眼镜头那种夸张效果就是径向畸变。
- 切向畸变:镜头和成像面不平行导致的。表现为图像像被「拧」了一下。
畸变模型一般用五个参数描述:k1, k2, k3(径向),p1, p2(切向)。
矫正公式大致是:
x_corrected = x * (1 + k1*r^2 + k2*r^4 + k3*r^6) + 2*p1*x*y + p2*(r^2 + 2*x^2)
y_corrected = y * (1 + k1*r^2 + k2*r^4 + k3*r^6) + p1*(r^2 + 2*y^2) + 2*p2*x*y
看着复杂,但 OpenCV 里一行 cv2.undistort() 就搞定了。不过要注意:
避坑指南:我曾经在联调时发现,矫正后的图像边缘出现了奇怪的「锯齿」。后来查出来是因为畸变参数 k3 设成了 0,但实际镜头需要 k3。记住:广角镜头一定要用三个径向参数,别省。
2.4 三者的关系:一张图说清楚
我画了一张图,帮你理清内参、外参、畸变在感知联调中的位置:
从图上你能看到:三维世界的点,先通过外参转到相机坐标系,再通过内参投影到图像平面,最后用畸变系数矫正镜头带来的变形。这三步缺一不可。
2.5 联调中的常见坑
我总结几个实际联调中容易出问题的地方:
| 问题现象 | 可能原因 | 排查方法 |
|---|---|---|
| 检测框整体偏移 | 外参平移向量 t 不准 | 用激光雷达点云投影验证 |
| 远处目标位置不准 | 内参 fx/fy 标定误差 | 重投影误差检查 |
| 图像边缘扭曲 | 畸变系数缺失或错误 | 查看棋盘格矫正后直线是否平直 |
| 俯视图拼接错位 | 多相机外参不一致 | 逐对相机做联合标定 |
一句话总结:内参管「准不准」,外参管「对不对」,畸变管「直不直」。联调时按这个思路排查,能省一半时间。
好了,相机参数这块就聊到这儿。记住:参数不是标定一次就完事的。环境变了、温度变了、时间久了,参数都会漂。定期校验,才是做感知联调的「保命符」。