计算机视觉中的位姿估计

  • Post author:
  • Post category:其他




1. 问题描述

位姿估计在计算机视觉领域扮演着十分重要的角色。在使用视觉传感器估计机器人位姿进行控制、机器人导航、增强现实以及其它方面都有着极大的应用。位姿估计这一过程的基础是找到现实世界和图像投影之间的对应点。然后根据这些点对的类型,如2D-2D, 2D-3D, 3D-3D,采取相应的位姿估计方法。我们通常称把根据已知点对估计位姿的过程称为求解PnP。



2. 2D-2D:对极几何

假设我们从两幅图像中,得到了一对配对好的特征点。如下图所示,



p

1

p_{1}







p











1


























p

2

p_{2}







p











2






















是两幅图像中匹配的特征点,



O

1

O_{1}







O











1


























O

2

O_{2}







O











2






















是两个相机中心。

在这里插入图片描述

如果我们有若干对这样的特征点,我们就可以通过这些二维图像点的对应关系,恢复出两帧之间摄像机的运动。以上图为例,我们希望求取两帧图像



I

1

I_{1}







I











1


























I

2

I_{2}







I











2






















之间相机的运动。设第一帧到第二帧的运动为



R

R






R









t

t






t









P

P






P





点在第一帧相机坐标系下的坐标为



P

=

[

X

,

Y

,

Z

]

T

P=[X,Y,Z]^T






P




=








[


X


,




Y


,




Z



]










T
















P

P






P





点在两帧图像的像素坐标系中的坐标为



p

1

p_{1}







p











1


























p

2

p_{2}







p











2






















,则有下式成立





s

1

p

1

=

KP

s

2

p

2

=

K(RP+t)

s_{1}\textbf{p}_{1}=\textbf{KP}\\ s_{2}\textbf{p}_{2}=\textbf{K(RP+t)}







s











1





















p












1





















=









KP










s











2





















p












2





















=









K(RP+t)








若采用齐次坐标,则上式可以写成





p

1

=

KP

p

2

=

K(RP+t)

\textbf{p}_{1}=\textbf{KP}\\ \textbf{p}_{2}=\textbf{K(RP+t)}








p












1





















=









KP











p












2





















=









K(RP+t)












x

1

=

K

1

p

1

x

2

=

K

1

p

2

\textbf{x}_{1}=\textbf{K}^{-1}\textbf{p}_{1}\\ \textbf{x}_{2}=\textbf{K}^{-1}\textbf{p}_{2}








x












1





















=










K















1












p












1



























x












2





















=










K















1












p












2
























此处



x

1

x_{1}







x











1


























x

2

x_{2}







x











2






















是两点在归一化平面上的坐标,代入上式可得





x

2

=

Rx

1

+

t

\textbf{x}_{2}=\textbf{Rx}_{1}+\textbf{t}








x












2





















=










Rx












1





















+









t








两边同时左乘



t

^

\textbf{t}\hat{}







t
















^










,得到





t

^

x

2

=

t

^

Rx

1

\textbf{t}\hat{}\textbf{x}_{2}=\textbf{t}\hat{}\textbf{Rx}_{1}







t
















^









x












2





















=









t
















^









Rx












1
























两边同时左乘



x

2

T

\textbf{x}_{2}^{T}








x












2










T






















,得到





x

2

T

t

^

x

2

=

x

2

T

t

^

R

x

1

x_{2}^{T}t\hat{}x_{2}=x_{2}^{T}t\hat{}Rx_{1}







x











2










T



















t















^








x











2





















=









x











2










T



















t















^







R



x











1
























因为



t

^

x

2

t\hat{}x_{2}






t















^








x











2


























x

2

x_{2}







x











2






















垂直,所以上式左侧为



0

0






0





,因此





x

2

T

t

^

R

x

1

=

0

x_{2}^{T}t \hat{} Rx_{1}=0







x











2










T



















t















^







R



x











1





















=








0











p

1

p_{1}







p











1


























p

2

p_{2}







p











2






















代入,得





p

2

T

K

T

t

^

R

K

1

p

1

=

0

p_{2}^{T}K^{-T}t \hat{} RK^{-1}p_{1}=0







p











2










T




















K














T










t















^







R



K














1











p











1





















=








0







上述两式被称为对极约束,它的几何意义是



O

1

O_{1}







O











1


























O

2

O_{2}







O











2


























P

P






P





、三点共面。对极约束中同时包含了旋转和平移,我们把中间部分基座两个矩阵:基础矩阵



F

F






F





和本质矩阵



E

E






E










E

=

t

^

R

F

=

K

T

E

K

1

