3D-2D:PnP

news2024/10/6 20:37:02

直接线性变换

Perspective-n-Point 是求解3D到2D点对运动的方法。它描述了已知n个3D空间点及其投影位置时,如何估计相机的位姿。
2D-2D的对极几何方法需要8个或8个以上的点对(以八点法为例),且存在初始化、纯旋转和尺度的问题。然而,如果两张图像中的特征点的3D位置已知,那么最少只需3个点对(以及至少一个额外点验证结果)就可以估计相机运动。

已知一组3D点的位置,以及它们在某个相机中的投影位置,求该相机的位姿。这个问题也可以用于求解给定地图和图像时的相机状态问题。如果把3D点看成在另一个相机坐标系的点的话,也可以用来求解两个相机的相对运动问题,如果把3D点看做目标物体自身坐标系中的点的话,也可以用来求解目标物体相对相机的位姿。

考虑某个空间点 P P P,它的齐次坐标为 P = ( X , Y , Z , 1 ) T \bm{P}=(X,Y,Z,1)^T P=(X,Y,Z,1)T。在图像 I 1 I_1 I1中,投影到特征点 x 1 = ( x ˉ 1 , y ˉ 1 , 1 ) T \bm{x}_1=(\bar{x}_1,\bar{y}_1,1)^T x1=(xˉ1,yˉ1,1)T(以归一化平面齐次坐标表示)。此时,相机的位姿 R , t \bm{R},\bm{t} R,t是未知的。与单应矩阵的求解类似,我们定义增广矩阵 [ R t ] \begin{array}{l|l}[\bm{R}&\bm{t}]\end{array} [Rt]为一个 3 × 4 3\times4 3×4的矩阵,包含了旋转与平移信息。
s ( x ˉ 1 y ˉ 1 1 ) = [ R t ] P = ( t 1 t 2 t 3 t 4 t 5 t 6 t 7 t 8 t 9 t 10 t 11 t 12 ) ( X Y X 1 ) s\begin{pmatrix}\bar{x}_1\\\bar{y}_1\\1\end{pmatrix}=\begin{array}{l|l}[\bm{R}&\bm{t}]\bm{P}\end{array} =\begin{pmatrix}t_1&t_2&t_3&t_4\\t_5&t_6&t_7&t_8\\t_9&t_{10}&t_{11}&t_{12}\end{pmatrix} \begin{pmatrix} X\\Y\\X\\1 \end{pmatrix} sxˉ1yˉ11=[Rt]P=t1t5t9t2t6t10t3t7t11t4t8t12XYX1
用最后一行把 s s s消去,得到两个约束:
u 1 = t 1 X + t 2 Y + t 3 Z + t 4 t 9 X + t 10 Y + t 11 Z + t 12 v 1 = t 5 X + t 6 Y + t 7 Z + t 8 t 9 X + t 10 Y + t 11 Z + t 12 u_1=\dfrac{t_1 X+t_2 Y+t_3 Z +t_4}{t_9X+t_{10}Y+t_{11}Z+t_{12}}\\ v_1=\dfrac{t_5 X+t_6 Y+t_7 Z +t_8}{t_9X+t_{10}Y+t_{11}Z+t_{12}} u1=t9X+t10Y+t11Z+t12t1X+t2Y+t3Z+t4v1=t9X+t10Y+t11Z+t12t5X+t6Y+t7Z+t8
为简化表示,定义 T \bm{T} T的行向量:
t 1 = ( t 1 , t 2 , t 3 , t 4 ) T t 2 = ( t 1 , t 2 , t 3 , t 4 ) T t 1 = ( t 1 , t 2 , t 3 , t 4 ) T \bm{t}_1=\begin{pmatrix}t_1,t_2,t_3,t_4\end{pmatrix}^T\\ \bm{t}_2=\begin{pmatrix}t_1,t_2,t_3,t_4\end{pmatrix}^T\\ \bm{t}_1=\begin{pmatrix}t_1,t_2,t_3,t_4\end{pmatrix}^T t1=(t1,t2,t3,t4)Tt2=(t1,t2,t3,t4)Tt1=(t1,t2,t3,t4)T
于是有
t 1 T P − t 3 T P u 1 = 0 t 2 T P − t 3 T P v 1 = 0 \bm{t}_1^T\bm{P}-\bm{t}_3^T\bm{P}u_1=0\\ \bm{t}_2^T\bm{P}-\bm{t}_3^T\bm{P}v_1=0 t1TPt3TPu1=0t2TPt3TPv1=0
注意 t \bm{t} t是待求的变量,每个特征点提供了两个关于 t t t的线性约束。假设一共有 N N N个特征点,则可以列出如下线性方程组:
( P 1 T 0 − u 1 P 1 T 0 P 1 T − v 1 P 1 T ⋮ ⋮ ⋮ P N T 0 − u N P N T 0 P N T − v N P N T ) ( t 1 t 2 t 3 ) = 0 \begin{pmatrix} \bm{P}_1^T&0&-u_1\bm{P}_1^T\\ 0&\bm{P}_1^T&-v_1\bm{P}_1^T\\ \vdots&\vdots&\vdots\\ \bm{P}_N^T&0&-u_N\bm{P}_N^T\\ 0&\bm{P}_N^T&-v_N\bm{P}_N^T \end{pmatrix} \begin{pmatrix} \bm{t}_1\\\bm{t}_2\\\bm{t}_3 \end{pmatrix} =0 P1T0PNT00P1T0PNTu1P1Tv1P1TuNPNTvNPNTt1t2t3=0
t \bm{t} t一共有12维,因此最少通过6对匹配点即可实现矩阵T的线性求解,这种方法称为DLT。当匹配点大于6对时,也可以使用SVD等方法对超定方程求最小二乘解。
在DLT求解中我们直接将 T \bm{T} T矩阵看成了12个未知数,忽略了它们之间的联系。因为旋转矩阵 R ∈ S O ( 3 ) \bm{R}\in \rm SO(3) RSO(3),用DLT求出的解不一定满足该约束,它是一个一般矩阵。平移向量比较好办,它属于向量空间。对于旋转矩阵 R \bm{R} R,我们必须针对DLT估计的 T \bm{T} T左侧 3 × 3 3\times 3 3×3矩阵块,寻找一个最好的旋转矩阵对它进行近似。这可以由QR分解完成,也可以像这样来计算:
R ← ( R R T ) − 1 2 R \bm{R}\leftarrow (\bm{RR}^T)^{-\frac{1}{2}}\bm{R} R(RRT)21R

