视觉SLAM十四讲——对极约束(2D-2D)笔记

学习目标:

学习2D-2D点对极约束的原理,以及通过求解本质矩阵来估计相机的位姿。


目录:

     一、向量内积和外积

     二、对极约束的概念

     三、对极约束的公式推导

     四、本质矩阵和基础矩阵

     五、八点法


     一、向量内积和外积

1.向量的内积:又称点积,描述的是向量间的投影关系。

    向量a的行数=向量b的列数,则向量a和向量b的内积公式如下:

     𝑎·𝑏=𝑎1∗𝑏1+𝑎2∗𝑏2+….+𝑎𝑛∗𝑏𝑛=𝑎𝑏cos<𝑎,𝑏>

    当a和b是非零向量时,a与b正交的充要条件是a∙𝑏=0

2.向量外积:(又称叉积),外积的方向垂直于这两个向量。

a x b = a∧ b

其中,符号表示反对称符号,a表示矩阵,于是向量外积就写成了矩阵与向量的乘法,变成了线性运算。


     二、对极约束的概念

I2是第一帧图I1从光心O1运动到光心O2成的像。P是空间中的一点,对应第一帧I1中的特征点p1,在I2中对应的是特征点p2。(即同一个空间点在两个成像平面上的投影)

点O1、O2、P三个点确定一个平面,称为极平面,极平面与成像平面I1和I2相交线l1,l2,称为极线;O1O2连线称为基线,基线与两个像平面I1和I2的交点为e1和e2,称为极点

ecee125aff1442aabf9abb5756f238b8.png


     三、对极约束的公式推导

设P的空间位置为 P = [X , Y, Z]T,在两帧图片中对应特征点为p1和p2,从第一帧到第二帧相机的运动为R、t。

1.特征点p1、p2对应的像素位置为:

gif.latex?s_%7B1%7Dp_%7B1%7D%20%3D%20K%20P

gif.latex?s_%7B2%7Dp_%7B2%7D%20%3D%20K%20%28RP&plus;t%29

其中,K为相机内参,s1和s2是点P到光心O1和O2的距离,实际上s1可以理解为点P在相机O1坐标系下的Z轴值,s2是点P在相机O2坐标系下的Z轴值。(ps:修正之前错误表达)

2. 利用齐次坐标(下篇文章介绍下齐次坐标),可以变换为:

gif.latex?p_%7B1%7D%20%3D%20K%20P

gif.latex?p_%7B2%7D%20%3D%20K%20%28RP&plus;t%29       ————(公式1)

3.设x1,x2是两个特征点p1和p2在归一化平面上的坐标,取

52cb2aad10ce4980b4a37a9d7fae59f9.png

4.将x1、x2都左乘K,则得到p1=K x1,p2=K x2,带入公式1中,得到

gif.latex?x_%7B2%7D%20%3D%20R%20x_%7B1%7D&plus;t         ————(公式2)

5.该公式两边同时左乘 t,相当于两侧同时与t做外积,而 tt=0,则得

gif.latex?t%5Cwedge%20x_%7B2%7D%3D%20t%5Cwedge%20Rx_%7B1%7D  6.第5步骤中的公式左乘gif.latex?x_%7B2%7D%5E%7BT%7D,则得

gif.latex?x_%7B2%7D%5E%7BT%7Dt%5Cwedge%20x_%7B2%7D%3Dx_%7B2%7D%5E%7BT%7D%20t%5Cwedge%20Rx_%7B1%7D

其中, gif.latex?t%5Cwedge%20x_%7B2%7D表示t和x2做外积,叉积的方向与t和x2的垂直,因此在与gif.latex?x_%7B2%7D%5E%7BT%7D做内积时则为0,所以得到

 gif.latex?x_%7B2%7D%5E%7BT%7D%20t%5Cwedge%20Rx_%7B1%7D%3D0     ————(公式3)

6.公式3中重新带入p1,p2,则得

52cb2aad10ce4980b4a37a9d7fae59f9.png

adc4cb94377249978f12ae67ec01d01d.png————(公式4)

公式3和公式4都被称为对极约束,由公式可知,对极约束包含了平移和旋转。


     四、本质矩阵和基础矩阵

对于三中推导出的极线约束公式:

c93b6d6c53b84967bc2f6247817acea0.png

则令𝐸=𝑡∧𝑅,gif.latex?F%20%3DK%5E%7B-1%7Dt%5Cwedge%20R%20K%5E%7B-1%7D

称E为本质矩阵,F为基础矩阵,两者就相差一个相机内参。

带入对接约束的公式中,得到

d19f6ac19de44fc3a420f4cf2c895933.png

因此求解相机位姿R和t的步骤为:

  • 根据上下两帧的对应特征点的像素坐标,求出E或者F;
  • 根据E或者F,利用SVD分解求出R和t。

五、八点法

  • 由于对极约束是等式为0的约束,则对E乘以任意非0常数,则对极约束依然成立,因此称E有尺度等价性。
  • 由于旋转和平移共有6个自由度,因此𝑡∧𝑅也有6个自由度,但是由于尺度等价性,故E有5个自由度。

求解E需要八点法,因此求解E至少需要上下帧图片中匹配到8对特征点。


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
对极约束计算机视觉中的一个基本问题,它用于解决多视图几何中的相机定位和三维重建等问题。在Python中,可以使用OpenCV库实现对极约束的计算。 具体实现方法如下: 1. 首先读入两张图像,并提取它们的特征点。可以使用OpenCV的SIFT或SURF算法进行特征点提取。 ``` python import cv2 img1 = cv2.imread('img1.jpg') img2 = cv2.imread('img2.jpg') sift = cv2.xfeatures2d.SIFT_create() kp1, des1 = sift.detectAndCompute(img1, None) kp2, des2 = sift.detectAndCompute(img2, None) ``` 2. 对这些特征点进行匹配。可以使用OpenCV的BFMatcher算法进行特征点匹配。 ``` python bf = cv2.BFMatcher() matches = bf.knnMatch(des1, des2, k=2) good_matches = [] for m, n in matches: if m.distance < 0.75 * n.distance: good_matches.append(m) ``` 3. 通过这些特征点的匹配关系,计算出两张图像之间的基础矩阵(Fundamental Matrix)。 ``` python pts1 = np.float32([kp1[m.queryIdx].pt for m in good_matches]).reshape(-1, 1, 2) pts2 = np.float32([kp2[m.trainIdx].pt for m in good_matches]).reshape(-1, 1, 2) F, mask = cv2.findFundamentalMat(pts1, pts2, cv2.FM_RANSAC) ``` 4. 使用基础矩阵计算出两张图像之间特定点的极线。可以使用OpenCV的computeCorrespondEpilines函数实现。 ``` python pts1 = np.float32([kp1[m.queryIdx].pt for m in good_matches]).reshape(-1, 2) pts2 = np.float32([kp2[m.trainIdx].pt for m in good_matches]).reshape(-1, 2) lines1 = cv2.computeCorrespondEpilines(pts2.reshape(-1, 1, 2), 2, F) lines1 = lines1.reshape(-1, 3) lines2 = cv2.computeCorrespondEpilines(pts1.reshape(-1, 1, 2), 1, F) lines2 = lines2.reshape(-1, 3) ``` 这样,就可以通过OpenCV实现对极约束的计算了。需要注意的是,在实际应用中,需要对极线进行筛选和优化,以提高结果的精度和鲁棒性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值