当前位置: 首页 > news >正文

相机外参初始估计

相机外参初始估计

算法概述

通过一组 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=1NXi,X˙=XXˉ

步骤 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_TRTtTt_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=Iu3u_3u3UUU 的第三列,所以 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=λ[r1r2t]
    其中 R′=[r1′r2′r3′]R' = \begin{bmatrix} r'_1 & r'_2 & r'_3 \end{bmatrix}R=[r1r2r3]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)r1h2(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=[r1r2r3]

    • 恢复平移向量 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=RXp+t=R(RTX+tT)+t=(RRT)X+(RtT+t)
根据相机模型的定义 Xc=RX+tX_c = R X + tXc=RX+t,我们可以得到:
R=R′RT R = R' R_T R=RRT

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

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

http://www.dtcms.com/a/535895.html

相关文章:

  • Excel 学习笔记
  • 网站地图模板一站式网络营销
  • 如何检查开源CMS的数据库连接问题?
  • VTK入门:vtkQuadraticHexahedron——会“弯曲”的高精度六面体
  • 基于python大数据的城市扬尘数宇化监控系统的设计与开发
  • MCU定点计算深度解析:原理、技巧与实现
  • 【普中Hi3861开发攻略--基于鸿蒙OS】-- 第 28 章 WIFI 实验-UDP 通信
  • 【C++ string 类实战指南】:从接口用法到 OJ 解题的全方位解析
  • 门户网站 建设 如何写公司名称变更网上核名怎么弄
  • 并发编程基础
  • 第六部分:VTK进阶(第174章 空间流式与增量处理)
  • 智谱GLM-4.6/4.5深度解析:ARC三位一体的技术革命与国产模型崛起
  • 221. Java 函数式编程风格 - 从命令式风格到函数式风格:计算文件中包含指定单词的行数
  • Linux操作系统-进程的“夺舍”:程序替换如何清空内存、注入新魂?
  • 基于微信小程序的奶茶店点餐平台【2026最新】
  • 微信小程序-智慧社区项目开发完整技术文档(中)
  • 做设计用什么软件seo优化排名价格
  • 《算法通关指南数据结构和算法篇(3)--- 栈和stack》
  • 如何建设诗词网站盘县网站开发
  • 空间数据采集与管理丨在 ArcGIS Pro 中利用模型构建器批处理多维数据
  • 【数据结构】大话单链表
  • Volta 管理 Node.js 工具链指南
  • 《HTTP 中的“握手”:从 TCP 到 TLS 的安全通信之旅》
  • 计算机网络6
  • 信息咨询公司网站源码深圳白狐工业设计公司
  • 网站开发 李博如何建一个自己的网站
  • 智能家居设备离线视频回看功能设计:缓存、断网恢复与存储管理的硬核攻略
  • AIOT进军纳斯达克,推动Web3健康金融迈向全球资本市场
  • springAI +openAI 接入阿里云百炼大模型-通义千问
  • LeetCode 2441.与对应负数同时存在的最大正整数