相机外参初始估计

相机外参初始估计

算法概述

通过一组 3D-2D 匹配点对 (Xi,pi)(X_i, p_i)(Xi,pi),估计相机外参 (R,t)(R, t)(R,t)。其核心策略是:首先通过主成分分析 (PCA) 判断 3D 点集 XXX 是否共面。若共面,则将问题转化为一个更简单的 2D-2D 单应性 (Homography) 映射问题,并从中恢复出最终的 3D 姿态。


1. 数据准备

  • XXX: 一个 3×N3 \times N3×N 的矩阵,表示 NNN 个世界坐标系下的 3D 点。
  • pimgp_{img}pimg: 一个 2×N2 \times N2×N 的矩阵,表示对应的 NNN 个图像像素点。

归一化 : 像素点 pimgp_{img}pimg 通过相机内参 KKK 的逆和畸变矫正函数,变换为归一化相机平面上的点。我们用 ppp (一个 2×N2 \times N2×N 的矩阵) 表示这些归一化后的点。


2. 共面性检验

步骤 2.1: 中心化 : 计算 3D 点集的质心 Xˉ\bar{X}Xˉ,并对点集进行中心化。
Xˉ=1N∑i=1NXi,X˙=X−Xˉ \bar{X} = \frac{1}{N} \sum_{i=1}^{N} X_i \quad , \quad \dot{X} = X - \bar{X} Xˉ=N1i=1∑NXi,X˙=X−Xˉ

步骤 2.2: SVD 分解 : 计算中心化点云 X˙\dot{X}X˙ 的协方差矩阵 C=X˙X˙TC = \dot{X}\dot{X}^TC=X˙X˙T,并对其进行奇异值分解 (SVD)。
C=UΣUT,Σ=diag(σ1,σ2,σ3) 且 σ1≥σ2≥σ3 C = U \Sigma U^T \quad , \quad \Sigma = \text{diag}(\sigma_1, \sigma_2, \sigma_3) \text{ 且 } \sigma_1 \ge \sigma_2 \ge \sigma_3 C=UΣUT,Σ=diag(σ1,σ2,σ3) 且 σ1≥σ2≥σ3

  • UUU 的列向量是数据分布的主方向。
  • σi\sigma_iσi 是在对应主方向上的方差。

步骤 2.3: 判断 : 如果 σ3/σ2<ϵ\sigma_3 / \sigma_2 < \epsilonσ3/σ2<ϵ (一个很小的阈值),则点集可被视为共面。UUU 的第三列 u3u_3u3 即为该平面的法向量。


3. 坐标系变换

目标 (Objective)

我们的核心目标是进行一次坐标系变换 ,将原始的世界坐标系(我们称之为 WWW)变换到一个新的、经过精心选择的坐标系(我们称之为 PPP)。选择这个新坐标系 PPP 的原则是:让所有三维点 XXX 在这个新坐标系 PPP 中的 Z 坐标都为零

实现这个目标后,一个复杂的三维空间点投影问题,就被简化成了一个二维平面到二维图像的映射问题,从而为使用单应性矩阵 (Homography) 铺平了道路。

原理与步骤 (Principle and Steps)

一个刚体变换由旋转平移 两部分组成。我们需要找到一个旋转矩阵 RTR_TRT 和一个平移向量 tTt_TtT,使得变换后的新坐标 XpX_pXp 满足 Xp=RTX+tTX_p = R_T X + t_TXp=RTX+tT,且 XpX_pXp 的第三行为零。

1. 定义新坐标系 PPP 的姿态

一个坐标系由它的原点基向量(坐标轴方向)唯一确定。

  • 新坐标系的原点 : 我们选择原始 3D 点云的质心 Xˉ\bar{X}Xˉ 作为新坐标系 PPP 的原点。这是一个非常自然和方便的选择,因为它代表了点集的几何中心。

  • 新坐标系的基向量 : 我们利用 SVD 分解得到的矩阵 U=[u1u2u3]U = \begin{bmatrix} u_1 & u_2 & u_3 \end{bmatrix}U=[u1u2u3] 来定义新坐标系的坐标轴。

    • u1,u2u_1, u_2u1,u2: 这两个向量是点集分布方差最大的两个方向,它们构成了点集所在平面的一个正交基。我们将它们作为新坐标系 PPP 的 X 轴和 Y 轴。
    • u3u_3u3: 这个向量是点集所在平面的法向量 。我们将它作为新坐标系 PPP 的 Z 轴。

