[原创]深入EPnP算法
本文是Jesse Chen的原创文章。
PnP问题是研究如何从3D-2D匹配对中求解摄像头位姿, EPnP算法是一种非迭代的PnP算法。本文作者用baidu搜索了“EPnP算法”时,能找到的中文介绍不多,而且这些网文并没有深入研究这个算法,找出这个算法的精妙点。因此贴出这篇文章,希望能给大家带来我对EPnP算法的理解。有问题的同学,可以联系[email protected]讨论。
PnP问题的定义
Perspective-n-Point问题(PnP)的已知条件:
- n个世界坐标系中的3D参考点(3D reference points)坐标;
- 与这n个3D点对应的、投影在图像上的2D参考点(2D reference points)坐标;
- 摄像头的内参K;
求解PnP问题可以得到摄像头的位姿。
大多数非迭代的PnP算法会首先求解特征点的深度,以获得特征点在相机坐标系中的3D坐标,而EPnP算法将世界坐标系中的3D坐标表示为一组虚拟的控制点的加权和。对于一般情形,EPnP算法要求控制点的数目为4,且这4个控制点不能共面。因为摄像头的外参未知,这四个控制点在摄像头参考坐标系下的坐标是未知的。而如果能求解出这四个控制点在摄像头参考坐标系下的坐标,我们就可以计算出摄像头的位姿。
Control Points & Barycentric Coordinates
在EPnP论文和本文中,分别用上标w和c表示在世界坐标系和摄像头坐标系中的坐标。那么,3D参考点在世界坐标系中的坐标为piw, i=1,⋯,n,在摄像头参考坐标系中的坐标为pic, i=1,⋯,n。4个控制点在世界坐标系中的坐标为cjw, j=1,⋯,4,在摄像头参考坐标系中的坐标为cjc, j=1,⋯,4。需要指出,在EPnP论文和本文中,piw, cjw, pic和cjc均非齐次坐标。
EPnP算法将参考点的坐标表示为控制点坐标的加权和:
piw=j=1∑4αijcjw, with j=1∑4αij=1
其中αij是齐次barycentric坐标。一旦虚拟控制点确定后,且满足4个控制点不共面的前提,αi,j,j=1,⋯,4是唯一确定的。在摄像头坐标系中,存在同样的加权和关系:
pic=j=1∑4αijcjc
Jesse’s Comment: 假设摄像头的外参为[Rt],那么虚拟控制点cjw和cjc之间存在关系:
cjc=[Rt][cjw1]
考虑到EPnP算法将参考点坐标表示为控制点坐标的加权和,可以得到:
pic=[Rt][piw1]=[Rt][∑j=14αijcjw1]
进一步,
pic=[Rt][∑j=14αijcjw∑j=14αij]=j=1∑4αij[Rt][cjw1]=j=1∑4αijcjc
在上述推导过程中,用到了EPnP对权重αij的重要约束条件∑j=14αij=1。如果没有这个约束条件,上述推导将不成立,我们也无法得出pic=∑j=14αijcjc。那么问题来了:在一般的情形下,为什么需要4个控制点?要知道piw是非齐次的3D坐标,piw∈R3,为什么3个控制点就不可以呢?
假设3个控制点满足要求,那么
piw=⎣⎡xiwyiwziw⎦⎤=[c1wc2wc3w]⎣⎡αi1αi2αi3⎦⎤
且∑i=13αij=1,一共是4个方程,而未知数是3个,这是一个超定方程组,只存在最小二乘意义上的解。换句话,在一般情形下,不存在精确满足4个方程的解。按照同样的思路,把4个控制点时的约束“堆砌”在一起:
[piw1]=C⎣⎢⎢⎡αi1αi2αi3αi4⎦⎥⎥⎤=[c1w1c2w1c3w1c4w1]⎣⎢⎢⎡αi1αi2αi3αi4⎦⎥⎥⎤
显然,[piwT1]T和[cjwT1]T都是齐次坐标,而论文中的
piw=j=1∑4αijcjw, with j=1∑4αij=1
本质上就是:3D参考点的齐次坐标是控制点齐次坐标的线性组合。论文中也有一句话:where the αij are homogenous barycentric coordinates。从上述分析过程中,我们也可以得到barycentric coodinates的计算方法:
⎣⎢⎢⎡αi1αi2αi3αi4⎦⎥⎥⎤=C−1[piw1]
control points的选择
原则上,只要控制点满足C可逆就可以,但是论文中给出了一个具体的控制点确定方法。3D参考点集为{piw,i=1,⋯,n},选择3D参考点的重心为第一个控制点:
c1w=n1i=1∑npiw
进而得到矩阵:
A=⎣⎡p1wT−c1wT⋯pnwT−c1wT⎦⎤
记ATA的特征值为λc,i,i=1,2,3,对应的特征向量为vc,i,i=1,2,3,那么剩余的三个控制点可以按照下面的公式来确定:
cjw=c1w+λc,j−121vc,j−1, j=2,3,4


