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 三者的关系:一张图说清楚

我画了一张图,帮你理清内参、外参、畸变在感知联调中的位置:

相机参数在感知联调中的角色 三维世界点 (X, Y, Z) 真实物理位置 外参 相机坐标系 (Xc, Yc, Zc) 以相机为原点 内参 图像平面 (u, v) 像素坐标 畸变矫正 矫正后图像 送入感知算法 外参:世界→相机坐标变换 内参:相机→图像投影 畸变:矫正镜头物理变形

从图上你能看到:三维世界的点,先通过外参转到相机坐标系,再通过内参投影到图像平面,最后用畸变系数矫正镜头带来的变形。这三步缺一不可。

2.5 联调中的常见坑

我总结几个实际联调中容易出问题的地方:

问题现象 可能原因 排查方法
检测框整体偏移 外参平移向量 t 不准 用激光雷达点云投影验证
远处目标位置不准 内参 fx/fy 标定误差 重投影误差检查
图像边缘扭曲 畸变系数缺失或错误 查看棋盘格矫正后直线是否平直
俯视图拼接错位 多相机外参不一致 逐对相机做联合标定

一句话总结:内参管「准不准」,外参管「对不对」,畸变管「直不直」。联调时按这个思路排查,能省一半时间。

好了,相机参数这块就聊到这儿。记住:参数不是标定一次就完事的。环境变了、温度变了、时间久了,参数都会漂。定期校验,才是做感知联调的「保命符」。

可可精品资料库