有了原点和坐标轴,新坐标系 PPP 就被完全定义了。它是一个以点云质心为中心,以点云主方向为坐标轴的坐标系。

2. 计算从世界坐标系 WWW 到新坐标系 PPP 的变换

现在我们需要计算将一个在 WWW 系下的点 XXX 转换为 PPP 系下的点 XpX_pXp 所需的 RTR_TRT 和 tTt_TtT。

  • 旋转矩阵 RTR_TRT

    目的 : 将世界坐标系 WWW 的基向量旋转到新坐标系 PPP 的基向量 (u1,u2,u3)(u_1, u_2, u_3)(u1,u2,u3) 上。
    计算 : 从 SVD 得到的矩阵 UUU 的列向量 u1,u2,u3u_1, u_2, u_3u1,u2,u3 构成了从 WWW 系的标准基到 PPP 系基的旋转。因此,将一个在 WWW 系中表示的向量转换到 PPP 系中去表示,所需要的旋转矩阵恰好是 UUU 的转置。
    RT=UT R_T = U^T RT=UT
    验证 : 这个旋转的目的,是把平面法向量 u3u_3u3 旋转成新坐标系的 Z 轴方向 (001)T\begin{pmatrix} 0 & 0 & 1 \end{pmatrix}^T(001)T。我们可以验证一下:

    由于 UUU 是正交矩阵,有 UTU=IU^T U = IUTU=I。u3u_3u3 是 UUU 的第三列,所以 UTu3U^T u_3UTu3 的结果必然是单位矩阵 III 的第三列,即:
    RTu3=UTu3=(001) R_T u_3 = U^T u_3 = \begin{pmatrix} 0 \\ 0 \\ 1 \end{pmatrix} RTu3=UTu3= 001

    这证明了 RT=UTR_T=U^TRT=UT 确实完成了我们期望的旋转。

  • 平移向量 tTt_TtT

    目的 : 将新坐标系的原点(即点云质心 Xˉ\bar{X}Xˉ)移动到坐标 (0,0,0)(0,0,0)(0,0,0)。
    计算 : 一个点 XXX 首先经过旋转,其坐标变为 RTXR_T XRTX。然后我们再进行平移。我们希望质心 Xˉ\bar{X}Xˉ 最终的坐标为零,即:
    RTXˉ+tT=0 R_T \bar{X} + t_T = 0 RTXˉ+tT=0

    由此直接解得:
    tT=−RTXˉ t_T = -R_T \bar{X} tT=−RTXˉ

变换的最终形式与结果 (Final Form and Result)

综合旋转与平移,将世界坐标系 WWW 下的点 XXX 变换到新坐标系 PPP 下的点 XpX_pXp 的完整公式为:
Xp=RTX+tT X_p = R_T X + t_T Xp=RTX+tT
最终结果 : 经过这个变换,我们得到的新坐标矩阵 XpX_pXp 的第三行所有元素都近似为零。这成功地将一个三维空间中的共面点问题,降维成了一个二维平面上的点分布问题,为下一步应用单应性矩阵求解姿态奠定了基础。


4. 单应性矩阵计算与分解

目标 : 求解从新坐标系的 XY 平面到相机归一化图像平面的单应性映射 HHH,并从 HHH 中分解出相机姿态。

