【视觉SLAM】4b-特征点法估计相机运动之PnP 3D-2D

文章目录

  • [1. 前言](#1. 前言)
  • [1. 直接线性变换DLT](#1. 直接线性变换DLT)
  • [2 求解P3P](#2 求解P3P)

1. 前言

透视n点(Perspective-n-Point,PnP)问题是计算机视觉领域的经典问题,用于求解3D-2D的点运动。换句话说,当知道 N N N个世界坐标系中3D空间点的坐标以及它们在图像上的投影点像素坐标时,可以使用PnP算法来估计相机在世界坐标系的姿态。P3P是最简化的PnP形式,即最少只需3个点即可估计当前的相机姿态(解不唯一)。

总体来说,PnP的求解方法有P3P、直接线性变换(Direct Linear Transformation,DLT)、EPnP(Efficient PnP)和UPnP等。此外,还有非线性优化 解法,通过构建最小二乘问题并迭代求解,即万金油式的光束平差法(Bundle Adjustment,BA)

1. 直接线性变换DLT

假设有世界坐标系中的3D点 P = [ X , Y , Z , 1 ] T P=[X, Y, Z, 1]^T P=[X,Y,Z,1]T,在图像 I 1 I_1 I1中对应的投影像素点为 x 1 = [ u 1 , v 1 , 1 ] T x_1=[u_1, v_1, 1]^T x1=[u1,v1,1]T,根据相机小孔成像模型有:

s [ u 1 v 1 1 ] = [ R ∣ t ] P = [ 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 \begin{bmatrix} u_1 \\ v_1 \\ 1 \end{bmatrix}= \begin{bmatrix} R | t \end{bmatrix} P= \begin{bmatrix} 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{bmatrix} \begin{bmatrix} X \\ Y \\ Z \\ 1 \end{bmatrix} s u1v11 =[R∣t]P= t1t5t9t2t6t10t3t7t11t4t8t12 XYZ1

其中 s = Z s=Z s=Z,利用最后一行将其消去有:

{ s u 1 = t 1 X + t 2 Y + t 3 Z + t 4 s v 1 = t 5 X + t 6 Y + t 7 Z + t 8 s = t 9 X + t 10 Y + t 11 Z + t 12 ⇒ { u 1 = t 1 X + t 2 Y + t 3 Z + t 4 t 9 X + t 10 Y + t 11 Z + t 12 v 1 = t 5 X + t 6 Y + t 7 Z + t 8 t 9 X + t 10 Y + t 11 Z + t 12 \begin{cases} s u_1 = t_1 X + t_2 Y + t_3 Z + t_4\\ s v_1 = t_5 X + t_6 Y + t_7 Z + t_8\\ s = t_9 X + t_{10} Y + t_{11} Z + t_{12} \end{cases} \Rightarrow \begin{cases} 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}} \\ 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}} \\ \end{cases} \\ ⎩ ⎨ ⎧su1=t1X+t2Y+t3Z+t4sv1=t5X+t6Y+t7Z+t8s=t9X+t10Y+t11Z+t12⇒{u1=t9X+t10Y+t11Z+t12t1X+t2Y+t3Z+t4v1=t9X+t10Y+t11Z+t12t5X+t6Y+t7Z+t8

为简化表示,定义 [ R ∣ t ] [R|t] [R∣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 \begin{cases} \bold{t_1} = [t_1, t_2, t_3, t_4]^T \\ \bold{t_2} = [t_5, t_6, t_7, t_8]^T \\ \bold{t_3} = [t_9, t_{10}, t_{11}, t_{12}]^T \end{cases} ⎩ ⎨ ⎧t1=[t1,t2,t3,t4]Tt2=[t5,t6,t7,t8]Tt3=[t9,t10,t11,t12]T

带入上面的公式有:

{ u 1 = t 1 T P t 3 T P v 1 = t 2 T P t 3 T P ⇒ { t 1 T P − t 3 T P u 1 = 0 t 2 T P − t 3 T P v 1 = 0 \begin{cases} u_1 = \frac{\bold{t_1}^T P}{\bold{t_3}^T P} \\ v_1 = \frac{\bold{t_2}^T P}{\bold{t_3}^T P} \\ \end{cases} \Rightarrow \begin{cases} \bold{t_1}^T P - \bold{t_3}^T P u_1 = 0 \\ \bold{t_2}^T P - \bold{t_3}^T P v_1 = 0 \end{cases} {u1=t3TPt1TPv1=t3TPt2TP⇒{t1TP−t3TPu1=0t2TP−t3TPv1=0

其中, t \bold{t} t是待求变量,每个特征点提供了两个关于 t \bold{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 − v N P N T \] \[ t 1 t 2 t 3 \] = 0 \\begin{bmatrix} P_1\^T \& 0 \& -u_1 P_1\^T \\\\ 0 \& P_1\^T \& -v_1 P_1\^T \\\\ \\hdashline \\vdots \& \\vdots \& \\vdots \\\\ \\hdashline P_N\^T \& 0 \& -u_N P_N\^T \\\\ 0 \& P_N\^T \& -v_N P_N\^T \\\\ \\end{bmatrix} \\begin{bmatrix} t_1 \\\\ t_2 \\\\ t_3 \\end{bmatrix} =0 P1T0⋮PNT00P1T⋮0PNT−u1P1T−v1P1T⋮−uNPNT−vNPNT t1t2t3 =0 ## 2 求解P3P ![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/18e6f5659ac1e8ba4f2862b318fffdd9.png) 假设 A , B , C A,B,C A,B,C为世界坐标系中的三个点, a , b , c a,b,c a,b,c为这三个点在相机像平面的对应投影点,则我们可以得到三角形之间的对应关系: Δ O a b − Δ O A B , Δ O b c − Δ O B C , Δ O a c − Δ O A C (1) \\Delta Oab - \\Delta OAB, \\Delta Obc - \\Delta OBC, \\Delta Oac - \\Delta OAC \\tag{1} ΔOab−ΔOAB,ΔObc−ΔOBC,ΔOac−ΔOAC(1) 根据余弦定理,可以得到三个方程: { O A 2 + O B 2 − 2 O A ⋅ O B ⋅ c o s ⟨ a , b ⟩ = A B 2 O B 2 + O C 2 − 2 O B ⋅ O C ⋅ c o s ⟨ b , c ⟩ = B C 2 O A 2 + O C 2 − 2 O A ⋅ O C ⋅ c o s ⟨ a , c ⟩ = A C 2 (2) \\begin{cases} {OA}\^2 + {OB}\^2 - 2 OA \\cdot OB \\cdot cos \\langle a,b \\rangle = {AB}\^2 \\\\ {OB}\^2 + {OC}\^2 - 2 OB \\cdot OC \\cdot cos \\langle b,c \\rangle = {BC}\^2 \\\\ {OA}\^2 + {OC}\^2 - 2 OA \\cdot OC \\cdot cos \\langle a,c \\rangle = {AC}\^2 \\end{cases} \\tag{2} ⎩ ⎨ ⎧OA2+OB2−2OA⋅OB⋅cos⟨a,b⟩=AB2OB2+OC2−2OB⋅OC⋅cos⟨b,c⟩=BC2OA2+OC2−2OA⋅OC⋅cos⟨a,c⟩=AC2(2) 上述等式除以 O C 2 {OC}\^2 OC2,并记 x = O A / O C , y = O B / O C x=OA/OC, y=OB/OC x=OA/OC,y=OB/OC,有: { x 2 + y 2 − 2 x y c o s ⟨ a , b ⟩ = A B 2 / O C 2 y 2 + 1 2 − 2 y c o s ⟨ b , c ⟩ = B C 2 / O C 2 x 2 + 1 2 − 2 x c o s ⟨ a , c ⟩ = A C 2 / O C 2 (3) \\begin{cases} x\^2 + y\^2 - 2xycos \\langle a,b \\rangle = {AB}\^2 / {OC}\^2 \\\\ y\^2 + 1\^2 - 2ycos \\langle b,c \\rangle = {BC}\^2 / {OC}\^2 \\\\ x\^2 + 1\^2 - 2xcos \\langle a,c \\rangle = {AC}\^2 / {OC}\^2 \\end{cases} \\tag{3} ⎩ ⎨ ⎧x2+y2−2xycos⟨a,b⟩=AB2/OC2y2+12−2ycos⟨b,c⟩=BC2/OC2x2+12−2xcos⟨a,c⟩=AC2/OC2(3) 令 v = A B 2 / O C 2 , u = B C 2 / A B 2 , w = A C 2 / A B 2 v={AB}\^2/{OC}\^2,u={BC}\^2/{AB}\^2,w={AC}\^2/{AB}\^2 v=AB2/OC2,u=BC2/AB2,w=AC2/AB2,则上式变为: { x 2 + y 2 − 2 x y c o s ⟨ a , b ⟩ − v = 0 y 2 + 1 2 − 2 y c o s ⟨ b , c ⟩ − u v = 0 x 2 + 1 2 − 2 x c o s ⟨ a , c ⟩ − w v = 0 (4) \\begin{cases} x\^2 + y\^2 - 2xycos \\langle a,b \\rangle - v = 0 \\\\ y\^2 + 1\^2 - 2ycos \\langle b,c \\rangle - uv = 0\\\\ x\^2 + 1\^2 - 2xcos \\langle a,c \\rangle - wv = 0 \\end{cases} \\tag{4} ⎩ ⎨ ⎧x2+y2−2xycos⟨a,b⟩−v=0y2+12−2ycos⟨b,c⟩−uv=0x2+12−2xcos⟨a,c⟩−wv=0(4) 关于 a , b , c a,b,c a,b,c的三个余弦角 c o s ⟨ a , b ⟩ , c o s ⟨ b , c ⟩ , c o s ⟨ a , c ⟩ cos \\langle a,b \\rangle,cos \\langle b,c \\rangle,cos \\langle a,c \\rangle cos⟨a,b⟩,cos⟨b,c⟩,cos⟨a,c⟩,以及 u , w u,w u,w可以直接计算出。将(4)中的第一个等式分别带入第二和第三个等式,得到关于 x , y x,y x,y的一个二元二次方程(多项式方程): ( 1 − u ) y 2 − u x 2 − c o s ⟨ b , c ⟩ y + 2 u x y c o s ⟨ a , b ⟩ + 1 = 0 ( 1 − w ) x 2 − w y 2 − c o s ⟨ a , c ⟩ x + 2 w x y c o s ⟨ a , b ⟩ + 1 = 0 (1-u)y\^2-ux\^2-cos \\langle b,c \\rangle y+2uxycos \\langle a,b \\rangle +1 = 0 \\\\ (1-w)x\^2-wy\^2-cos \\langle a,c \\rangle x+2wxycos \\langle a,b \\rangle +1 = 0 (1−u)y2−ux2−cos⟨b,c⟩y+2uxycos⟨a,b⟩+1=0(1−w)x2−wy2−cos⟨a,c⟩x+2wxycos⟨a,b⟩+1=0

相关推荐
点云SLAM1 个月前
卡尔曼滤波算法(Kalman Filter, KF)深入推导
人工智能·算法·slam·状态估计·滤波器·卡尔曼滤波算法
点云SLAM1 个月前
SLAM文献之-DROID-SLAM: Deep Visual SLAM for Monocular, Stereo, and RGB-D Cameras
深度学习·3d·slam·droid-slam·稠密ba·端到端深度学习slam
JaydenQ1 个月前
如何使用3D高斯分布进行环境建模
slam
Perishell1 个月前
无人机避障——感知篇(采用Livox-Mid360激光雷达获取点云数据显示)
linux·机器人·动态规划·无人机·slam
知也无涯123452 个月前
机器学习大模型问题记录
计算机视觉·slam
bohu832 个月前
亚博microros小车-原生ubuntu支持系列:17 gmapping
slam·激光雷达·rviz·gmapping·microros·亚博·构建地图
深蓝学院2 个月前
顶刊JFR|ROLO-SLAM:首个针对不平坦路面的车载Lidar SLAM系统
slam·激光雷达
陈傻鱼2 个月前
ROS2测试仿真
机器人·ros·slam
点云SLAM3 个月前
CVPR 2024 自动驾驶方向总汇
人工智能·计算机视觉·自动驾驶·slam·cvpr·cvpr 2024·道路检测
什么都不会的小澎友3 个月前
相机雷达外参标定综述“Automatic targetless LiDAR–camera calibration: a survey“
slam