PnP学习

这篇博客介绍了PnP问题,即Perspective-n-Point方法,用于解决3D到2D点对的运动估计。在视觉里程计中,PnP能有效估计相机位姿,尤其是结合3D点信息时。直接线性变换(DLT)作为求解PnP的一种方式,通过构建线性方程组来估计相机的旋转和平移。当匹配点数量超过六对时,可以通过最小二乘法进一步优化解。DLT虽然简单但可能不满足旋转矩阵的约束,需要额外步骤修正。
摘要由CSDN通过智能技术生成

P n P PnP PnP (Perspective-n-Point) 是求解 3 D 3D 3D 2 D 2D 2D 点对运动的方法。它描述了当我们知道 n n n 3 D 3 D 3D 空间点以及它们的投影位置时,如何估计相机所在的位姿。前面已经说了, 2 D − 2 D 2D-2D 2D2D 的对极几何方法需要八个或八个以上的点对(以八点法为例), 且存在着初始化、纯旋转和尺度的问题。然而, 如果两张图像中, 其中一张特征点的 3 D 3D 3D 位置已知, 那么最少只需三个点对(需要至少一个额外点验证结果)就可以估计相机运动。特征点的 3 D 3D 3D 位置可以由三角化, 或者由 RGB-D 相机的深度图确定。因此, 在双目或 RGB-D 的视觉里程计中, 我们可以直接使用 P n P PnP PnP 估计相机运动。而在单目视觉里程计中, 必须先进行初始化, 然后才能使用 P n P PnP PnP 3 D − 2 D 3D-2D 3D2D 方法不需要使用对极约束, 又可以在很少的匹配点中获得较好的运动估计,是最重要的一种姿态估计方法。
P n P PnP PnP 问题有很多种求解方法,例如用三对点估计位姿的 P 3 P P3P P3P, 直接线性变换 D L T DLT DLT, E P n P EPnP EPnP(Efficient PnP), U P n P UPnP UPnP 等等)。此外,还能用非线性优化的方式, 构建最小二乘问题并迭代求解, 也就是万金油式的光束法平差(Bundle Adjustment, BA)。我们先来看 D L T DLT DLT, 然后再讲 Bundle Adjustment。

7.7.1 直接线性变换 (DLT)
我们考虑这样一个问题:已知一组3D点的位置,以及它们在某个相机的投影位置,求该相机的位姿。这个问题也可以用于求解给定地图和图像时的相机状态问题。如果把3D点看成在另一个相机坐标系中的点的话,则也可以用来求解两个相机的相对运动问题。我们从简单的问题出发。

考虑某个空间点 P P P,它的齐次坐标为 P = ( X , Y , Z , 1 ) T P = (X, Y, Z, 1)^T P=(X,Y,Z,1)T。在图像 I 1 I1 I1 中,投影到特征点 x 1 = ( u 1 , v 1 , 1 ) T x1 = (u1, v1, 1)^T x1=(u1,v1,1)T(以归一化平面齐次坐标表示)。此时相机的位姿 R , t R, t R,t未知的。与单应矩阵的求解类似,我们定义增广矩阵 [ R ∣ t ] [R|t] [Rt] 为一个 3 × 4 的矩阵,包含了旋转与平移信息。我们把它的展开形式列写如下:

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

用最后一行把 s s s 消去,得到两个约束:

u 1 = t 1 X + t 2 Y + t 3 Z + t 4 t 9 X + t 10 Y + t 11 Z + t 12 u_{1}=\frac{t_{1} X+t_{2} Y+t_{3} Z+t_{4}}{t_{9} X+t_{10} Y+t_{11} Z+t_{12}} u1=t9X+t10Y+t11Z+t12t1X+t2Y+t3Z+t4

v 1 = t 5 X + t 6 Y + t 7 Z + t 8 t 9 X + t 10 Y + t 11 Z + t 12 v_{1}=\frac{t_{5} X+t_{6} Y+t_{7} Z+t_{8}}{t_{9} X+t_{10} Y+t_{11} Z+t_{12}} v1=t9X+t10Y+t11Z+t12t5X+t6Y+t7Z+t8