在这里插入图片描述

最小化重投影误差求解PnP

前面说的线性方程,往往是先求相机位姿,再求空间点位置,非线性优化则是把它们看成优化变量,放在一起优化。
这是一种非常通用的求解方式,我可以用它对PnP和ICP给出的结果进行优化。这一类把相机和三维点放在一起进行最优化的问题,统称为Bundle Adjustment。

考虑n个三维空间点P及其投影p,我们希望计算相机的位姿 R , t \bm{R},\bm{t} R,t,它的李群表示为 T \bm{T} T 。假设某空间点坐标为 P i = [ X i , Y i , Z i ] T \bm{P}_i =[X_i ,Y_i ,Z_i ]^T Pi=[Xi,Yi,Zi]T ,其投影的像素坐标为 q i = [ u i , v i ] T \bm{q}_i =[u_i ,v_i ]^T qi=[ui,vi]T
s i [ u i v i 1 ] = K T [ X i Y i Z i 1 ] s_i\begin{bmatrix}u_i\\v_i\\1\end{bmatrix} =\bm{KT}\begin{bmatrix}X_i\\Y_i\\Z_i\\1\end{bmatrix} siuivi1=KTXiYiZi1
写成矩阵形式:
s i q i = K T P i s_i\bm{q}_i=\bm{KTP}_i siqi=KTPi
这个式子隐含了一次从齐次坐标到非齐次的转换,由于相机位姿未知及观测点的噪声,该等式存在一个误差。因此,我们把误差求和,构建最小二乘问题,然后寻找最好的相机位姿,使它最小化:
T ∗ = arg ⁡ min ⁡ T 1 2 ∑ i = 1 n ∥ u i − 1 s i K T P i ∥ 2 2 \bm{T}^{\ast }=\arg \min _{\bm{T}}\dfrac{1}{2}\sum ^{n}_{i=1}\left\| \bm{u}_{i}-\dfrac{1}{s_{i}}\bm{KTP}_{i}\right\| _{2}^{2} T=argTmin21i=1nuisi1KTPi22
该问题的误差项,是将3D点的投影位置与观测位置作差,所以称为重投影误差。 用齐次坐标时,这个误差有3维。不过,由于 u \bm{u} u最后一维为1,该维度的误差一直为零, 因而我们更多时使用非齐次坐标,于是误差只有2维了。 我们通过特征匹配知道了 p 1 p_1 p1 p 2 p_2 p2 是同一个空间点 P P P的投影, 但是不知道相机的位姿。在初始值中, P P P的计算投影 p ^ 2 \hat{p}_2 p^2 与实际的 p 2 p_2 p2之间有一定的距离。于是我们调整相机的位姿,使得这个距离变小 。不过,由于这个调整需要考虑很多个点,所以最后追求的效果是整体误差的缩小,而每个点的误差通常不会精确为零。