E=t\hat{}R\\ F=K^{-T}EK^{-1}






E




=








t















^







R








F




=









K














T










E



K














1















则可以进一步简化对极约束





x

2

T

E

x

1

=

p

2

T

F

p

1

=

0

x_{2}^{T}Ex_{1}=p_{2}^{T}Fp_{1}=0







x











2










T



















E



x











1





















=









p











2










T



















F



p











1





















=








0







于是,相机位姿估计问题变为以下两步:

1.根据配对点的像素位置,求出



E

E






E





或者



F

F






F





2.根据



E

E






E





或者



F

F






F





,求出



R

R






R









T

T






T







3. 三角测量

我们使用对极几何约束估计了相机运动后,需要用相机的运动估计特征点的空间位置。仅通过单张图像无法获得像素的深度信息,我们需要通过三角测量的方法来估计地图点的深度。

在这里插入图片描述

考虑图像



I

1

I_1







I










1

























I

2

I_2







I










2





















,以左图为参考,右图的变换矩阵为



T

T






T





。相机光心为



O

1

O_1







O










1

























O

2

O_2







O










2

























p

1

p_1







p










1

























p

2

p_2







p










2





















为两幅图像中匹配的特征点。理论上直线



O

1

p

1

O_1p_1







O










1



















p










1

























O

2

p

2

O_2p_2







O










2



















p










2





















在场景中会相交于点



P

P






P





,该点即是两个特征点所对应的地图点在三维场景中的位置。然而由于噪声的影响,这两条直线往往无法相交,我们可以通过最二小乘法去求解。

按照对极几何中的定义,设



x

1

x_1







x










1

























x

2

x_2







x










2





















为两个特征点的归一化坐标,那么





s

1

x

1

=

s

2

R

x

2

+

t

s_{1}x_{1}=s_{2}Rx_{2}+t







s











1




















x











1





















=









s











2



















R



x











2





















+








t







上式左乘



x

1

^

x_{1}\hat{}







x











1
































^










,得





s

2

x

1

^

R

x

2

+

x

1

^

t

=

0

s_{2}x_{1}\hat{}Rx_{2}+x_{1}\hat{}t=0







s











2




















x











1
































^







R



x











2





















+









x











1
































^







t




=








0







根据此方程可以求出



s

2

s_2







s










2





















。有了



s

2

s_2







s










2

























s

1

s_1







s










1





















也很容易求出。于是,我们就得到了两个帧下的点的深度,确定了它们的空间坐标。当然,由于噪声的存在,我们估得的



R

R






R









t

t






t





不一定精确,所以更常见的做法是求最小二乘解而不是零解。



4. 3D-2D:PnP

PnP(Perspective-n-Point)是求解 3D 到 2D 点对运动的方法。它描述了当我们知道n 个 3D 空间点以及它们的投影位置时,如何估计相机所在的位姿。



4.1 直接线性变换

考虑某个空间点



P

P






P





,它在世界坐标系下的齐次坐标为



P

=

(

X

,

Y

,

Z

,

1

)

T

\textbf{P}=(X,Y,Z,1)^{T}







P





=








(


X


,




Y


,




Z


,




1



)











T













,在归一化平面上的坐标为



x

=

(

u

,

v

,

1

)

T

\textbf{x}=(u,v,1)^{T}







x





=








(


u


,




v


,




1



)











T













。此时相机的位姿



R

\textbf{R},







R













t

\textbf{t}







t






是未知的。我们定义



T

=

[

R

t

]

\textbf{T}=[\textbf{R}|\textbf{t}]







T





=








[



R







t



]





为一个



3

×

4

3\times4






3




×








4





的矩阵,则





s

(

u

v

1

)

=

(

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

Z

1

)

s\left( \begin{array}{c} u\\ v\\ 1\\ \end{array} \right) =\left( \begin{matrix} 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{matrix} \right) \left( \begin{array}{c} X\\ Y\\ Z\\ 1\\ \end{array} \right)






s






















































u








v








1





























































=

























































t










1

























t










5

























t










9














































t










2

























t










6

























t











1


0















































t










3

























t










7

























t











1


1















































t










4

























t










8

























t











1


2
















































































































































X








Y








Z








1
















































































用最后一行把s消去,得到





u

=

t

1

X

+

t

2

Y

+

t

3

Z

+

t

4

t

5

X

+

t

6

Y

+

t

7

Z

+

t

8

v

=

t

5

X

+

t

6

Y

+

t

7

Z

+

t

8

t

5

X

+

t

6

Y

+

t

7

Z

+

t

8

