2. 相机模型基础
在 PnP 视觉定位中,我们最终要回答的问题是:已知若干 3D 空间点及其在图像上的 2D 投影,如何反求相机相对这些点的位姿?要回答这个问题,必须先建立一套描述“三维世界如何变成二维像素”的数学语言。这套语言由针孔相机模型、内参矩阵、外参矩阵、畸变模型以及齐次坐标与投影变换共同构成。它们是后续所有 PnP 求解、位姿优化与误差分析的共同基础。
一、针孔相机模型:从三维点到像素的几何抽象
针孔相机模型把相机简化为一个理想的小孔成像系统:光线从世界点出发,穿过光心(投影中心),落在成像平面上。设相机坐标系下某点坐标为 P_c = (X_c, Y_c, Z_c),焦距为 f,则它在归一化成像平面上的投影为:
x = f * X_c / Z_c
y = f * Y_c / Z_c
这里 Z_c 是深度,除法体现了“近大远小”的透视效应。若把像素坐标写成 (u, v),并引入像素物理尺寸与主点偏移,就得到更常用的形式:
u = fx * X_c / Z_c + cx
v = fy * Y_c / Z_c + cy
其中 fx = f / dx、fy = f / dy 是以像素为单位的焦距,(cx, cy) 是主点(光轴与图像平面的交点)。这一步完成了从“物理成像”到“像素坐标”的转换,也是内参矩阵的雏形。
二、内参矩阵:相机自身的“身份证”
把上述线性关系写成矩阵形式,就得到内参矩阵 K:
K = [ fx 0 cx ]
[ 0 fy cy ]
[ 0 0 1 ]
内参矩阵描述的是相机内部属性,与相机在世界中的位置和朝向无关。它包含四个核心参数:fx、fy、cx、cy。在工程中,内参通常通过棋盘格标定获得,标定质量直接影响 PnP 的精度。若内参不准,即使外参求解算法再优秀,重投影误差也会系统性偏大。
fx 和 fy 当成“焦距”,严格说它们是以像素为单位的焦距,量纲是 pixel,而不是毫米。三、外参矩阵:相机在世界中的位姿
外参描述相机坐标系与世界坐标系之间的刚体变换,由旋转矩阵 R 和平移向量 t 组成。若世界点为 P_w,则:
P_c = R * P_w + t
写成齐次形式为:
[P_c] [ R t ] [P_w]
[ 1 ] = [ 0 1 ] [ 1 ]
PnP 问题的本质,就是在已知 K 和若干组 (P_w, u, v) 的条件下,求解 R 与 t。因此外参矩阵是 PnP 的直接输出,也是视觉定位系统最关心的量。旋转矩阵必须满足正交性 R^T R = I 且 det(R) = 1,这是后续优化中必须保持的约束。
四、畸变模型:真实镜头的非线性修正
针孔模型是理想线性的,但真实镜头存在畸变,主要包括径向畸变和切向畸变。径向畸变由镜头形状引起,常用 k1, k2, k3 描述;切向畸变由镜头与成像平面不平行引起,常用 p1, p2 描述。归一化坐标 (x, y) 的畸变修正通常写为:
r2 = x*x + y*y
x_dist = x*(1 + k1*r2 + k2*r2*r2 + k3*r2*r2*r2) + 2*p1*x*y + p2*(r2 + 2*x*x)
y_dist = y*(1 + k1*r2 + k2*r2*r2 + k3*r2*r2*r2) + p1*(r2 + 2*y*y) + 2*p2*x*y
在 PnP 流程中,通常先用畸变系数把观测到的像素点“去畸变”到理想针孔模型下,再参与位姿求解。若忽略畸变,边缘区域的点会带来明显误差,尤其在广角镜头或近距离拍摄时更为严重。
五、齐次坐标与投影变换:统一表达的数学工具
齐次坐标把 (X, Y, Z) 扩展为 (X, Y, Z, 1),把平移和旋转统一成矩阵乘法,同时把投影中的除法隐藏到“齐次化”步骤中。完整的投影链路可以写成:
s * [u, v, 1]^T = K * [R | t] * [X_w, Y_w, Z_w, 1]^T
其中 s 是尺度因子,通常等于 Z_c。这个公式是 PnP 视觉定位的核心方程:左边是图像观测,右边是内参、外参与世界点。理解它的每个因子,就理解了 PnP 的全部输入与输出。
六、参数关系与工程对照
下表把本节涉及的核心对象、符号、含义与在 PnP 中的角色做一次集中对照,便于工程中快速查阅。
| 对象 | 符号 | 含义 | 在 PnP 中的角色 |
|---|---|---|---|
| 内参矩阵 | K | fx, fy, cx, cy | 已知输入,连接相机坐标与像素坐标 |
| 外参矩阵 | [R | t] | 旋转与平移 | 待求解输出,即相机位姿 |
| 径向畸变 | k1, k2, k3 | 镜头形状引起的非线性 | 去畸变预处理 |
| 切向畸变 | p1, p2 | 镜头与像面不平行 | 去畸变预处理 |
| 齐次坐标 | (X, Y, Z, 1) | 统一表达旋转、平移与投影 | 构建线性方程组的工具 |
| 重投影误差 | e = (u, v) − (û, v̂) | 观测与预测像素之差 | 位姿优化的目标函数 |
七、案例场景:从标定到 PnP 的完整链路
假设一个工业相机拍摄标定板,标定得到 K 与畸变系数 k1, k2, p1, p2。随后在定位场景中,识别到 8 个已知世界坐标的标记点,并提取其像素坐标。工程流程如下:
- 用畸变系数对像素点做去畸变,得到理想针孔模型下的坐标;
- 将世界点写成齐次形式
(X_w, Y_w, Z_w, 1); - 构造投影方程
s·[u,v,1]^T = K·[R|t]·P_w; - 用 DLT 或 EPnP 求初始
R, t; - 以重投影误差最小为目标,用 LM 迭代优化
R, t; - 输出相机相对标定板的世界位姿,用于机器人抓取或 AR 叠加。
八、常见误区与复盘
- 误区一:把内参当成外参一起优化。内参应在标定阶段固定,PnP 阶段只优化外参,否则容易过拟合、位姿不稳定。
- 误区二:忽略畸变直接做 PnP。在图像边缘,畸变可达数十像素,直接求解会导致位姿系统性偏移。
- 误区三:旋转矩阵不约束正交性。优化后若
R不满足R^T R = I,投影结果会失真,需用 SVD 或四元数重新正交化。 - 误区四:点对数量不足或分布集中。PnP 至少需要 3 组点(P3P),但工程中建议 6 组以上且空间分布分散,以提升数值稳定性。
- 误区五:混淆像素坐标与归一化坐标。归一化坐标不含内参,像素坐标含内参,二者在公式中的位置不同。
掌握本节内容后,你已经具备理解 PnP 求解器的全部前置知识:针孔模型给出投影几何,内参描述相机自身,外参描述相机位姿,畸变模型修正真实镜头,齐次坐标与投影变换提供统一数学表达。后续的 DLT、EPnP、迭代优化,都是在这套模型之上展开的具体求解方法。