在这里插入图片描述
我们需要知道每个误差项关于优化变量的导数,也就是线性化
e ( x + Δ x ) ≈ e ( x ) + J T Δ x e\left( x+\Delta x\right) \approx e\left( x\right) +J^{T}\Delta x e(x+Δx)e(x)+JTΔx
e e e为像素坐标误差(2维), x x x维相机位姿(6维)时, J T J^T JT将是一个 2 × 6 2\times 6 2×6的矩阵。
P ′ = ( T P ) 1 : 3 = [ X ′ , Y ′ , Z ′ ] T P'=\left( TP\right) _{1:3}=\left[ X',Y',Z'\right] ^{T} P=(TP)1:3=[X,Y,Z]T
那么,相机投影模型相对于 P ′ P' P
s u = K P ′ su =KP' su=KP
展开:
[ s u s v s ] = [ f x 0 c x 0 f y c y 0 0 1 ] [ X ′ Y ′ Z ′ ] \begin{bmatrix} su \\ sv \\ s \end{bmatrix}=\begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix}\begin{bmatrix} X' \\ Y' \\ Z' \end{bmatrix} susvs=fx000fy0cxcy1XYZ
利用第三行消去 s s s(实际上就是 P ′ P' P Z ′ Z' Z),得
u = f x X ′ Z ′ + c x v = f y Y ′ Z ′ + c y u=f_{x}\dfrac{X'}{Z'}+c_{x} \\ v=f_{y}\dfrac{Y'}{Z'}+c_{y} u=fxZX+cxv=fyZY+cy
在定义了中间变量后,我们对 T T T左乘扰动量 δ ξ \delta \xi δξ,然后考虑 e e e的变化关于扰动量的导数。利用链式法则,可以列写如下:
∂ e ∂ δ ξ = lim ⁡ δ ξ → 0 e ( δ ξ ⊕ ξ ) − e ( ξ ) δ ξ = ∂ e ∂ P ′ ∂ P ′ ∂ δ ξ \dfrac{\partial e}{\partial \delta \xi }=\lim _{\delta \xi \rightarrow 0}\dfrac{e\left( \delta \xi \oplus \xi \right) -e\left( \xi \right) }{\delta \xi }=\dfrac{\partial e}{\partial P'}\dfrac{\partial P'}{\partial \delta \xi } δξe=δξ0limδξe(δξξ)e(ξ)=PeδξP
这里的 ⊕ \oplus 指李代数上的左乘扰动。第一项是误差关于投影点的导数, 已列出了变量之的关 ,易得:
∂ e ∂ P ′ = ∂ [ u − u ˉ , v − v ˉ ] T ∂ P ′ = [ ∂ u ∂ X ′ ∂ u ∂ Y ′ ∂ u ∂ Z ′ ∂ v ∂ X ′ ∂ v ∂ Y ′ ∂ v ∂ Z ′ ] = [ f x Z ′ 0 − f x X ′ Z ′ 2 0 f y Z ′ − f y Y ′ Z ′ 2 ] \dfrac{\partial e}{\partial P'}=\dfrac{\partial \left[ u-\bar{u},v-\bar{v}\right] ^{T}}{\partial P'} =\begin{bmatrix} \dfrac{\partial u}{\partial X'} & \dfrac{\partial u}{\partial Y'} & \dfrac{\partial u}{\partial Z'} \\ \dfrac{\partial v}{\partial X'} & \dfrac{\partial v}{\partial Y'} & \dfrac{\partial v}{\partial Z'} \end{bmatrix} =\begin{bmatrix} \dfrac{f_{x}}{Z'} & 0 & -\dfrac{f_{x} X'}{Z'^{2}} \\ 0 & \dfrac{f_{y}}{Z'} & -\dfrac{f_{y}Y'}{Z'^{2}} \end{bmatrix} Pe=P[uuˉ,vvˉ]T=XuXvYuYvZuZv=Zfx00ZfyZ2fxXZ2fyY
而第二项为变换后的点关于李代数的导数 ,得:
∂ P ′ ∂ δ ξ = ∂ ( T P ) 1 : 3 ∂ δ ξ = ( T P ) 1 : 3 ⊙ = [ I − P ′ ∧ 0 T 0 T ] 1 : 3 = [ I − P ′ ∧ ] \dfrac{\partial P'}{\partial \delta \xi }=\dfrac{\partial \left( TP\right)_{1:3} }{\partial \delta \xi }=\left( TP\right) ^{\odot}_{1:3}=\begin{bmatrix} I & -P'^{\wedge} \\ 0^{T} & 0^{T} \end{bmatrix}_{1:3}=\begin{bmatrix} I & -P'^{\wedge} \end{bmatrix} δξP=δξ(TP)1:3=(TP)1:3=[I0TP0T]1:3=[IP]
这两项相乘,得 2 × 6 2\times 6 2×6的雅可比矩阵:
∂ e ∂ δ ξ = [ f x Z ′ 0 − f x X ′ Z ′ 2 − f x X ′ Y ′ Z ′ 2 f x + f x X ′ 2 Z ′ 2 − f x Y ′ Z ′ 0 f y Z ′ − f x Y ′ Z ′ 2 − f y − f y Y ′ 2 Z ′ 2 f x X ′ Y ′ Z ′ 2 f y X ′ Z ′ ] \dfrac{\partial e}{\partial \delta \xi }=\begin{bmatrix} \dfrac{f_{x}}{Z'} & 0 & -\dfrac{f_{x}X'}{Z'^2} & -\dfrac{f_{x}X'Y'}{Z'^2} & f_{x}+\dfrac{f_{x }X'^{2}}{Z'^{2}} & -\dfrac{f_x Y'}{Z'} \\ 0 & \dfrac{f_{y}}{Z'} & -\dfrac{f_x Y'}{Z'^2} & -f_{y}-\dfrac{f_{y}Y'^{2}}{Z'^2} & \dfrac{f_{x}X'Y'}{Z'^{2}} & \dfrac{f_{y}X'}{Z'} \end{bmatrix} δξe=Zfx00ZfyZ2fxXZ2fxYZ2fxXYfyZ2fyY2fx+Z2fxX2Z2fxXYZfxYZfyX
这个雅可比矩阵描述了重投影误差关于相机位姿李代数的一阶变化关系 。
除了优化位姿
∂ e ∂ P = ∂ e ∂ P ′ ∂ P ′ ∂ P ∂ e ∂ P = [ f x Z ′ 0 − f x X ′ Z ′ 2 0 f y Z ′ − f y Y ′ Z ′ 2 ] R \dfrac{\partial e}{\partial P}=\dfrac{\partial e}{\partial P'}\dfrac{\partial P'}{\partial P} \\ \dfrac{\partial e}{\partial P}=\begin{bmatrix} \dfrac{f_{x}}{Z'} & 0 & -\dfrac{f_x X'}{Z'^2} \\ 0 & \dfrac{f_y}{Z'} & -\dfrac{f_yY'}{Z'^2} \end{bmatrix}R Pe=PePPPe=Zfx00ZfyZ2fxXZ2fyYR

P ′ = ( T P ) 1 : 3 = R P + t P'=\left( TP\right) _{1:3}=RP+t P=(TP)1:3=RP+t

此 , 果se(3)的 义方式是旋转前,平移 后,只要 这个矩阵的前3列与后3列 调即可。
另一方面,除了优化位 ,我 还希望优化 征 的空 位 。
此,需要讨论e 关于空 P 的导 。所幸这个导 矩阵相 来说 易一些。仍 用 式 则,有:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/25488.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据挖掘】数据预处理

Outline ChapterOverview1.为什么要对数据预处理2.数据描述性总结3.数据清洗4.数据变换5.数据整合6.数据归约7.离散化与概念层级8.总结Chapter 1. 为什么要预处理 我们从现实生活中获得的原始数据,或多或少会因为各种原因不能直接使用。例如: 不完整 …

K8S Pod Sidecar 应用场景之一-加入 NGINX Sidecar 做反代和 web 服务器

Kubernetes Pod Sidecar 简介 Sidecar 是一个独立的容器,与 Kubernetes pod 中的应用容器一起运行,是一种辅助性的应用。 Sidecar 的常见辅助性功能有这么几种: 服务网格 (service mesh) 代理监控 Exporter(如 redis exporter)C…

【附源码】计算机毕业设计JAVA学校食堂订餐管理

【附源码】计算机毕业设计JAVA学校食堂订餐管理 目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: JAVA my…

Java#20(包和final)

目录 一.包 1.包的作用? 2.包名书写的规则? 3.什么是全类名? 4.什么时候需要导包? 什么时候不需要导包? 二.final 三.常量 实际开发中,常量一般作为系统的配置信息,方便维护,提高可读性 四.权限修饰符 五.静态代码块 一.包 1…

简述使用vue使用webpack脚手架创建项目并升级至webpack4

第一步、输入命令 vue init webpack demo2 (demo2表示项目名称),回车后等待项目完成创建; 第二步、打开package.json,升级以下依赖(建议升级一项依赖后运行一下项目) webpack系列webpack 3.6.…

Vue实现下载及文件重命名

效果如下&#xff1a; 实现步骤&#xff1a; html&#xff1a; <el-table-column prop"name" label"操作" align"center" header-align"center" width"165"><template slot-scope"scope"><el-but…

MindSpore和Python中nn.Unfold的区别

在往MindSpore迁移项目中遇到了这个转换&#xff0c;以至于不得不去仔细研究一下。 Unfold是卷积操作中的一部分&#xff0c;我们来看一下描述。 Unfold()函数是从一个batch图片中&#xff0c;提取出滑动的局部区域块&#xff0c;也就是卷积操作中的提取kernel filter对应的滑…

图片如何加水印?教你几招轻松加

相信很多喜欢出门游玩的小伙伴&#xff0c;会习惯将旅途中遇到的风景、趣事将其拍照记录下来&#xff0c;然后将图片分享到社交账号上去&#xff0c;但是互联网上什么人都有&#xff0c;总会有不怀好意的人&#xff0c;会在网上拿别人辛苦拍摄的照片&#xff0c;据为己有去发布…

开放式运动耳机哪款好,盘点几款目前最好的开放式耳机分享

如果是在户外运动的时候喜欢戴耳机&#xff0c;那么必然是要选择骨传导耳机&#xff0c;开放式耳道的设计在跑步的过程中&#xff0c;可以很快察觉到来往行人车辆&#xff0c;在安全方面能够极大缩小隐患的发声&#xff0c;无需入耳的佩戴设计能够以最大程度的释放我们的耳道长…

[翻译] 使用FXGL创建一个简单游戏 Pong (FXGL 11)

在本文中&#xff0c;我们将复刻经典的Pong游戏。要完成本教程&#xff0c;你首先需要获取FXGL要么通过Maven / Gradle&#xff0c;要么作为uber-jar。确保你使用FXGL 11 (例如11.3)。 本教程大部分是独立的&#xff0c;但是完成以前的基本教程将对一般理解非常有帮助。完整的…

刷题日记【第十三篇】-笔试必刷题【数根+星际密码+跳台阶扩展问题+快到碗里来】

刷题日记【第十三篇】-笔试必刷题【数根星际密码跳台阶扩展问题快到碗里来】 1.方法区在JVM中也是一个非常重要的区域&#xff0c;它与堆一样&#xff0c;是被【线程共享】的区域。 下面有关JVM内存&#xff0c;说法错误的是&#xff1f;(c) A.程序计数器是一个比较小的内存区…

GO语言之Goroutine和channel

1&#xff0c;goroutine-看一个需求 需求&#xff1a;要求统计1-90000000000的数字中&#xff0c;哪些是素数哦&#xff1f; 分析思路&#xff1a; 1&#xff09;传统的方法&#xff0c;就是使用一个循环&#xff0c;循环的判断各个数是不是素数。 2&#xff09;使用并发或…

Metabase学习教程:提问-5

多级聚合 如何使用查询生成器对多个部分提出问题。 许多分析问题只需四个步骤即可回答&#xff1a; 连接需要的表得到需要的信息。过滤数据使其仅包含期望的记录。分组和聚合这些数据&#xff0c;创造你所需要的价值。可视化结果&#xff0c;方便直观的理解数据告诉了你什么…

SpringBoot 集成JWT实现登录认证

如果文章对你有帮助欢迎【关注❤️❤️❤️点赞&#x1f44d;&#x1f44d;&#x1f44d;收藏⭐⭐⭐】一键三连&#xff01;一起努力&#xff01; 一、JWT简介 JSON Web Token&#xff08;JWT&#xff09;是一个非常轻巧的规范。这个规范允许我们使用JWT在用户和服务器之间传递…

基于粒子群优化算法的最佳方式设置无线传感器节点的位置,以减轻由于任何能量耗尽节点而产生的覆盖空洞(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

数据脱敏的安全管理

什么是数据脱敏 我们需要先说下什么是敏感数据&#xff0c; 敏感数据泛指个人信息&#xff08;姓名、电话、住址、健康信息、证件等数据&#xff09;、涉及需要保护的数据。 数据脱敏&#xff0c;是将敏感数据按照一定的规则对敏感数据进行变形&#xff0c;达到保护用户信息安…

提升80%上云集成效率, TA是如何做到的

摘要&#xff1a;基于华为云开天aPaaS&#xff0c;提升80%上云集成效率&#xff0c;降低50%集成成本没有充足资金&#xff0c;没有足够的项目规划和过渡时间&#xff0c;也没有经验丰富的IT团队支持&#xff0c;中小企业的上云路可谓是困难重重。如何帮助企业高效上云、实现降本…

【Globalmapper中文入门到精通系列实验图文教程】(附配套实验数据持续更新)

【Globalmapper中文版入门到精通系列实验图文教程】&#xff08;附配套实验数据持续更新&#xff09; 文章目录一、专栏简介二、文章目录三、数据目录四、传送门一、专栏简介 本专栏为GlobalMapper中文入门实战精品教程&#xff0c;内容主要涉及&#xff1a;Globalmapper23软件…

【Oracle】数据库账号频繁被锁问题解决

文中使用的Oracle版本为11g。 今天在测试环境中遇到了一个问题&#xff0c;如下图&#xff1a; 所有的数据库客户端访问Oracle11g都出现了上面的提示“ORA-28000: the account is locked”&#xff0c;一开始其实并不知道是什么原因引起的问题&#xff0c;到后面才发现是登录错…

Kotlin 开发Android app(九):Android两大布局LinearLayout和RelativeLayout

Kotlin 的基本特性就先写到这里&#xff0c;我们这个系列的定位是基础&#xff0c;也就是能用就好&#xff0c;够用就好&#xff0c;我们不会举太多的例子&#xff0c;但是这些都是最经常用到的特性。 从这节开始就是Kotlin和android 进行结合&#xff0c;使用Kotlin进行安卓应…