以上两图都是EPnP算法控制点的选择实例,蓝色的是3D reference points,红色的是4个控制点,参考坐标系为世界坐标系。
求解控制点在摄像机坐标下的坐标
设K是摄像头的内参矩阵,可以通过标定获得。{ui}i=1,⋯,n是参考点{pi}i=1,⋯,n是的2D投影,那么
∀i, wi[ui1]=Kpic=Kj=1∑4αijcjc
用cjc=[xjc,yjc,zjc]T(回顾:前文已经提到了cjc这些坐标是非齐次坐标)代入上式,而且把K写成焦距fu,fv和光心(uc,vc)的形式:
∀i, wi⎣⎡uivi1⎦⎤=⎣⎡fu000fv0ucvc1⎦⎤j=1∑4αij⎣⎡xjcyjczjc⎦⎤
从上式可以得到两个线性方程:
j=1∑4αijfuxjc+αij(uc−ui)zjc=0j=1∑4αijfvyjc+αij(vc−vj)zjc=0
把所有n个点串联起来,我们可以得到一个线性方程组:
Mx=0
其中x=[c1cT, c2cT, c3cT, c4cT]T,x就是控制点在摄像头坐标系下的坐标,显然这是一个12×1的向量,且x在M的右零空间中,或者x∈ker(M):
x=i=1∑Nβivi
上式中,vi是M的N个零特征值对应的N特征向量。对于第i个控制点:
cic=k=1∑Nβkvk[i]
上式中,vk[i]是特征向量vk的第i个3×1 sub-vector。
我们可以计算MTM的特征向量得到vi,但还需要求出{βi}i=1,⋯,N。
根据仿真发现MTM为0的特征值的个数和摄像头的焦距有关(注意:是和焦距有关,而不是和参考点的位置有关!),EPnP算法建议只考虑N=1,2,3,4的情况。摄像头的外参描述的只是坐标变换,不会改变控制点之间的距离,∥∥cic−cjc∥∥2=∥∥ciw−cjw∥∥2,
∥∥∥∥∥k=1∑Nβkvk[i]−k=1∑Nβkvk[j]∥∥∥∥∥2=∥∥ciw−cjw∥∥2
这是一个关于{βk}k=1,⋯,N的二次方程,这个方程的特点是没有关于{βk}k=1,⋯,N的一次项。如果将这些二次项βiβj变量替换为βij,那么该方程是{βij}i,j=1,⋯,N的线性方程了。对于4个控制点,可以得到C42=6个这样的方程。
如果不挖掘任何附加条件,N取不同值的时候,新的线性未知数的个数分别为:
-
N=1, 线性未知数的个数为1;
-
N=2,线性未知数的个数为3;
-
N=3,线性未知数的个数为6;
-
N=4,线性未知数的个数为10;
N=4的时候,未知数的个数多于方程的个数了。注意到βabβcd=βaβbβcβd=βa′b′βc′d′,其中{a′,b′,c′,d′}是{a,b,c,d}的一个排列,我们可以减少未知数的个数。举例,如果我们求出了β11,β12,β13,那么我们可以得到β23=β11β12β13。这样,即使对于N=4,我们也可以求解出{βij}i,j=1,⋯,N了。
Jesse’s Comment: 减少变量的方法不难,但是很有趣!
高斯-牛顿最优化
优化的目标函数为:
Error(β)=(i,j) s.t. i<j∑(∥∥cic−cjc∥∥2−∥∥ciw−cjw∥∥2)2
这是一个无约束的非线性最优化问题,简单。
计算摄像头的位姿
本文中摄像头的位姿和外参并不加以区分。EPnP算法中的摄像头的位姿计算方法如下:
-
计算控制点在摄像头参考坐标下的坐标:
cic=j=1∑Nβkvk[i], i=1,⋯,4
-
计算3D参考点在摄像头参考坐标系下的坐标:
pic=j=1∑4αijcjc, i=1,⋯,n
-
计算{piw}i=1,⋯,n的重心p0w和矩阵A:
p0w=n1i=1∑npiwA=⎣⎡p1wT−p0wT⋯pnwT−p0wT⎦⎤
-
计算{pic}i=1,⋯,n的重心p0c和矩阵B:
p0c=n1i=1∑npicB=⎣⎡p1cT−p0cT⋯pncT−p0cT⎦⎤
-
计算H:
H=BTA
-
计算H的SVD分解:
H=UΣVT
-
计算位姿中的旋转R:
R=UVT
如果∣R∣<0,那么R(2,:)=−R(2,:)。
-
计算位姿中的平移t:
t=p0c−Rp0w
Jesse’s Comment: baidu能搜到的另一篇关于EPnP算法的博客在计算R的那步有错误。
本文中的所有内容已由博文作者编程确认过正确性。