4、相机内参模型:针孔相机模型、畸变模型、内参矩阵K
聊到多传感器融合,相机内参是绕不开的基础。说白了,相机就是把三维世界投影到二维图像上。这个投影过程怎么描述?就是靠内参模型。我这些年做融合项目,踩过最多的坑,反而是这些最基础的东西没搞透。
4.1 针孔相机模型——最朴素的成像原理
针孔相机模型,你想想看,就是一个小孔成像。光线穿过小孔,在后面的感光平面上形成倒像。嗯,这里要注意,我们通常把成像平面放到小孔前面来简化计算,这样图像就是正的了。
数学上怎么描述?一个三维点 P(X, Y, Z) 投影到图像上的点 p(u, v):
u = f * X / Z + cx
v = f * Y / Z + cy
这里 f 是焦距,cx、cy 是光心在像素坐标系中的偏移。我在项目中遇到过,有人直接把 cx、cy 设为图像宽高的一半,结果标定出来的外参怎么都对不上。后来发现,实际的光心偏移往往有几十个像素的偏差。
4.2 畸变模型——现实总是不完美的
为什么会有畸变?因为镜头不是理想的小孔。我刚开始做感知时,拿着标定板拍了一组图,投影误差死活降不下去。后来才发现,我忘了加畸变模型。
4.2.1 径向畸变
径向畸变,说白了就是光线经过透镜时,边缘弯曲得比中心厉害。分为两种:
- 桶形畸变:图像边缘向外凸出,像木桶。广角镜头常见。
- 枕形畸变:图像边缘向内凹陷。长焦镜头常见。
数学上,我们用多项式来修正:
x_corrected = x * (1 + k1 * r² + k2 * r⁴ + k3 * r⁶)
y_corrected = y * (1 + k1 * r² + k2 * r⁴ + k3 * r⁶)
其中 r 是像素点到光心的距离。k1、k2、k3 是径向畸变系数。一般用 k1、k2 就够了,k3 是给大畸变镜头准备的。
4.2.2 切向畸变
切向畸变,是因为镜头和成像平面不平行。说白了,就是镜头装歪了。这个在量产车上比较常见,因为装配公差。
x_corrected = x + (2 * p1 * x * y + p2 * (r² + 2 * x²))
y_corrected = y + (p1 * (r² + 2 * y²) + 2 * p2 * x * y)
p1、p2 是切向畸变系数。我建议,只要做量产项目,一定要标定 p1、p2。我曾经遇到过一台车,切向畸变导致车道线投影偏差了 3 个像素,融合出来的目标位置直接偏了半米。
4.3 内参矩阵 K——把一切串起来
内参矩阵 K,就是把上面所有参数打包成一个 3x3 的矩阵:
K = [fx, 0, cx]
[ 0, fy, cy]
[ 0, 0, 1]
fx、fy 是 x、y 方向的焦距。理论上它们应该相等,但实际因为传感器制造误差,往往差一点点。cx、cy 是光心偏移。
完整的投影过程,其实就是三步:
- 世界坐标转相机坐标(外参干的)
- 相机坐标归一化,加上畸变
- 用内参矩阵 K 投影到像素坐标
我习惯把内参标定放在融合项目的第一步。为什么?因为内参不准,后面所有对齐都是白搭。你想想看,雷达点云投影到图像上,如果内参偏了 5 个像素,那融合出来的目标位置误差会放大到几十厘米。
4.4 知识体系总览
下面这张图,是我自己总结的相机内参模型的知识结构。每次带新人,我都会先让他们看这张图,搞清楚各个模块之间的关系。
这张图把整个流程串起来了。从针孔模型开始,加上畸变修正,最后用内参矩阵 K 完成投影。我每次做融合项目,都会把这张图打印出来贴在工位上。
嗯,相机内参模型就聊到这里。记住一句话:内参是相机自己的身份证,畸变是现实世界的修正项,K 矩阵是投影的数学工具。搞懂了这些,后面的融合工作才能站得住脚。
可可精品资料库