u=\frac{t_1X+t_2Y+t_3Z+t_4}{t_5X+t_6Y+t_7Z+t_8}\\ v=\frac{t_5X+t_6Y+t_7Z+t_8}{t_5X+t_6Y+t_7Z+t_8}\\






u




=




















t










5


















X




+





t










6


















Y




+





t










7


















Z




+





t










8































t










1


















X




+





t










2


















Y




+





t










3


















Z




+





t










4










































v




=




















t










5


















X




+





t










6


















Y




+





t










7


















Z




+





t










8































t










5


















X




+





t










6


















Y




+





t










7


















Z




+





t










8











































为了简化表示,定义



T

\textbf{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

3

=

(

t

1

,

t

2

,

t

3

,

t

4

)

T

\textbf{t}_\textbf{1}=\left( t_1,t_2,t_3,t_4 \right) ^T\\ \textbf{t}_\textbf{2}=\left( t_1,t_2,t_3,t_4 \right) ^T\\ \textbf{t}_\textbf{3}=\left( t_1,t_2,t_3,t_4 \right) ^T








t












1





















=










(



t










1


















,





t










2


















,





t










3


















,





t










4


















)











T



















t












2





















=










(



t










1


















,





t










2


















,





t










3


















,





t










4


















)











T



















t












3





















=










(



t










1


















,





t










2


















,





t










3


















,





t










4


















)











T




















t

1

T

P

t

3

T

Pu

=

0

t

2

T

P

t

3

T

Pv

=

0

\textbf{t}_1^T\textbf{P}-\textbf{t}_3^T\textbf{Pu}=0\\ \textbf{t}_2^T\textbf{P}-\textbf{t}_3^T\textbf{Pv}=0








t











1








T



















P
















t











3








T



















Pu





=








0










t











2








T



















P
















t











3








T



















Pv





=








0







可以看到每个特征点提供了两个关于



t

\textbf{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

u

N

P

N

T

)

(

t

1

t

2

t

3

)

=

0

\left( \begin{matrix} P_1^T& 0& -u_1P_1^T\\ 0& P_1^T& -v_1P_1^T\\ \vdots& \vdots& \vdots\\ P_N^T& 0& -u_NP_N^T\\ 0& P_N^T& -u_NP_N^T\\ \end{matrix} \right) \left( \begin{array}{c} t_1\\ t_2\\ t_3\\ \end{array} \right) =0




































































































P










1








T
























0






















P










N








T
























0





























0









P










1








T





































0









P










N








T

















































u










1



















P










1








T




























v










1



















P










1








T









































u










N



















P










N








T




























u










N



















P










N








T











































































































































































t










1

























t










2

























t










3













































































=








0







由于 t 一共有 12 维,因此最少通过六对匹配点,即可实现矩阵 T 的线性求解,这种方法称为直接线性变换(Direct Linear Transform,DLT)。当匹配点大于六对时,可以使用 SVD 等方法对超定方程求最小二乘解。

在 DLT 求解中,我们直接将



T

T






T





矩阵看成了12个未知数,忽略了它们之间的联系。因为旋转矩阵为正交矩阵,用 DLT 求出的解不一定满足该约束,它是一个一般矩阵。平移向量比较好办,它属于向量空间。对于旋转矩阵



R

R






R





,我们必须针对 DLT 估计的



T

T






T





的左边3 × 3 的矩阵块,寻找一个最好的旋转矩阵对它进行近似。



4.2 P3P




P

3

P

P3P






P


3


P





是另一种解



P

n

P

PnP






P


n


P





的方法。它仅使用三对匹配点,对数据要求较少。

在这里插入图片描述




P

3

P

P3P






P


3


P





需要利用给定的三个点的几何关系。它的输入数据为三对



3

D

2

D

3D-2D






3


D













2


D





匹配点。记 3D点为



A

A






A









B

B






B









C

C






C





,2D 点为



a

a






a









b

b






b









c

c






c





,其中小写字母代表的点为大写字母在相机成像平面上的投影,如上图所示。此外,



P

3

P

P3P






P


3


P





还需要使用一对验证点,以从可能的解出选出正确的那一个(类似于对极几何情形)。记验证点对为



D

d

D-d






D













d





,相机光心为



O

O






O





根据余弦定理,有





O

A

2

+

O

B

2

2

O

A

O

B

cos

<

a

,

b

>

=

A

B

2

O

B

2

+

O

C

2

2

O

B

O

C

cos

<

b

,

c

>

=

B

C

2

O

C

2

+

O

A

2

2

O

C

O

A

cos

<

c

,

a

>

=

A

C

2

OA^2+OB^2-2OA\cdot OB\cdot \cos \left< a,b \right> =AB^2\\ OB^2+OC^2-2OB\cdot OC\cdot \cos \left< b,c \right> =BC^2\\ OC^2+OA^2-2OC\cdot OA\cdot \cos \left< c,a \right> =AC^2






O



A










2











+








O



B










2




















2


O


A













O


B













cos








a


,




b








=








A



B










2















O



B










2











+








O



C










2




















2


O


B













O


C













cos








b


,




c








=








B



C










2















O



C










2











+








O



A










2




















2


O


C













O


A













cos








c


,




a








=








A



C










2














上面三式全体除以



O

C

2

OC^{2}






O



C











2













,并记



x

=

O

A

O

C

x=\frac{OA}{OC}






x




=




















O


C
















O


A




























y

=

O

B

O

C

y=\frac{OB}{OC}






y




=




















O


C
















O


B
























,可得





x

2

+

y

2

2

x

y

cos

<

a

,

b

>

=

A

B

2

O

C

2

y

2

+

1

2

y

cos

<

b

,

c

>

=

B

C

2

O

C

2

1

+

x

2

2

x

cos

<

c

,

a

>

=

A

C

2

O

C

2

x^2+y^2-2xy\cos \left< a,b \right> =\frac{AB^2}{OC^2}\\ y^2+1-2y\cos \left< b,c \right> =\frac{BC^2}{OC^2}\\ 1+x^2-2x\cos \left< c,a \right> =\frac{AC^2}{OC^2}







x










2











+









y










2




















2


x


y




cos








a


,




b








=



















O



C










2





















A



B










2


































y










2











+








1













2


y




cos








b


,




c








=



















O



C










2





















B



C










2

































1




+









x










2




















2


x




cos








c


,




a








=



















O



C










2





















A



C










2




































v

=

A

B

2

O

C

2

,

u

v

=

B

C

2

O

C

2

,

w

v

=

A

C

2

O

C

2

v=\frac{AB^2}{OC^2},uv=\frac{BC^2}{OC^2},wv=\frac{AC^2}{OC^2}






v




=




















O



C










2























A



B










2




























,




u


v




=




















O



C










2























B



C










2




























,




w


v




=




















O



C










2























A



C










2































,则





x

2

+

y

2

2

x

y

cos

<

a

,

b

>

v

=

0

y

2

+

1

2

y

cos

<

b

,

c

>

u

v

=

0

1

+

x

2

2

x

cos

<

c

,

a

>

w

v

=

0

x^2+y^2-2xy\cos \left< a,b \right> – v= 0\\ y^2+1-2y\cos \left< b,c \right> – uv= 0\\ 1+x^2-2x\cos \left< c,a \right> – wv= 0







x










2











+









y










2




















2


x


y




cos








a


,




b

















v




=








0









y










2











+








1













2


y




cos








b


,




c

















u


v




=








0








1




+









x










2




















2


x




cos








c


,




a

















w


v




=








0







我们可以把第一个式子中的



v

v






v





放到等式一边,并代入2,3两式,可得





(

1

u

)

y

2

u

x

2

cos

<

b

,

c

>

y

+

2

u

x

y

cos

<

a

,

b

>

+

1

=

0

(

1

w

)

x

2

w

y

2

cos

<

a

,

c

>

x

+

2

w

x

y

cos

<

a

,

b

>

+

1

=

0

\left( 1-u \right) y^2-ux^2-\cos \left< b,c \right> y+2uxy\cos \left< a,b \right> +1=0\\ \left( 1-w \right) x^2-wy^2-\cos \left< a,c \right> x+2wxy\cos \left< a,b \right> +1=0







(


1









u


)






y










2




















u



x










2




















cos








b


,




c








y




+








2


u


x


y




cos








a


,




b








+








1




=








0











(


1









w


)






x










2




















w



y










2




















cos








a


,




c








x




+








2


w


x


y




cos








a


,




b








+








1




=








0







由于我们知道 2D 点的图像位置,三个余弦角是已知的。同时,



u

=

B

C

2

A

B

2

u = \frac{BC^2}{AB^2}






u




=




















A



B










2























B



C










2



































w

=

A

C

2

A

B

2

w = \frac{AC^2}{AB^2}






w




=




















A



B










2























A



C










2































可以通过



A

A






A









B

B






B









C

C






C





在世界坐标系下的坐标算出,变换到相机坐标系下之后,并不改变这个比值。该式中的



x

x






x









y

y






y





是未知的,随着相机移动会发生变化。因此,该方程组是关于



x

x






x









y

y






y





的一个二元二次方程(多项式方程)。



版权声明:本文为m0_57622077原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。