EPnP算法

相机坐标系用\(F^c\),世界坐标系用\(F^w\)表示,任何一点可以用四个控制点\(p_i^w\)表示
\begin{equation}
p_i^w=\sum_{j=1}^4\alpha_{ij}c_j^w, \quad with \sum_{j=1}^4\alpha_{ij}=1
\end{equation}
对于相机坐标系同样成立
\begin{equation}
p_i^c=\sum_{j=1}^4\alpha_{ij}c_j^c, \quad with \sum_{j=1}^4\alpha_{ij}=1
\end{equation}
对于上面的公式,首先需要说明的是\(\alpha_{ij}\)确实存在。因为\(c_j^w\)或\(c_j^c\)构成的方程组是欠定的,所以一定存在解。
理论上来说,控制点可以随便选择,这里选择控制点为参考点的中心,其他的点在PCA得到的主轴上单位长度处,从而提高算法的稳定性。

控制点在相机坐标系的坐标

根据投影方程得到世界坐标系中参考点坐标和相机坐标系中参考点的约束关系:
\begin{equation}
\forall i, \quad \omega_i
\left[
\begin{array}{c}
\mathbf{u_i} \
1
\end{array}
\right]
=Ap_i^c=A\sum_{j=1}^4\alpha_{ij}c_j^c
\end{equation}
写成矩阵的形式为:
\begin{equation}
\forall i,\quad \omega_i
\left[
\begin{array}{c}
u_i \
v_i \
1
\end{array}
\right]
=\left[
\begin{array}{ccc}
f_u & 0 & u_c\
0 & f_v & v_c\
0 & 0 & 1
\end{array}
\right]
\sum_{j=1}^4\alpha_{ij}
\left[
\begin{array}{c}
x_j^c\
y_j^c\
z_j^c
\end{array}
\right]
\end{equation}
将等式的第三列代入第一二列,得到
\begin{equation}
\sum_{j=1}^4\alpha_{ij}f_ux^c_j+\alpha_{ij}(u_c-u_i)z^c_j=0
\end{equation}
\begin{equation}
\sum_{j=1}^4\alpha_{ij}f_v y^c_j+\alpha_{ij}(v_c-v_i)z^c_j=0
\end{equation}
因此,可以得到下面的线性方程组:
\begin{equation}
\rm{Mx= 0}, \quad with\quad \rm{x=[c_1^{cT},c_2^{cT},c_3^{cT},c_4^{cT}]^T}
\end{equation}
上面的方程中,四个控制点总共12个未知变量,\(\rm{M}\)为\(2n\times 12\)的矩阵。因此,\(\rm{x}\)属于\(\rm{M}\)的右零空间,\(\rm{v_i}\)为矩阵\(\rm{M}\)的右奇异向量,可以通过求解\(\rm{M^TM}\)的零空间特征值得到。
\begin{equation}
\rm{x}=\sum _{i=1}^{N}\beta_i \rm{v}_i
\end{equation}
[说明]使用\(\rm{M^TM}\)比使用\(\rm{M}\)计算量更少,因为\(\rm{M^TM}\)是求解是常数复杂度,而\(\rm{M}\)是\(O(n^3)\)的复杂度,但是计算\(\rm{M^TM}\)的复杂度是\(O(n)\)的。

选择合适的线性组合

