2. 摄像头成像原理与模型:针孔相机模型、透镜畸变、内参与外参矩阵、成像几何关系
聊多摄像头同步之前,得先把单摄像头怎么「看」世界这件事搞清楚。你想想看,一个摄像头拍出来的图像,本质上就是把三维空间里的点,映射到二维像素平面上。这个映射过程,就是成像模型要讲的事。
我个人习惯把成像模型拆成三块来理解:理想模型(针孔模型)、现实偏差(畸变)、数学描述(内外参矩阵)。这三块搞明白了,后面做同步和融合才不会懵。
2.1 针孔相机模型:最朴素的成像理想
针孔模型是摄像头成像的「理想国」。它假设光线通过一个小孔,在后面的成像平面上形成倒立的像。虽然真实摄像头都有透镜,但这个模型是理解所有几何关系的基础。
核心公式其实就一个相似三角形关系:
X_image = f * (X_world / Z_world)
Y_image = f * (Y_world / Z_world)
其中 f 是焦距,X_world、Y_world、Z_world 是物体在相机坐标系下的三维坐标。说白了,就是把三维点沿着视线方向「压」到成像平面上。
关键理解:针孔模型是线性的,但真实世界没有完美的针孔。它给了我们一个数学起点,所有后续的畸变校正、标定算法,都是在这个模型上做修正。
我在项目中遇到过一位同事,直接用针孔模型算像素坐标,结果边缘区域偏差很大。嗯,这就是忽略了畸变。所以记住:针孔模型是基础,但不能直接用。
2.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 是切向畸变系数。r 是像素到图像中心的距离。
避坑指南:我曾经在一个项目中只标定了 k1 和 k2,忽略了 k3,结果在广角镜头边缘区域校正效果很差。后来加上 k3 才解决问题。对于鱼眼镜头,甚至需要更高阶的模型。所以标定时,先看看你的镜头类型,再决定用几阶畸变模型。
2.3 内参与外参矩阵:从世界到像素的「翻译官」
成像过程可以拆成两步:外参把世界坐标转到相机坐标,内参把相机坐标转到像素坐标。
2.3.1 内参矩阵:相机自己的「基因」
内参矩阵描述的是相机内部的几何特性。它长这样:
K = [fx, 0, cx]
[ 0, fy, cy]
[ 0, 0, 1]
其中 fx、fy 是焦距在像素单位下的值,cx、cy 是光心在像素坐标系中的位置。这个矩阵一旦标定好,只要不改变焦距和分辨率,它就是固定的。
我建议你把内参矩阵理解为「相机出厂设置」。同一个相机,内参不变;换了相机,内参就得重新标。
2.3.2 外参矩阵:相机在空间中的「位置和朝向」
外参矩阵由旋转矩阵 R 和平移向量 t 组成:
[R | t]
它把世界坐标系下的点,变换到相机坐标系下。在多摄像头系统中,外参就是各个摄像头之间的相对位置关系。这也是同步和融合的核心数据之一。
个人经验:做多摄像头标定时,我习惯先固定一个主相机,把它的外参设为单位矩阵。其他相机的外参都是相对于这个主相机的。这样后续做图像拼接或三维重建时,坐标系统一,省去很多麻烦。
2.4 成像几何关系:从三维到二维的完整链条
把上面所有东西串起来,完整的成像过程就是:
- 世界坐标系下的点 P_w
- 通过外参 [R|t] 变换到相机坐标系 P_c
- 通过针孔模型投影到归一化平面 (x, y)
- 加上畸变得到 (x_distorted, y_distorted)
- 通过内参 K 映射到像素坐标 (u, v)
这个链条,就是摄像头成像的完整几何关系。你想想看,每一步都有对应的数学表达,每一步都可以通过标定来求解。
下面这张图把整个流程画清楚了:
2.5 本章小结:你需要记住的几件事
| 概念 | 核心作用 | 在多摄像头系统中的意义 |
|---|---|---|
| 针孔模型 | 理想成像的数学基础 | 所有几何计算的起点 |
| 透镜畸变 | 修正真实镜头的偏差 | 不校正畸变,融合后的图像会错位 |
| 内参矩阵 | 相机自身的几何属性 | 每个相机独立标定,不能混用 |
| 外参矩阵 | 相机在空间中的位姿 | 多摄像头同步和融合的核心数据 |
嗯,这一章的内容就这些。成像模型是后面所有章节的基石,尤其是外参矩阵,在多摄像头同步中会反复用到。我建议你动手画一遍从世界坐标到像素坐标的完整流程,把每一步的矩阵乘法写出来。这样做一遍,比看十遍都管用。