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 的全部输入与输出。

针孔相机投影链路:世界点 → 相机坐标 → 归一化平面 → 像素坐标 世界坐标系 P_w = (X_w, Y_w, Z_w) 齐次形式 (X, Y, Z, 1) 外参 [R | t] P_c = R·P_w + t 描述相机位姿 相机坐标系 P_c = (X_c, Y_c, Z_c) 深度 Z_c 决定尺度 内参 K fx, fy, cx, cy 像素坐标映射 s · [u, v, 1]ᵀ = K · [R | t] · [X_w, Y_w, Z_w, 1]ᵀ PnP 核心方程:已知 K 与多组 (P_w, u, v),求解 R 与 t 畸变模型 径向:k1, k2, k3 切向:p1, p2 去畸变后再参与 PnP 齐次坐标 (X, Y, Z) → (X, Y, Z, 1) 统一旋转与平移 除法隐藏在齐次化中 像素观测 (u, v) 图像坐标 重投影误差 = 观测 − 预测 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 个已知世界坐标的标记点,并提取其像素坐标。工程流程如下:

  1. 用畸变系数对像素点做去畸变,得到理想针孔模型下的坐标;
  2. 将世界点写成齐次形式 (X_w, Y_w, Z_w, 1);
  3. 构造投影方程 s·[u,v,1]^T = K·[R|t]·P_w;
  4. 用 DLT 或 EPnP 求初始 R, t;
  5. 以重投影误差最小为目标,用 LM 迭代优化 R, t;
  6. 输出相机相对标定板的世界位姿,用于机器人抓取或 AR 叠加。
关键认知:PnP 的输入是“内参 + 畸变 + 3D-2D 对应点”,输出是“外参”。内参与畸变属于相机固有属性,外参属于场景相关属性,二者不可混淆。

八、常见误区与复盘

  • 误区一:把内参当成外参一起优化。内参应在标定阶段固定,PnP 阶段只优化外参,否则容易过拟合、位姿不稳定。
  • 误区二:忽略畸变直接做 PnP。在图像边缘,畸变可达数十像素,直接求解会导致位姿系统性偏移。
  • 误区三:旋转矩阵不约束正交性。优化后若 R 不满足 R^T R = I,投影结果会失真,需用 SVD 或四元数重新正交化。
  • 误区四:点对数量不足或分布集中。PnP 至少需要 3 组点(P3P),但工程中建议 6 组以上且空间分布分散,以提升数值稳定性。
  • 误区五:混淆像素坐标与归一化坐标。归一化坐标不含内参,像素坐标含内参,二者在公式中的位置不同。
排障建议:当 PnP 结果抖动或偏差大时,先检查内参与畸变是否匹配当前相机,再检查 3D 点与 2D 点是否一一对应,最后检查旋转矩阵是否正交。多数问题出在输入数据,而不是求解算法本身。

掌握本节内容后,你已经具备理解 PnP 求解器的全部前置知识:针孔模型给出投影几何,内参描述相机自身,外参描述相机位姿,畸变模型修正真实镜头,齐次坐标与投影变换提供统一数学表达。后续的 DLT、EPnP、迭代优化,都是在这套模型之上展开的具体求解方法。