上面求解的\(\rm{x}\)中,需要确定\(\beta_i\),也就是确定合适的线性组合。根据参考点的位置不同,矩阵\(\rm{M^TM}\)的零空间维数可能为\(N=1\rightarrow4\)维。求解\(\beta\)的策略是控制点在坐标系\(\mathcal{F}^w\)和\(\mathcal{F}^c\)中,两两之间的距离是相同,而\(\rm{x}\)的\(3k+1-3k\)分量表示分别表示不同的控制点在相机坐标系中的坐标,总共有\(C_4^2=6\)个约束。
如果\(N=1\),则根据约束有
\begin{equation}
\Vert \beta \rm{v}^{[i]}-\beta \rm{v}^{[j]}\Vert^2=\Vert c_i^w - c_j^w\Vert^2
\end{equation}
所以
\[\beta=\frac{\sum_{[i,j]\in [1;4]}\Vert \rm{v}^{[i]} - \rm{v}^{[j]}\Vert\cdot \Vert \rm{c}^w_i - \rm{c}^w_j\Vert}{\sum_{[i,j]\in [1;4]}\Vert \rm{v}^{[i]} - \rm{v}^{[j]}\Vert^2}\]
如果\(N=2\),
\begin{equation}
\Vert \beta_1 \rm{v}^{[i]}_1 + \beta_2 \rm{v}^{[i]}_2-(\beta_1 \rm{v}^{[j]}_1+\beta_2\rm{v}^{[j]}_2)\Vert^2=\Vert c_i^w - c_j^w\Vert^2
\end{equation}
由于\(\beta_1\)和\(\beta_2\)只以二次项出现在方程中,记\(\rm{\beta}=[\beta_1^2,\beta_1\beta_2, \beta_2^2]^T\), \(\rho\)的每一项为\(\Vert c_i^w - c_j^w\Vert^2\),得到相面的方程
\begin{equation}
L\beta = \rho
\end{equation}
其中\(L\)是由\(\rm{v}_1\)和\(\rm{v}_2\)构成的\(6\times 3\)的矩阵。
上面的方程可以通过\(\beta = (L^TL)^{-1}L^T\rho\)得到,然后通过选择合适的符号从\(\beta_1^2,\beta_1\beta_2,\beta_2^2\)使得所有的\(p_i^c\)有正的\(z\)坐标。

如果\(N=3\)则和\(N=2\)差不多,唯一的区别在于使用的是\(L\)的逆,而不是伪逆,此时的\(L\)为\(6\times 6\)的矩阵。

G-N优化

前面的步骤可以得到目标点在相机坐标系中的闭式解,作为G-N优化的初始值,优化的变量为\(\beta=[\beta_1, \cdots,\beta_N]^T\),目标函数为
\begin{equation}
Error(\beta)=\sum_{(i,j) s.t. i<j}(\Vert c_i^c - c_j^c \Vert ^2-\Vert c_i^w - c_j^w\Vert ^2)
\end{equation}
该优化过程和参考点的数目无关,优化步骤和时间是常数。

计算R,t

前面的两步计算不同维数的零空间的误差,选择误差最小维数对应的\(\beta\),从而得到\(\rm{x}\),恢复出控制点在相机坐标系中的坐标并根据质心坐标系数得到参考点在相机坐标系的坐标。剩下的工作就是已知一组点云在两个坐标系中的坐标,求两个坐标系的位姿变换。
步骤如下:
(1)求中心点,\(p_c^c=\frac{\sum{p_c^i}}{N}\),\(p_w^c=\frac{\sum{p_w^i}}{N}\);
(2)去中心,\(q_c^i=p_c^i- p_c^c,q_w^i=p_w^i-p_w^c\);
(3)计算\(H\)矩阵,\(H = \sum_{i=1}^{N}q_c^i q_w^{iT}\)
(4)对\(H\)进行SVD,\(H=U \Lambda V^T\);
(5)计算\(X=VU^T\),如果\(det(x)=1\),则\(R=X\),\(t=P_c^c- RP_w^c\)。否则\(R(2,\cdot)=-R(2,\cdot)\)

