1. 什么是pnp
即利用已知三维结构与图像的对应关系求解相机与参考坐标系的相对关系(相机的外参)
2. pnp的应用
2.1. 求解相机到物体的变换矩阵(目标追踪)
2.1.1. 问题背景
-
已知物体的大小,即知道物体的世界坐标系的坐标
P w = [ X w Y w Z w ] (1) P_w = \begin{bmatrix} X_w \\ Y_w \\ Z_w \end{bmatrix} \tag{1} Pw= XwYwZw (1) -
已知三维特征点在像素坐标系的投影
p = [ u v 1 ] (2) p = \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} \tag{2} p= uv1 (2) -
相机的内参矩阵
K = [ f x 0 c x 0 f y c y 0 0 1 ] (3) K = \begin{bmatrix} f_x & 0&c_x \\ 0& f_y&c_y \\ 0&0&1 \end{bmatrix} \tag{3} K= fx000fy0cxcy1 (3)
2.1.2. 求解
利用世界坐标系到像素坐标系的转化公式获取待追踪物体与相机之间的旋转与平移关系
p
=
(
u
v
1
)
=
1
z
c
(
f
x
0
c
x
0
f
y
c
y
0
0
1
)
(
x
c
y
c
z
c
)
=
1
z
c
K
T
c
w
P
w
(4)
p=\left(\begin{matrix} u\\ v\\1\end{matrix} \right)=\frac{1}{z_c}\left(\begin{matrix} f_x&0&c_x\\ 0&f_y&c_y\\0&0&1\end{matrix} \right)\left(\begin{matrix} x_c\\ y_c\\z_c\end{matrix} \right)=\frac{1}{z_c}KT_{cw}P_w\tag{4}
p=
uv1
=zc1
fx000fy0cxcy1
xcyczc
=zc1KTcwPw(4)
为了求解
T
c
w
T_{cw}
Tcw,至少需要3组特征点。
2.1.3. 至少需要的特征点数
2.1.3.1. 代数法
将(12)式展开
p
=
(
u
v
1
)
=
1
z
c
(
f
x
0
c
x
0
f
y
c
y
0
0
1
)
(
x
c
y
c
z
c
)
=
1
z
c
(
f
x
0
c
x
0
f
y
c
y
0
0
1
)
(
R
11
R
12
R
13
T
1
R
21
R
22
R
23
T
2
R
31
R
32
R
33
T
3
)
(
X
w
Y
w
Z
w
)
(5)
p=\left(\begin{matrix} u\\ v\\1\end{matrix} \right)=\frac{1}{z_c}\left(\begin{matrix} f_x&0&c_x\\ 0&f_y&c_y\\0&0&1\end{matrix} \right)\left(\begin{matrix} x_c\\ y_c\\z_c\end{matrix} \right)=\\\frac{1}{z_c}\left(\begin{matrix} f_x&0&c_x\\ 0&f_y&c_y\\0&0&1\end{matrix} \right)\left(\begin{matrix} R_{11} &R_{12} &R_{13}&T_1\\ R_{21} &R_{22} &R_{23}&T_2\\ R_{31} &R_{32} &R_{33}&T_3\end{matrix} \right)\left(\begin{matrix} X_w\\Y_w\\Z_w\end{matrix} \right)\tag{5}
p=
uv1
=zc1
fx000fy0cxcy1
xcyczc
=zc1
fx000fy0cxcy1
R11R21R31R12R22R32R13R23R33T1T2T3
XwYwZw
(5)
对于R和T展开并且对矩阵相乘展开我们得到:
X
w
∗
(
f
x
∗
R
11
+
c
x
∗
R
31
−
x
∗
R
31
)
+
Y
w
∗
(
f
x
∗
R
12
+
c
x
∗
R
32
−
u
∗
R
32
)
+
Z
w
∗
(
f
x
∗
R
13
+
c
x
∗
R
33
−
u
∗
R
33
)
=
T
3
∗
u
−
f
x
∗
T
1
−
c
x
∗
T
3
(6)
X_w * ( f_x * R_{11} + c_x * R_{31} - x * R_{31}) + Y_w * (f_x * R_{12} + c_x * R_{32} - u * R_{32}) + Z_w * (f_x * R_{13} + c_x * R_{33} - u * R_{33}) \\= T_3 * u - f_x * T_1 - c_x * T_3\tag{6}
Xw∗(fx∗R11+cx∗R31−x∗R31)+Yw∗(fx∗R12+cx∗R32−u∗R32)+Zw∗(fx∗R13+cx∗R33−u∗R33)=T3∗u−fx∗T1−cx∗T3(6)
X
w
∗
(
f
y
∗
R
21
+
c
y
∗
R
31
−
v
∗
R
31
)
+
Y
w
∗
(
f
y
∗
R
22
+
c
y
∗
R
32
−
v
∗
R
32
)
+
Z
w
∗
(
f
y
∗
R
23
+
c
y
∗
R
33
−
v
∗
R
33
)
=
T
3
∗
v
−
f
y
∗
T
2
−
c
y
∗
T
3
(7)
X_w * ( f_y * R_{21} + c_y * R_{31} - v * R_{31}) + Y_w * (f_y * R_{22} + c_y * R_{32} - v * R_{32}) + Z_w * (f_y * R_{23} + c_y * R_{33} - v * R_{33}) \\= T_3 * v - f_y * T_2 - c_y * T_3\tag{7}
Xw∗(fy∗R21+cy∗R31−v∗R31)+Yw∗(fy∗R22+cy∗R32−v∗R32)+Zw∗(fy∗R23+cy∗R33−v∗R33)=T3∗v−fy∗T2−cy∗T3(7)
也就是说一组2D/3D点可以得到两个方程组
f x f_x fx f y f_y fy u 0 u_0 u0 v 0 v_0 v0是相机内参,已知, X w X_w Xw Y w Y_w Yw x x x y y y是一组3D/2D点的坐标,所以未知数有 R 11 R_{11} R11 R 12 R_{12} R12 R 13 R_{13} R13 R 21 R_{21} R21 R 22 R_{22} R22 R 23 R_{23} R23 R 31 R_{31} R31 R 32 R_{32} R32 R 33 R_{33} R33 T 1 T_1 T1 T 2 T_2 T2 T 3 T_3 T3一共12个,由于旋转矩阵是正交矩阵,每行每列都是单位向量且两两正交,所以 R R R的自由度为3,秩也是3,比如知道 R 11 R_{11} R11 R 12 R_{12} R12 R 13 R_{13} R13就能求出剩下的 R x x R_{xx} Rxx。加上平移向量的3个未知数,一共6个未知数,而每一组2D/3D点提供的 x x x y y y X w X_w Xw Y w Y_w Yw Z w Z_w Zw可以确立两个方程,所以3组2D/3D点的坐标能确立6个方程从而解出6个未知数。
z c z_c zc哪去了, z c z_c zc的意义是在相机坐标系下,特征点的Z轴坐标,所以这个 z c z_c zc等于 t 3 t_3 t3
故PnP需要知道至少3组2D/3D点。
2.1.3.2. 几何法
- 当只有一个特征点时,相机在一个球面上任意一个位置观测特征点上的结果都是一致的,所以此时相机位姿的解有无数个(球面)
- 当只有两个特征点时,相机在两个球面的相交面上任意一个位置观测特征点上的结果都是一致的,所以此时相机位姿的解有无数个(平面)
- 当有三个特征点时,相机在三个球面的相交面上任意一个位置观测特征点上的结果都是一致的,所以此时相机位姿的解是有限的(交点)
2.1.4. solvepnp的使用
2.2. 求解两帧相机之间的变换矩阵矩阵
2.2.1. 问题背景
- 已知第
$k$
帧的特征点的像素坐标以及特征点的深度信息$z_{c1}$
p 1 = ( u 1 v 1 1 ) (8) p_1 = \left(\begin{matrix} u_1\\ v_1\\1\end{matrix} \right) \tag{8} p1= u1v11 (8) - 已知第
$k+1$
帧的特征点的像素坐标
p 2 = ( u 2 v 2 1 ) (9) p_2 = \left(\begin{matrix} u_2\\ v_2\\1\end{matrix} \right) \tag{9} p2= u2v21 (9) - 相机的内参矩阵
K = [ f x 0 c x 0 f y c y 0 0 1 ] (10) K = \begin{bmatrix} f_x & 0&c_x \\ 0& f_y&c_y \\ 0&0&1 \end{bmatrix} \tag{10} K= fx000fy0cxcy1 (10)
2.2.2. 求解
先将第 k k k帧像素坐标系的特征点转成相机坐标系下 P c 1 P_{c1} Pc1
p 1 = ( u 1 v 1 1 ) = 1 z c 1 ( f x 0 c x 0 f y c y 0 0 1 ) ( x c 1 y c 1 z c 1 ) (11) p_1=\left(\begin{matrix} u_1\\ v_1\\1\end{matrix} \right)=\frac{1}{z_{c1}}\left(\begin{matrix} f_x&0&c_x\\ 0&f_y&c_y\\0&0&1\end{matrix} \right)\left(\begin{matrix} x_{c1}\\ y_{c1}\\z_{c1}\end{matrix} \right) \tag{11} p1= u1v11 =zc11 fx000fy0cxcy1 xc1yc1zc1 (11)
现在已知第
k
k
k帧相机坐标系下特征点的三维坐标,现在我们当它是一个全新的世界坐标系下的坐标,用第
k
+
1
k+1
k+1帧的像素坐标和这个全新的世界坐标计算出两帧相机之间的变换矩阵
(
u
2
v
2
1
)
=
1
z
c
2
(
R
t
0
1
)
(
f
x
0
c
x
0
f
y
c
y
0
0
1
)
(
x
c
1
y
c
1
z
c
1
1
)
(12)
\left(\begin{matrix} u_2\\ v_2\\1\end{matrix} \right)=\frac{1}{z_{c2}}\left(\begin{matrix} R&t\\ 0&1\end{matrix} \right)\left(\begin{matrix} f_x&0&c_x\\ 0&f_y&c_y\\0&0&1\end{matrix} \right)\left(\begin{matrix} x_{c1}\\ y_{c1}\\z_{c1}\\1\end{matrix} \right) \tag{12}
u2v21
=zc21(R0t1)
fx000fy0cxcy1
xc1yc1zc11
(12)
其中需要特征点的个数和上一种应用的推导一致。
3. 两种应用之间的区别
前者需要的是相邻帧间相机位姿的的变换矩阵,但是后者需要的是被跟踪物体和相机之间的变换矩阵,两者间有着共通之处,就是他们都是使用一样的坐标变换,只不过视觉里程计把前一帧看作世界坐标系罢了