为了简化表示,定义 T T T 的行向量:

t 1 = ( t 1 , t 2 , t 3 , t 4 ) T , t 2 = ( t 5 , t 6 , t 7 , t 8 ) T , t 3 = ( t 9 , t 10 , t 11 , t 12 ) T \boldsymbol{t}_{1}=\left(t_{1}, t_{2}, t_{3}, t_{4}\right)^{T}, \boldsymbol{t}_{2}=\left(t_{5}, t_{6}, t_{7}, t_{8}\right)^{T}, \boldsymbol{t}_{3}=\left(t_{9}, t_{10}, t_{11}, t_{12}\right)^{T} t1=(t1,t2,t3,t4)T,t2=(t5,t6,t7,t8)T,t3=(t9,t10,t11,t12)T

于是有:

t 1 T P − t 3 T P u 1 = 0 \boldsymbol{t}_{1}^{T} \boldsymbol{P}-\boldsymbol{t}_{3}^{T} \boldsymbol{P} u_{1}=0 t1TPt3TPu1=0

t 2 T P − t 3 T P v 1 = 0 \boldsymbol{t}_{2}^{T} \boldsymbol{P}-\boldsymbol{t}_{3}^{T} \boldsymbol{P} v_{1}=0 t2TPt3TPv1=0

请注意 t t t 是待求的变量,可以看到每个特征点提供了两个关于 t t t 的线性约束。假设一共有 N N N 个特征点,可以列出线性方程组:
(第一个点,第二个点,第三个点……)
( P 1 T 0 − u 1 P 1 T 0 P 1 T − v 1 P 1 T P 2 T 0 − u 1 P 2 T 0 P 2 T − u 1 P 2 T ⋮ ⋮ ⋮ P N T 0 − u N P N T 0 P N T − v N P N T ) ( t 1 t 2 t 3 ) = 0 \left(\begin{array}{ccc}P_{1}{ }^{T} & 0 & -u_{1} P_{1}^{T} \\ 0 & P_{1}^{T} & -v_{1} P_{1}^{T} \\ P_{2}^{T} & 0 & -u_{1} P_{2}^T \\ 0 & P_{2}^{T} & -u_{1} P_{2}^{T} \\ \vdots & \vdots & \vdots \\ {P} _N^{T} & 0 & -u_{N} P_{N}^{T}\\ 0 & {P} _N^{T} & -v_{N} P_{N}^{T}\end{array}\right)\left(\begin{array}{c}t_{1} \\ t_{2} \\ t_{3}\end{array}\right)=0 P1T0P2T0PNT00P1T0P2T0PNTu1P1Tv1P1Tu1P2Tu1P2TuNPNTvNPNTt1t2t3=0

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

在 DLT 求解中,我们直接将 T 矩阵看成了 12 12 12 个未知数,忽略了它们之间的联系。因为旋转矩阵 R ∈ S O ( 3 ) \boldsymbol{R} \in SO(3) RSO(3),用 DLT 求出的解不一定满足该约束,它是一个一般矩阵。平移向量比较好办,它属于向量空间。对于旋转矩阵 R,我们必须针对 DLT 估计的 T 的左边 3 × 3 3 × 3 3×3 的矩阵块,寻找一个最好的旋转矩阵对它进行近似。这可以由 Q R QR QR 分解完成, 也可以像这样来计算:
R ← ( R R T ) − 1 2 R \boldsymbol{R} \leftarrow\left(\boldsymbol{R} \boldsymbol{R}^{\mathrm{T}}\right)^{-\frac{1}{2}} \boldsymbol{R} R(RRT)21R
相当于把结果从矩阵空间重新投影到 SE(3) 流形上,转换成旋转和平移两部分

需要解释的是,我们这里的 x 1 x1 x1 使用了归一化平面坐标,去掉了内参矩阵 K K K 的影响——这是因为内参 K K K 在 SLAM 中通常假设为已知。如果内参未知,那么我们也能用 PnP去估计 K , R , t K, R, t K,R,t 三个量。然而由于未知量的增多,效果会差一些。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gone_float

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值