ORB-SLAM的重定位中使用的EPnP算法解析

EPnP: An Accurate O(n) Solution to the PnPProblem详解

EPnP

EPnP算法的中心思想就是以四个世界坐标系下的控制点 [ c w 1 c w 2 c w 3 c w 4 ] [c_w^1 \quad c_w^2 \quad c_w^3 \quad c_w^4] [cw1cw2cw3cw4]通过投影约束和欧式变换下的距离不变约束,求解相机坐标系下的相应控制点 [ c c 1 c c 2 c c 3 c c 4 ] [c_c^1 \quad c_c^2 \quad c_c^3 \quad c_c^4] [cc1cc2cc3cc4],最后使用高斯牛顿优化法,对欧式变换的距离约束进行优化,优化参数为重新线性化技术的权重参数。

1. 算法亮点

  • 算法是封闭式非迭代算法,算法的时间复杂度只有 O ( n ) O(n) O(n)
  • 在封闭式非迭代算法中,该算法求解PnP问题的准确率最高
  • 当加入高斯牛顿优化器,进行重新线性化权重参数优化时,其准确率接近迭代算法中准确率最高的方法==《Fast and globally convergent pose estimation from video images》==
  • 除此之外,EPnP的结果可以作为迭代算法的迭代初始值

2. 算法前置知识

2.1 奇异值和奇异向量
  • 奇异值分解(SVD),可以将矩阵 A A A ( m × n ) (m\times n) (m×n)分解为 A = U Σ V T A=U\Sigma V^{T} A=UΣVT
  • 左奇异向量为矩阵 U U U的列
  • 右奇异向量为矩阵 V V V的列
2.2 奇异向量和特征向量
  • 右奇异向量是 A T A A^{T}A ATA的特征向量
  • 左奇异向量是 A A T AA^T AAT的特征向量
2.3 重新线性化技术

重新线性化技术是一种密码公钥HFE分析技术,通过引入其他约束,可以解决欠定方程的根求解问题。

  • 针对欠定方程 M x = 0 Mx=0 Mx=0
    • 方程的解x可以表示为 x = ∑ i = 1 N β i v i x=\sum_{i=1}^N\beta_iv_i x=i=1Nβivi,其中 v i v_i vi是矩阵M的0奇异值对应的右奇异向量 β i \beta_i βi是待定系数
    • 可以通过矩阵 M T M M^TM MTM的零特征值对应的零特征向量给出矩阵 M M M的零奇异值对应的右奇异向量
    • 引入其他约束后,可以对欠定方程的根进行求解

3. 算法流程

3.1 世界坐标系控制点选取
  • 将输入的世界坐标系下的3D点的质心作为其中一个 c w c_w cw(世界坐标系控制点)
  • 采用与数据主方向对齐的方式选择其余点(这是一种和DLT算法相似的标准化方式)
3.2 根据控制点确定重心坐标
  • p i w = ∑ j = 1 4 α i j c j w ∑ j = 1 4 α i j = 1 ⟶ [ x 1 x 2 x 3 x 4 y 1 y 2 y 3 y 4 z 1 z 2 z 3 z 4 1 1 1 1 ] [ α 1 α 2 α 3 α 4 ] = [ X w Y w Z w 1 ] p_i^{w}=\sum_{j=1}^4 \alpha_{ij}c_j^w \quad \sum_{j=1}^4 \alpha_{ij}=1 \longrightarrow \begin{bmatrix} x_1 & x_2 & x_3 & x_4 \\ y_1 & y_2 & y_3 & y_4 \\ z_1 & z_2 & z_3 & z_4 \\ 1 & 1 & 1 & 1\end{bmatrix} \begin{bmatrix} \alpha_1 \\ \alpha_2 \\ \alpha_3 \\ \alpha_4 \end{bmatrix}=\begin{bmatrix} X_w \\ Y_w \\ Z_w \\ 1 \end{bmatrix} piw=j=14αijcjwj=14αij=1 x1y1z11x2y2z21x3y3z31x4y4z41 α1α2α3α4 = XwYwZw1 ,可求解 α i \alpha_i αi
  • p i c = ∑ j = 1 4 α i j c j c p_i^c=\sum_{j=1}^4\alpha_{ij}c_j^c pic=j=14αijcjc(相机坐标系下的三维点表示)