原理:

  1. 问题转化 :

    经过上一步变换,我们得到了一组 Z=0 的 3D 点 XpX_pXp。我们可以忽略其 Z 分量,将其视为一组 2D 点,并用齐次坐标表示为 X~p\tilde{X}_pX~p (一个 3×N3 \times N3×N 矩阵,第三行为1)。

    现在,问题变成了寻找一个 3×33 \times 33×3 的单应性矩阵 HHH,它描述了从平面点 X~p\tilde{X}pX~p 到归一化图像点 ppp 之间的投影关系:
    si(pi1)=H(X~p,i1) s_i \begin{pmatrix} p_i \\ 1 \end{pmatrix} = H \begin{pmatrix} \tilde{X}
    {p,i} \\ 1 \end{pmatrix} si(pi1)=H(X~p,i1)

    这里的相机姿态 (R′,t′)(R', t')(R′,t′) 是相机相对于这个新构建的平面坐标系 的姿态。HHH 与该姿态的关系为:
    H=λ[r1′r2′t′] H = \lambda \begin{bmatrix} r'_1 & r'_2 & t' \end{bmatrix} H=λ[r1′r2′t′]

    其中 R′=[r1′r2′r3′]R' = \begin{bmatrix} r'_1 & r'_2 & r'_3 \end{bmatrix}R′=[r1′r2′r3′],t′t't′ 是平移向量,λ\lambdaλ 是一个任意尺度因子。

  2. 分解 HHH :

    设 H=[h1h2h3]H = \begin{bmatrix} h_1 & h_2 & h_3 \end{bmatrix}H=[h1h2h3]。

    • 恢复尺度 λ\lambdaλ : 由于 r1′r'_1r1′ 是旋转矩阵的列,它必须是单位向量。因此,∥λr1′∥=λ∥r1′∥=λ\| \lambda r'_1 \| = \lambda \| r'_1 \| = \lambda∥λr1′∥=λ∥r1′∥=λ。我们可以从 h1h_1h1 的范数来估计尺度:
      λ≈∥h1∥ \lambda \approx \|h_1\| λ≈∥h1∥

    • 恢复旋转矩阵 R′R'R′ :
      r1′=h1λ r'_1 = \frac{h_1}{\lambda} r1′=λh1

      由于噪声影响,h2/λh_2/\lambdah2/λ 可能不与 r1′r'_1r1′ 完全正交。我们需要使用格拉姆-施密特 (Gram-Schmidt) 正交化来强制正交性:
      r2′=h2−(h2Tr1′)r1′∥h2−(h2Tr1′)r1′∥ r'_2 = \frac{h_2 - (h_2^T r'_1) r'_1}{\| h_2 - (h_2^T r'_1) r'_1 \|} r2′=∥h2−(h2Tr1′)r1′∥h2−(h2Tr1′)r1′

      旋转矩阵的第三列可以通过前两列的叉积得到:
      r3′=r1′×r2′ r'_3 = r'_1 \times r'_2 r3′=r1′×r2′

      至此,我们得到了相机相对于新坐标系的旋转矩阵 R′=[r1′r2′r3′]R' = \begin{bmatrix} r'_1 & r'_2 & r'_3 \end{bmatrix}R′=[r1′r2′r3′]。

    • 恢复平移向量 t′t't′ :
      t′=h3λ t' = \frac{h_3}{\lambda} t′=λh3


5. 姿态转换回原始世界坐标系

我们已经求得相机相对于平面坐标系的姿态 (R′,t′)(R', t')(R′,t′),以及平面坐标系相对于世界坐标系的姿态 (RT,tT)(R_T, t_T)(RT,tT)。现在需要计算相机相对于世界坐标系的最终姿态 (R,t)(R, t)(R,t)。

一个世界点 XXX 在相机坐标系下的坐标 XcX_cXc 可以通过两次变换得到:
Xc=R′Xp+t′=R′(RTX+tT)+t′=(R′RT)X+(R′tT+t′) \begin{align*} X_c & = R' X_p + t' \\ & = R' (R_T X + t_T) + t' \\ & = (R' R_T) X + (R' t_T + t') \end{align*} Xc=R′Xp+t′=R′(RTX+tT)+t′=(R′RT)X+(R′tT+t′)

根据相机模型的定义 Xc=RX+tX_c = R X + tXc=RX+t,我们可以得到:
R=R′RT R = R' R_T R=R′RT

t=R′tT+t′ t = R' t_T + t' t=R′tT+t′

这就是最终输出的相机旋转矩阵和平移向量。

相关推荐
天涯路s4 小时前
OpenCV 视频处理
人工智能·opencv·计算机视觉·目标跟踪
AndrewHZ4 小时前
【图像处理基石】图像对比度增强入门:从概念到实战(Python+OpenCV)
图像处理·python·opencv·计算机视觉·cv·对比度增强·算法入门
宁清明5 小时前
【小宁的学习日记2 C语言】C语言判断
c语言·学习·算法
2401_841495646 小时前
【数据结构】基于Prim算法的最小生成树
java·数据结构·c++·python·算法·最小生成树·prim
昵称是6硬币7 小时前
YOLO26论文精读(逐段解析)
人工智能·深度学习·yolo·目标检测·计算机视觉·yolo26
祈祷苍天赐我java之术8 小时前
解析常见的限流算法
java·数据结构·算法
Shinom1ya_9 小时前
算法 day 34
算法
啊董dong9 小时前
课后作业-2025-10-26
c++·算法·noi
liu****9 小时前
1.模拟算法
开发语言·c++·算法·1024程序员节