数学基础:坐标系与刚体变换、旋转矩阵、四元数、欧拉角、相机内参外参、针孔模型与畸变模型
三维重建的本质,是从二维图像像素反推三维空间几何结构的过程。这一过程涉及多个坐标系的频繁转换,以及描述刚体运动(旋转与平移)的数学工具。如果坐标系定义不统一、旋转表达方式选择不当或相机模型理解有偏差,后续的点云生成、深度估计和网格重建都会产生系统性误差。本章将系统梳理三维重建中最核心的数学基础,包括坐标系定义、刚体变换的三种表达方式(旋转矩阵、四元数、欧拉角)、相机内参与外参的物理意义,以及针孔模型与畸变模型的完整数学描述。
坐标系定义与刚体变换
核心原理:四个坐标系的定义与转换关系
三维重建中涉及四个关键坐标系:世界坐标系(描述物体在真实空间中的位置,单位通常为米)、相机坐标系(以相机光心为原点,Z轴指向相机前方)、图像坐标系(以光轴与成像平面的交点为原点,单位毫米)和像素坐标系(以图像左上角为原点,单位像素)。从世界坐标到像素坐标的完整链路为:世界坐标 → 相机坐标(通过外参R,t)→ 归一化平面坐标(通过透视投影)→ 像素坐标(通过内参K)。刚体变换描述的是物体在三维空间中的运动,包含旋转和平移两部分,数学上表示为 [R|t] 的4×4齐次矩阵。
判断方法:选择旋转表达方式的决策依据
旋转矩阵、四元数和欧拉角各有适用场景。旋转矩阵(3×3正交矩阵)适合坐标变换计算,但存在9个参数冗余且需满足正交约束;欧拉角直观易理解,但存在万向锁问题且插值不平滑;四元数(w,x,y,z)紧凑无奇异性,适合插值和滤波。实际工程中,存储和传输常用四元数,计算和显示常用旋转矩阵,人机交互调试常用欧拉角。三者可相互转换,例如四元数转旋转矩阵的公式为:
R = [[1-2(y²+z²), 2(xy-wz), 2(xz+wy)],
[2(xy+wz), 1-2(x²+z²), 2(yz-wx)],
[2(xz-wy), 2(yz+wx), 1-2(x²+y²)]]
案例拆解:多视角相机标定中的坐标系对齐
假设使用两台相机进行双目重建,左相机外参为 R₁,t₁,右相机外参为 R₂,t₂。初始标定得到的两相机相对变换为 R_rel = R₂·R₁ᵀ,t_rel = t₂ - R_rel·t₁。但在实际场景中,由于标定板摆放位置不同,世界坐标系原点可能不一致。此时需要将两相机统一到同一世界坐标系下,具体操作:选取左相机坐标系作为基准,将右相机坐标通过 R_rel, t_rel 变换到左相机坐标系。若标定板角点重投影误差超过0.5像素,应检查标定板是否平整、图像是否模糊,并重新采集数据。
常见误区与总结复盘
刚体变换是三维重建的基石,建议在代码中统一使用齐次坐标表示,并封装旋转矩阵、四元数、欧拉角之间的转换函数,便于调试和验证。
相机内参与外参
核心原理:内参描述相机内部几何,外参描述相机位姿
相机内参矩阵K描述了相机坐标系到像素坐标系的映射关系,其形式为:
K = [[fx, 0, cx],
[0, fy, cy],
[0, 0, 1]]
其中 fx, fy 分别为x、y方向的焦距(单位像素),cx, cy 为主点坐标(光轴与成像平面的交点)。外参矩阵 [R|t] 描述世界坐标系到相机坐标系的刚体变换。内参是相机的固有属性,不随相机移动而改变;外参则随相机位姿变化而变化。
判断方法:内参标定的操作流程与验证
内参标定通常使用棋盘格或圆点标定板,通过拍摄不同角度的标定板图像,利用张正友标定法求解内参。操作流程为:① 采集15-20张不同姿态的标定板图像;② 提取角点坐标;③ 使用OpenCV的 calibrateCamera() 函数计算内参和畸变系数;④ 验证重投影误差,通常要求小于0.3像素。若误差过大,应剔除模糊图像或增加图像数量。
案例拆解:单目相机标定中的参数分析
某项目使用分辨率为1920×1080的工业相机,标定结果如下:fx=1425.3, fy=1423.8, cx=960.5, cy=540.2,畸变系数 k1=-0.32, k2=0.12, p1=0.001, p2=-0.002, k3=0.01。重投影误差为0.21像素。分析发现 fx 与 fy 相差约1.5像素,说明传感器像素并非完全正方形,这属于正常制造公差。主点 (cx,cy) 接近图像中心,说明镜头安装较正。若 cx 偏离中心超过20像素,应检查镜头是否松动或传感器是否偏移。
常见误区与总结复盘
内参和外参共同决定了三维点投影到二维图像的精确位置。在三维重建中,外参通常通过特征匹配和PnP求解,而内参则通过离线标定获得。两者精度直接影响重建结果的尺度正确性。
针孔模型与畸变模型
核心原理:理想投影与真实投影的差异
针孔模型假设光线沿直线传播,三维点 (X,Y,Z) 在相机坐标系下的投影为 (x', y') = (X/Z, Y/Z),再通过内参转换为像素坐标 (u,v) = (fx·x' + cx, fy·y' + cy)。但真实镜头存在畸变,主要包括径向畸变(由镜头曲率引起)和切向畸变(由镜头与传感器不平行引起)。径向畸变数学模型为:
x_dist = x'·(1 + k1·r² + k2·r⁴ + k3·r⁶)
y_dist = y'·(1 + k1·r² + k2·r⁴ + k3·r⁶)
其中 r² = x'² + y'²。切向畸变模型为:
x_dist = x' + 2·p1·x'·y' + p2·(r² + 2·x'²)
y_dist = y' + p1·(r² + 2·y'²) + 2·p2·x'·y'
判断方法:畸变校正的两种策略
畸变校正有两种常用策略:直接校正(对每个像素计算畸变前的坐标,然后插值)和反向映射(从畸变图像坐标反算理想坐标)。OpenCV的 undistort() 函数采用反向映射策略,计算效率更高。对于实时应用,可预先计算校正查找表(LUT),避免每帧重复计算。
案例拆解:广角镜头畸变校正的参数调优
某项目使用焦距为2.8mm的广角镜头,畸变严重,图像边缘直线明显弯曲。标定得到 k1=-0.45, k2=0.25, k3=-0.08。直接使用OpenCV默认参数校正后,图像边缘出现拉伸伪影。分析发现 k3 值过大导致边缘过度校正。解决方案:将 k3 置为0,仅使用 k1, k2 进行校正,并设置 alpha=0.5 保留部分边缘像素。校正后重投影误差从0.8像素降至0.3像素,边缘直线恢复平直,但视场角损失约10%。
常见误区与总结复盘
fisheye::calibrate()),而非普通针孔模型。针孔模型是三维重建的基础,畸变模型则是对真实镜头的必要修正。在实际工程中,应优先使用标定得到的畸变系数进行校正,并验证校正后的图像质量。若校正后边缘质量下降,可适当降低校正强度或使用局部校正策略。
| 数学工具 | 参数维度 | 适用场景 | 常见问题 |
|---|---|---|---|
| 旋转矩阵 | 9个参数(3×3) | 坐标变换、矩阵运算 | 正交约束需维护 |
| 四元数 | 4个参数 | 插值、滤波、存储 | 需归一化 |
| 欧拉角 | 3个参数 | 人机交互、调试 | 万向锁、顺序依赖 |
| 内参K | 4个参数 | 像素坐标映射 | 变焦后需重新标定 |
| 外参[R|t] | 6个参数 | 世界到相机变换 | 相机移动后需更新 |
| 畸变系数 | 5个参数 | 镜头校正 | 过度校正产生伪影 |