3.3 相机坐标的投影约束
  • w i [ u i v i 1 ] = [ f u 0 u c 0 f v v c 0 0 1 ] ∑ j = 1 4 α i j [ x j c y j c z j c ] ⟶ { ∑ j = 1 4 α i j f u x j c + α i j ( u c − u i ) z j c = 0 ∑ j = 1 4 α i j f v y j c + α i j ( v c − v i ) z j c = 0 w_i \begin{bmatrix} u_i\\v_i\\1 \end{bmatrix}=\begin{bmatrix} f_u & 0 & u_c \\ 0 & f_v & v_c \\ 0 & 0 & 1 \end{bmatrix}\sum_{j=1}^4\alpha_{ij}\begin{bmatrix} x_j^c \\ y_j^c \\ z_j^c \end{bmatrix} \longrightarrow \left \{ \begin{array}{lcl} \sum_{j=1}^4 \alpha_{ij}f_ux_j^c+\alpha_{ij}(u_c-u_i)z_j^c=0 \\ \sum_{j=1}^4\alpha_{ij}f_vy_j^c+\alpha_{ij}(v_c-v_i)z_j^c=0 \end{array}\right. wi uivi1 = fu000fv0ucvc1 j=14αij xjcyjczjc {j=14αijfuxjc+αij(ucui)zjc=0j=14αijfvyjc+αij(vcvi)zjc=0
  • 选取 N N N个点,可得线性系统 M x = 0 Mx=0 Mx=0,其中 M M M矩阵为 2 n × 12 2n\times 12 2n×12维, x = [ c 1 T , c 2 T , c 3 T , c 4 T ] T x=[c_1^T,c_2^T,c_3^T,c_4^T]^T x=[c1T,c2T,c3T,c4T]T
3.4 求解方程 M x = 0 Mx=0 Mx=0

实验数据

  • 根据重新线性化技术,可得解为 x = ∑ i = 1 N β i v i x=\sum_{i=1}^N \beta_iv_i x=i=1Nβivi
  • 根据相机焦距和矩阵 M M M奇异值的实验发现,随着相机焦距的增加, N N N也随之增加,总体来讲在1到4之间
  • EPnP会对N取 { 1 , 2 , 3 , 4 } \left \{1, 2, 3, 4\right \} {1,2,3,4},计算四个结果,然后根据重投影误差,选出最少的那个作为解
3.5 分类讨论(引入刚性变换下的向量二范数的距离约束,来求解 β i \beta_i βi
3.5.1 对于非平面的情况,四个控制点
  • N = 1 N=1 N=1时, x = β v x=\beta v x=βv
    • ∣ ∣ x [ i ] − x [ j ] ∣ ∣ 2 = ∣ ∣ c i w − c j w ∣ ∣ 2 ⟶ ∣ ∣ β v [ i ] − β v [ j ] ∣ ∣ 2 = ∣ ∣ c i w − c j w ∣ ∣ 2 ||{x^{[i]}-x^{[j]}}||^2=||{c_i^w-c_j^w}||^2 \longrightarrow ||{\beta v^{[i]}-\beta {v^{[j]}}||^2=||{c_i^w-c_j^w}||^2} ∣∣x[i]x[j]2=∣∣ciwcjw2∣∣βv[i]βv[j]2=∣∣ciwcjw2
    • 由于在世界坐标下给出了相应的点的真实位置,因此 β = ∑ i j ∈ [ 1 , 4 ] ∣ ∣ β v [ i ] − β v [ j ] ∣ ∣ 2 ∑ i j ∈ [ 1 , 4 ] ∣ ∣ v i − v j ∣ ∣ 2 \beta=\frac{\sum_{ij\in[1,4]}||\beta v^{[i]}-\beta v^{[j]}||^2}{\sum_{ij\in[1,4]}||v^i-v^j||^2} β=ij[1,4]∣∣vivj2ij[1,4]∣∣βv[i]βv[j]2
  • N = 2 N=2 N=2时, x = β 1 v 1 + β 2 v 2 x=\beta_1v_1+\beta_2v_2 x=β1v1+β2v2
    • ∣ ∣ ( β 1 v 1 [ i ] + β 2 v 2 [ i ] ) − ( β 1 v 1 [ j ] + β 2 v 2 [ j ] ) ∣ ∣ 2 = ∣ ∣ c i w − c j w ∣ ∣ 2 ||(\beta_1 v_1^{[i]}+\beta_2 v_2^{[i]})-(\beta_1 v_1^{[j]}+\beta_2v_2^{[j]})||^2=||c_i^w-c_j^w||^2 ∣∣(β1v1[i]+β2v2[i])(β1v1[j]+β2v2[j])2=∣∣ciwcjw2
    • 通过引入向量 β = [ β 11 β 12 β 22 ] T ⟶ [ β 1 2 β 1 β 2 β 2 2 ] T \beta=\begin{bmatrix} \beta_{11} & \beta_{12} & \beta_{22} \end{bmatrix}^T\longrightarrow \begin{bmatrix} \beta_1^2 & \beta_1\beta_2 & \beta_2^2 \end{bmatrix}^T β=[β11β12β22]T[β12β1β2β22]T,使得方程 L β = ρ L\beta=\rho Lβ=ρ成立
    • 其中, L L L v 1 v_1 v1 v 2 v_2 v2组成的矩阵, ρ \rho ρ是世界坐标系点之间的距离范数
    • 通过 S V D SVD SVD分解,或者 L L L矩阵的伪逆来计算向量 β \beta β
    • β \beta β进行分解,保证计算得到的相机坐标系下的3D点都具有正的深度,来筛选一组最合适的 β 1 β 2 β 3 \beta_1 \quad \beta_2 \quad \beta_3 β1β2β3
    • 最后,为了消除尺度的影响,采用 N = 1 N=1 N=1的方式进行缩放系数的求解 c i c = β ( β 1 v 1 [ i ] + β 2 v 2 [ i ] ) c_i^c=\beta(\beta_1v_1^{[i]}+\beta_2v_2^{[i]}) cic=β(β1v1[i]+β2v2[i])
  • N = 3 N=3 N=3时, x = β 1 v 1 + β 2 v 2 + β 3 v 3 x=\beta_1v_1+\beta_2v_2+\beta_3v_3 x=β1v1+β2v2+β3v3
    • 按照 N = 2 N=2 N=2的方式,进行求解
    • 注意,这里唯一不同的是,矩阵 L L L是方阵,可以使用矩阵的逆而不是伪逆求解向量
  • N = 4 N=4 N=4时, x = β 1 v 1 + β 2 v 2 + β 3 v 3 + β 4 v 4 x=\beta_1v_1+\beta_2v_2+\beta_3v_3+\beta_4v_4 x=β1v1+β2v2+β3v3+β4v4
    • 按照 N = 2 N=2 N=2的方式进行求解
    • 得到的矩阵 L L L的维度是 6 × 10 6\times10 6×10维的,因此不能直接进行求解
    • 通过重新线性化的方式进行求解,求解的方式与确定控制点的方式相同
      • β = ∑ i = 1 N k i v i \beta=\sum_{i=1}^Nk_iv_i β=i=1Nkivi v i v_i vi是矩阵 L L L的0奇异值对应的右奇异向量,可以将 β \beta β采用 k i k_i ki进行表示
      • 根据乘法交换律,添加新的约束 β a b β c d = β a β b β c β d = β a ′ β b ′ β c ′ β d ′ \beta_{ab}\beta_{cd}=\beta_a\beta_b\beta_c\beta_d=\beta_a'\beta_b'\beta_c'\beta_d' βabβcd=βaβbβcβd=βaβbβcβd
3.5.2 对于平面的情况,3个控制点
  • 矩阵 M M M的维度会变成 2 n × 9 2n\times9 2n×9,因为控制点变成了三个,从而向量 x x x变成了9维列向量
  • x = ∑ i = 1 N β i v i x=\sum_{i=1}^N \beta_iv_i x=i=1Nβivi的改变
    • N = 1 N=1 N=1时,与非平面,四个控制点无区别
    • N = 2 N=2 N=2时,矩阵 L L L的维度变为 3 × 3 3\times3 3×3,可以直接通过求逆的方式解出来,与非平面 N = 3 N=3 N=3的情况类似
    • N = 3 N=3 N=3时,矩阵 L L L的维度变为 3 × 6 3\times6 3×6,通过乘法交换律约束,进行重新线性化,与同平面 N = 4 N=4 N=4的情况
    • N = 4 N=4 N=4时,矩阵 L L L的维度变为 3 × 10 3\times10 3×10,通过乘法交换律约束,进行重新线性化,与同平面 N = 4 N=4 N=4的情况
3.6 高斯牛顿优化法
  • 通过对上述的 N N N进行分情况讨论,可以选择一个重投影误差最小的 N N N
  • 然后对应的 β = [ β 1 β 2 … β N ] T \beta=\begin{bmatrix} \beta_1&\beta_2 & … & \beta_N \end{bmatrix}^T β=[β1β2βN]T进行高斯牛顿优化,当 N = 4 N=4 N=4时,高斯牛顿优化具有最高的时间复杂度,优化函数为 E r r o r ( β ) = ∑ ( i , j ) s . t . i < j ( ∣ ∣ c i c − c j c ∣ ∣ 2 − ∣ ∣ c i w − c j w ∣ ∣ 2 ) Error(\beta)=\sum_{(i,j)s.t.i<j}(||c_i^c-c_j^c||^2-||c_i^w-c_j^w||^2) Error(β)=(i,j)s.t.i<j(∣∣ciccjc2∣∣ciwcjw2),其中 c i c = ∑ j = 1 N β j v j [ i ] c_i^c=\sum_{j=1}^N\beta_jv_j^{[i]} cic=j=1Nβjvj[i],由于需要优化的参数最多为4,并且优化的方程复杂度为6,因此优化时间可以认为是固定时间,且很短
3.7 ICP方法恢复运动 R t R \quad t Rt
  • { R c w c 1 w + t c w = c 1 c R c w c 2 w + t c w = c 2 c R c w c 3 w + t c w = c 3 c R c w c 4 w + t c w = c 4 c \left\{ \begin{array}{lcl} R_{cw}c_1^w+t_{cw}=c_1^c \\ R_{cw}c_2^w+t_{cw}=c_2^c \\ R_{cw}c_3^w+t_{cw}=c_3^c \\ R_{cw}c_4^w+t_{cw}=c_4^c \end{array} \right. Rcwc1w+tcw=c1cRcwc2w+tcw=c2cRcwc3w+tcw=c3cRcwc4w+tcw=c4c
  • 根据罗德里格斯公式,将公式中的旋转矩阵使用旋转向量来表示 R = cos ⁡ θ I + ( 1 − cos ⁡ θ ) n n T + sin ⁡ θ ( n × ) R=\cos \theta I+(1-\cos \theta)nn^T+\sin\theta (n\times) R=cosθI+(1cosθ)nnT+sinθ(n×),方程的自由度变成6
  • 使用DLT直接线性变换将上述方程变成 A x = 0 Ax=0 Ax=0的形式,进行SVD分解,求解方程的最小二乘解

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis学习——入门篇⑤

Redis学习——入门篇⑤ 7. SpringBoot集成Redis7.1 配置文件7.2 防火墙7.3 Jedis &#xff08;了解即可&#xff09;1.介绍2.步骤 7.4 Lettuce&#xff08;相当于Jedis&#xff09;1.介绍以及和Jedis的区别2.步骤 7.5 RedisTemplate (推荐)7.5.1 连接单机7.5.2 连接集群1.正常启…

Wpf 使用 Prism 实战开发Day16

客户端使用RestSharp库调用WebApi 动态加载数据 在MyDoTo客户端中&#xff0c;使用NuGet 安装两个库 RestSharp Newtonsoft.Json 一. RestSharp 简单的使用测试例子 当前章节主要目的是&#xff1a;对RestSharp 库&#xff0c;根据项目需求再次进行封装。下面先做个简单的使用…

优雅的python(二)

&#x1f308;个人主页&#xff1a;小田爱学编程 &#x1f525; 系列专栏&#xff1a;c语言从基础到进阶 &#x1f3c6;&#x1f3c6;关注博主&#xff0c;随时获取更多关于c语言的优质内容&#xff01;&#x1f3c6;&#x1f3c6; &#x1f600;欢迎来到小田代码世界~ &#x…

【Go 快速入门】数组 | 切片 | 映射 | 函数 | 结构体 | 方法和接收者

文章目录 数组切片append 函数copy 函数删除元素 映射delete 函数 函数init 特殊的函数defer 语句panic / recover 错误处理 类型结构体内存对齐JSON 序列化与反序列化方法和接收者 项目代码地址&#xff1a;03-ArraySliceMapFuncStruct 数组 基本格式&#xff1a;var 数组变…

C#,最小生成树(MST)普里姆(Prim)算法的源代码

Vojtěch Jarnk 一、Prim算法简史 Prim算法&#xff08;普里姆算法&#xff09;&#xff0c;是1930年捷克数学家算法沃伊捷赫亚尔尼克&#xff08;Vojtěch Jarnk&#xff09;最早设计&#xff1b; 1957年&#xff0c;由美国计算机科学家罗伯特普里姆独立实现&#xff1b; 19…

智慧交通的“大脑”与“神经”:物联网与车联网双轮驱动,智慧交通加速驶入未来

目录 一、物联网&#xff1a;智慧交通的“大脑” 二、车联网&#xff1a;智慧交通的“神经” 三、物联网与车联网的协同发展 四、智慧交通的未来展望 五、物联网与车联网在智慧交通中的应用案例 六、智慧交通面临的挑战与解决方案 七、政策与法规在智慧交通发展中的作用…

35、WEB攻防——通用漏洞XSS跨站反射存储DOM盲打劫持

文章目录 XSS产生于前端的漏洞&#xff0c;常产生于&#xff1a; XSS分类&#xff1a; 反射型&#xff08;非持久型&#xff09; 存储型&#xff08;持久型&#xff09;&#xff0c;攻击代码被写入数据库中。常见于&#xff1a;写日志、留言、评论的地方 DOM型 DOM型XSS与…

【深度学习】【AutoDL】【SSH】通过VSCode和SSH使用AutoDL服务器训练模型

身边没有显卡资源或不足以训练模型时&#xff0c;可以租赁服务器的显卡。 1、注册AutoDL并配置环境 首先打开AutoDL官网&#xff0c;注册账号并租赁自己期望的显卡资源 点击“租赁”之后&#xff0c;我们要继续选择基础环境。此处&#xff0c;我们让其自动配置好基础的pytor…

抖去推短视频矩阵系统+实景无人直播系统技术源头开发

抖去推爆款视频生成器&#xff0c;通过短视频矩阵、无人直播&#xff0c;文案引流等&#xff0c;打造实体商家员工矩阵、用户矩阵、直播矩阵&#xff0c;辅助商家品牌曝光&#xff0c;团购转化等多功能赋能商家拓客引流。 短视频矩阵通俗来讲就是批量剪辑视频和批量发布视频&a…

Kotlin Multiplatform项目推荐 | 太空人分布图

Kotlin Multiplatform项目推荐 | 太空人分布图 项目简介 Kotlin Multiplatform项目是一种跨平台开发技术&#xff0c;它可以同时使用SwiftUI、Jetpack Compose、Compose for Wear OS、Compose for Desktop、Compose for Web、Kotlin/JS React等客户端框架&#xff0c;并且使…

MCU启动文件小解一下

GD32启动文件分析 启动文件的一些指令.s启动文件分析栈空间分配堆空间管理中断向量表定义堆空间定义Reset_Handler复位程序HardFault_Handler_main文件分析用户堆栈初始化 GD32启动文件主要做了以下工作&#xff1a; 初始化SP_initial_sp , PCReset_Handler指针&#xff0c;设置…

Linux下安装openresty

Linux下安装openresty 十一、Linux下安装openresty11.1.概述11.2.下载OpenResty并安装相关依赖&#xff1a;11.3.使用wget下载:11.4.解压缩:11.5.进入OpenResty目录:11.6.编译和安装11.7.进入OpenResty的目录&#xff0c;找到nginx&#xff1a;11.8.在conf目录下的nginx.conf添…

React一学就会(3): 强化练习一

前言 兄弟们点个关注点点赞&#xff0c;有什么建议在评论里留言说一下&#xff0c;一定要和我多多互动啊&#xff0c;这样我才有动力创作出更有品质的文章。 这节课我们用前两节课的知识做一个实践&#xff0c;在实战中巩固我们所学。本来我想借用官方的示例翻译一下&#xf…

Redis3-秒杀活动

秒杀 准备工作 我是参照下面这位大佬的i骄傲成下载的 csdn友情链接 Jmeter模拟多线程的压力测试工具 秒杀代码&#xff1a; package com.aaa.controller;import io.netty.util.internal.StringUtil; import org.apache.commons.lang.StringUtils; import org.springfram…

HarmonyOS鸿蒙ArkTS,封装http网络请求

HarmonyOS鸿蒙ArkTS&#xff0c;封装http网络请求 前提&#xff1a; 要想使用http请求&#xff0c;系统必须要具备ohos.permission.INTERNET权限&#xff0c;在model.json5文件中的module模块下添加如下请求权限&#xff1a; 在module.json5文件中 配置 "requestPermi…

1949-2022年交通运输设备行业数据

1949-2022年交通运输设备行业数据 1、时间1949-2021年 2、指标&#xff1a;民用驳船保有量(艘)_AmoCivBar、民用机动船保有量(艘)_AmoCivMotBoat、民用运输机保有量(架)_AmoPlaTra、民用其他汽车保有量(万辆)_AmoOthAutCiv、私人其他汽车保有量(万辆)_AmoOthAutPri、新注册民…

k8s 进阶实战笔记 | Scheduler 调度策略总结

文章目录 Scheduler 调度策略总结调度原理和过程调度策略nodeSelect亲和性和反亲和性NodeAffinify亲和验证PodAffinity 亲和验证PodAntiAffinity 反亲和验证污点与容忍跳过 Scheduler 调度策略 调度策略场景总结 Scheduler 调度策略总结 调度原理和过程 Scheduler 一直监听着…

Linux使用二进制包安装MySQL

目录 一、软件包下载 二、上传软件包到Linux根目录 1、使用xftp将软件包上传到根目录 2、解压缩 三、准备工作 四、初始化软件 五、设置MySQL的配置文件 六、配置启动脚本 一、软件包下载 官网下载&#xff1a;MySQL :: Download MySQL Community Server 二、上传软件…

【leetcode题解C++】144. 94. 145.二叉树前序、中序、后序遍历 and 102.二叉树的层序遍历

144. 二叉树前序遍历 给出一个根节点&#xff0c;返回前中后序遍历的结果的。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,2,3]示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[]示例 3&#xff1a; 输入&#xff1a;root…

vue项目如何打包,java项目如何打包

目录 vue项目如何打包 java项目如何打jar包 使用Maven打包为JAR&#xff08;方式一&#xff09;视图&#xff1a; 先双击clean再双击package即可打包 使用Maven打包为JAR&#xff08;方式二&#xff09;命令&#xff1a; 1、确保你已经安装了Maven&#xff0c;并且配置了相应…