PnP——根据3D与2d图片估计相机运动

news/2025/2/24 8:02:09

引入

当知道n个3D空间点及其投影位置和2d像素点时,如何估计相机的位姿。PnP(Perspective-n-Point) 是求解3D到2D点对运动的方法。

直接线性变换(DLT)

问题描述

已知一组3D点 P i = ( X i , Y i , Z i , 1 ) ⊤ \mathbf{P}_i = (X_i, Y_i, Z_i, 1)^\top Pi=(Xi,Yi,Zi,1) 及其在相机中的投影 x i = ( u i , v i , 1 ) ⊤ \mathbf{x}_i = (u_i, v_i, 1)^\top xi=(ui,vi,1),求相机的旋转矩阵 R \mathbf{R} R 和平移向量 t \mathbf{t} t


求解步骤

1. 构建投影方程

齐次坐标投影关系:
s i [ u i v i 1 ] = [ R ∣ t ] P i s_i \begin{bmatrix} u_i \\ v_i \\ 1 \end{bmatrix} = [\mathbf{R} |\mathbf{t}]\mathbf{P}_i si uivi1 =[Rt]Pi
其中 R = [ r 1 , r 2 , r 3 ] ⊤ R=[r_1,r_2,r_3]^\top R=[r1,r2,r3] t = ( t x , t y , t z ) ⊤ \mathbf{t} = (t_x, t_y, t_z)^\top t=(tx,ty,tz)
T = [ R ∣ t ] = [ T 1 , T 2 , T 3 ] ⊤ T=[\mathbf{R} |\mathbf{t}]=[\mathbf{T_1},\mathbf{T_2},\mathbf{T_3}]^\top T=[Rt]=[T1,T2,T3]
消去尺度因子 s i s_i si,得到两个方程:
{ T 1 T P i − T 3 T P i u i = 0 T 2 T P i − T 3 T P i v i = 0 \begin{cases} \mathbf{T_1^{T}}\mathbf{P}_i -\mathbf{T_3^{T}}\mathbf{P}_iu_i=0\\ \mathbf{T_2^{T}}\mathbf{P}_i -\mathbf{T_3^{T}}\mathbf{P}_iv_i=0 \end{cases} {T1TPiT3TPiui=0T2TPiT3TPivi=0


2. 构造线性方程组

对每个3D点 P i \mathbf{P}_i Pi,构造矩阵 A \mathbf{A} A 的两行:
[ P i 0 − u i P i 0 P i − v i P i ] \begin{bmatrix} \mathbf{P}_i & 0 & -u_i \mathbf{P}_i \\ 0 & \mathbf{P}_i & -v_i \mathbf{P}_i \end{bmatrix} [Pi00PiuiPiviPi]
最终超定方程组为:
A T = 0 \mathbf{A} \mathbf{T} = \mathbf{0} AT=0


3. SVD求解投影矩阵

A \mathbf{A} A 进行奇异值分解:
A = U Σ V ⊤ \mathbf{A} = \mathbf{U} \mathbf{\Sigma} \mathbf{V}^\top A=V
V \mathbf{V} V 的最后一列作为解 T \mathbf{T} T


4. 分解 R \mathbf{R} R t \mathbf{t} t
  • 提取子矩阵
    T \mathbf{T} T的前三列为 R \mathbf{R} R,最后一列为 t \mathbf{t} t:
    R = [ r 1 ⊤ r 2 ⊤ r 3 ⊤ ] , t = [ t x t y t z ] \mathbf{R} = \begin{bmatrix} \mathbf{r}_1^\top \\ \mathbf{r}_2^\top \\ \mathbf{r}_3^\top \end{bmatrix}, \quad \mathbf{t} = \begin{bmatrix} t_x \\ t_y \\ t_z \end{bmatrix} R= r1r2r3 ,t= txtytz
  • 正交化 R \mathbf{R} R
    在DLT求解中,我们直接将T矩阵看成了12个未知数,忽略了它们之间的联系。因为旋转矩阵R∈SO(3),用DLT求出的解不一定满足该约束。对于旋转矩阵R,我们必须针对DLT估计的T左边3×3的矩阵块,寻找一个最好的旋转矩阵对它进行近似。具体的做法是:
    R \mathbf{R} R 进行SVD分解:
    R = U Σ V ⊤ ⇒ R 正交 = U V ⊤ \mathbf{R} = \mathbf{U} \mathbf{\Sigma} \mathbf{V}^\top \quad \Rightarrow \quad \mathbf{R}_{\text{正交}} = \mathbf{U} \mathbf{V}^\top R=VR正交=UV
    det ⁡ ( R ) < 0 \det(\mathbf{R}) < 0 det(R)<0,需将 R \mathbf{R} R 的第三列取反。

最终答案

相机位姿的解为:
R ,   t \boxed{ \mathbf{R}, \ \mathbf{t} } R, t


http://www.niftyadmin.cn/n/5864096.html

相关文章

【Git 学习笔记_27】DIY 实战篇:利用 DeepSeek 实现 GitHub 的 GPG 秘钥创建与配置

文章目录 1 前言2 准备工作3 具体配置过程3.1. 本地生成 GPG 密钥3.2. 导出 GPG 密钥3.3. 将密钥配置到 Git 中3.4. 测试提交 4 问题排查记录5 小结与复盘 1 前言 昨天在更新我的第二个 Vim 专栏《Mastering Vim (2nd Ed.)》时遇到一个经典的 Git 操作问题&#xff1a;如何在 …

【Python量化金融实战】-第1章:Python量化金融概述:1.1量化金融的定义与发展历程

本小节学习建议&#xff1a;掌握Python编程、统计学&#xff08;时间序列分析&#xff09;、金融学基础&#xff08;资产定价理论&#xff09;三者结合&#xff0c;是进入量化领域的核心路径。 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章目录 1.1 量化金…

06C语言——指针

一、指针入门 (1)、准备知识 0、图解&#xff1a; 1、内存地址 字节&#xff1a;字节是内存的容量单位&#xff0c;英文称为 byte&#xff0c;一个字节有8位&#xff0c;即 1byte(0000 0000 --- 1111 1111) 8bits(0 --- 1) 地址&#xff1a;系统为了便于区分每一个字节而对…

基于模仿学习(IL)的端到端自动驾驶发展路径

基于模仿学习&#xff08;IL&#xff09;的端到端自动驾驶发展路径 1. 核心论文解析 (1) UniAD&#xff1a;感知-规划一体化 核心思想&#xff1a;首次提出将感知任务&#xff08;如目标检测、车道线识别、轨迹预测&#xff09;与规划任务集成到统一的端到端框架中&#xff…

css+js提问

文章目录 1. css部分隐藏元素的几种方式 2. js部分 1. css部分 隐藏元素的几种方式 overflow: hidden;display: noneopacity: 0position&#xff1a;top和left设置成足够大的负数visibility: hidden设置height&#xff0c;width等盒模型属性为0 盒子模型 标准盒子模型&#xf…

关于order by的sql注入实验

实验描述 本实验基于sqli-lab的第46关进行测试 本关的sql 语句为$sql "SELECT * FROM users ORDER BY $id" 利用sort进行sql注入&#xff0c;我们可以利用报错注入&#xff0c;延时注入来爆出数据 1.报错注入 1.手工测试 爆出数据库 ?sort(extractvalue(1, c…

计算机网络真题练习(高软29)

系列文章目录 计算机网络阶段练习 文章目录 系列文章目录前言一、真题练习总结 前言 计算机网络的阶段练习题&#xff0c;带解析答案。 一、真题练习 总结 就是高软笔记&#xff0c;大佬请略过&#xff01;

【MySQL 一 数据库基础】深入解析 MySQL 的索引(3)

索引 索引操作 自动创建 当我们为一张表加主键约束(Primary key)&#xff0c;外键约束(Foreign Key)&#xff0c;唯一约束(Unique)时&#xff0c;MySQL会为对应的的列自动创建一个索引&#xff1b;如果表不指定任何约束时&#xff0c;MySQL会自动为每一列生成一个索引并用ROW_I…