EPnP算法的更多相关文章

  1. Gaze Estimation学习笔记(1)-Appearance-Based Gaze Estimation in the Wild

    目录 前言 简介 论文概述 论文主要内容 MPIIGaze数据集 引入CNN的新Gaze Estimation方法 人脸对齐与3D头部姿态判断 归一化 使用CNN进行视线检测 论文作者进行的实验及结果 ...

  2. ORB-SLAM2-tracking线程

    tracking线程 Tracking线程的主要工作是从图像中提取ORB特征,根据上一帧进行姿态估计或者进行通过全局重定位初始化位姿,然后跟踪已经重建的局部地图,优化位姿,再根据一些规则确定新的关键帧 ...

  3. [转]【视觉 SLAM-2】 视觉SLAM- ORB 源码详解 2

    转载地址:https://blog.csdn.net/kyjl888/article/details/72942209 1 ORB-SLAM2源码详解 by 吴博 2 https://github.c ...

  4. ORB-SLAM3论文阅读:ORB-SLAM3: An Accurate Open-Source Library for Visual, Visual-Inertial and Multi-Map SLAM

    简介 ORB-SLAM3是第一个能在单目.双目.RGBD鱼眼相机和针孔相机模型下运行视觉.视觉-惯导以及多地图SLAM的系统.其贡献主要包括两方面:提出了完全依赖于最大后验估计的紧耦合视觉-惯导SLA ...

  5. CGA裁剪算法之线段裁剪算法

    CGA裁剪算法之线段裁剪算法 常用的线段裁剪算法有三种:[1]Cohen_SutherLand裁剪算法,[2]中点分割裁剪算法,[3]参数化方法. 1. Cohen_SutherLand裁剪算法 为了 ...

  6. ORB-SLAM(十一)EPnP

    EPnP在ORB-SLAM中主要用于Tracking线程中的重定位Relocalization模块,需要通过当前关键帧Bow与候选帧匹配上的3D地图点,迅速建立当前相机的初始姿态. PnP问题解决了已 ...

  7. B树——算法导论(25)

    B树 1. 简介 在之前我们学习了红黑树,今天再学习一种树--B树.它与红黑树有许多类似的地方,比如都是平衡搜索树,但它们在功能和结构上却有较大的差别. 从功能上看,B树是为磁盘或其他存储设备设计的, ...

  8. 分布式系列文章——Paxos算法原理与推导

    Paxos算法在分布式领域具有非常重要的地位.但是Paxos算法有两个比较明显的缺点:1.难以理解 2.工程实现更难. 网上有很多讲解Paxos算法的文章,但是质量参差不齐.看了很多关于Paxos的资 ...

  9. 【Machine Learning】KNN算法虹膜图片识别

    K-近邻算法虹膜图片识别实战 作者:白宁超 2017年1月3日18:26:33 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...

随机推荐

  1. luogu 3413 SAC#1 - 萌数

    题目描述 辣鸡蒟蒻SOL是一个傻逼,他居然觉得数很萌! 好在在他眼里,并不是所有数都是萌的.只有满足“存在长度至少为2的回文子串”的数是萌的——也就是说,101是萌的,因为101本身就是一个回文数:1 ...

  2. [POI2006]ORK-Ploughing

    Description Byteasar想耕种他那块矩形的田,他每次能耕种矩形的一边(上下左右都行),在他每次耕完后,剩下的田也一定是矩形,每块小区域边长为1,耕地的长宽分别为m和n,不幸的是Byte ...

  3. ●BZOJ 1444 [Jsoi2009]有趣的游戏

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1444题解.1: 概率dp,矩阵乘法,快速幂. 对所有串建立AC自动机, 那么如果在trie树 ...

  4. C++Primer学习——const

    Const int size = 512; 在编译的时候,编译器会把用到该变量的地方全部替换成对应的值. const&可以绑定字面值,所以当用常量引用绑定一个常量时,是否可以看成那个值在编译阶 ...

  5. 51 nod 1439 互质对(Moblus容斥)

    1439 互质对 题目来源: CodeForces 基准时间限制:2 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 有n个数字,a[1],a[2],…,a[n].有一个集合,刚开 ...

  6. 51Nod 1331 狭窄的通道

    有一个长为L的狭窄通道,我们假设这个通道在x轴上,其两个出口分别在x=0与x=L处.在这个通道里有N只狼,第i只狼有一个初始位置ai,它想到达位置bi(0<=i=L处空间足够大可以装下任意数量的 ...

  7. Python paramik

    本节内容 paramiko模块 1.paramiko模块 Python的paramiko模块,该模块机遇SSH用于连接远程服务器并执行相关操作 Python的paramiko模块,该模块机遇SSH用于 ...

  8. laravel实现支付宝支付功能

    起因 前段时间因为项目中需要实现支付宝手机网站支付功能,所以写下这篇文章以作记录,不足之处,欢迎指教. 后端框架:Laravel 5.5 业务功能 适用于商家在移动端网页应用中集成支付宝支付功能.商家 ...

  9. text-size-adjust: none并没有什么用

    在样式文件中添加text-size-adjust: none,并没有什么用,移动端浏览器自动调整字体大小还是在进行,webkit已取消对其支持,移动端避免浏览器因为横屏.竖屏模式自动缩放字体大小可以加 ...

  10. JVM内存模型及分区

    Java虚拟机在程序执行过程会把jvm的内存分为若干个不同的数据区域来管理,这些区域有自己的用途,以及创建和销毁时间. JVM内存模型如下图所示: jvm管理的内存区域包括以下几个区域:  栈区: 栈 ...