《视觉SLAM十四讲 第二版》笔记及课后习题(第七讲)

本文为《视觉SLAM十四讲 第二版》第七讲的读书笔记,主要探讨基于特征点的视觉里程计算法,包括特征点提取、匹配、2D-2D对极几何、3D-2D PnP、3D-2D ICP等问题。实践中使用OpenCV实现特征点提取和匹配,通过实验数据展示ORB特征点的提取和匹配速度。课后习题涉及特征点类型、优化方法、避免误匹配策略等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

读书笔记:视觉里程计1

之前的内容,介绍了运动方程和观测方程的具体形式,并讲解了以非线性优化为主的求解方法。从本讲开始,我们结束了基础知识的铺垫,开始步入正题:按照第二讲的内容,分别介绍视觉里程计、优化后端、回环检测和地图构建四个模块。本讲和下一讲主要介绍作为视觉里程计的主要理论,然后在第九章中进行一次实践。本讲关注基于特征点方式的视觉里程计算法。我们将介绍什么是特征点,如何提取和匹配特征点,以及如何根据配对的特征点估计相机运动。

特征点法

  • 经典SLAM模型中以位姿——路标(Landmark)来描述SLAM过程
    • 路标是三维空间中固定不变的点,能够在特定位姿下观测到
    • 数量充足,以实现良好的定位
    • 较好的区分性,以实现数据关联
  • 在视觉SLAM中,可利用图像特征点作为SLAM中的路标
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

2D-2D: 对极几何

特征匹配之后,得到了特征点之间的对应关系:

  • 如果只有两个单目图像,得到2D-2D间的关系 ——对极几何
  • 如果匹配的是帧和地图,得到3D-2D间的关系 ——PnP
  • 如果匹配的是RGB-D图,得到3D-3D间的关系 ——ICP
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    八点法的讨论:
  • 尺度不确定性:归一化 t 或特征点的平均深度
  • 纯旋转问题:t=0 时无法求解
  • 多于八对点时:最小二乘
  • 有外点时:RANSAC
    在这里插入图片描述
    在这里插入图片描述

小结:

  • 2D-2D情况下,只知道图像坐标之间的对应关系
    • 当特征点在平面上时(例如俯视或仰视),使用H恢复R,t
    • 否则,使用E或F恢复R,t
    • t 没有尺度
  • 求得R,t后:
    • 利用三角化计算特征点的3D位置(即深度)
  • 实际中用于单目SLAM的初始化部分

3D-2D PnP

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3D-2D ICP

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三角化与深度估计

在这里插入图片描述
在这里插入图片描述
小结:
本节介绍了基于特征点的视觉里程计中的几个重要的问题。包括:

  1. 特征点是如何提取并匹配的;
  2. 如何通过2D-2D 的特征点估计相机运动;
  3. 如何从2D-2D 的匹配估计一个点的空间位置;
  4. 3D-2D 的PnP 问题,它的线性解法和Bundle Adjustment 解法;
  5. 3D-3D 的ICP 问题,其线性解法和Bundle Adjustment 解法。

实践部分

orb_cv:

和之前几章一样,导入相应的图片参数后运行代码即可:

/home/wh/shenlan/slambook2/ch7/cmake-build-debug/orb_cv /home/wh/shenlan/slambook2/ch7/1.png /home/wh/shenlan/slambook2/ch7/2.png
extract ORB cost = 0.222814 seconds. 
match ORB cost = 0.000989399 seconds. 
-- Max dist : 95.000000 
-- Min dist : 7.000000 

在这里插入图片描述

orb_self:

需要注意一下配置文件(通过之前的各种错误调试,对这个已经驾轻就熟了(逃 ):
在这里插入图片描述
运行后结果为:

/home/wh/shenlan/slambook2/ch7/cmake-build-debug/orb_self /home/wh/shenlan/slambook2/ch7/1.png /home/wh/shenlan/slambook2/ch7/2.png
bad/total: 43/638
bad/total: 8/595
extract ORB cost = 0.00240357 seconds. 
match ORB cost = 0.000984295 seconds. 
matches: 51

在这里插入图片描述
可见,这个程序中,ORB的提取只要2.4毫秒,匹配只需要0.98毫秒。提升效果还是很明显的。

pose_estimation_2d2d:

导入正确的图片位置参数即可,运行结果如下:

/home/wh/shenlan/slambook2/ch7/cmake-build-debug/pose_estimation_2d2d /home/wh/shenlan/slambook2/ch7/1.png /home/wh/shenlan/slambook2/ch7/2.png
-- Max dist : 95.000000 
-- Min dist : 7.000000 
一共找到了81组匹配点
fundamental_matrix is 
[5.435453065896191e-06, 0.0001366043242983499, -0.02140890086929781;
 -0.0001321142229818118, 2.339475702766975e-05, -0.006332906454914053;
 0.02107630352186664, -0.003666833952417687, 1]
essential_matrix is 
[0.007841371796261635, 0.2075176016541406, 0.1181719698273573;
 -0.190270235105878, 0.03346203071185214, -0.6710910536624433;
 -0.07512093110340777, 0.6702181417805779, 0.0197271235906156]
homography_matrix is 
[0.9131751791765326, -0.1092435315745437, 29.95860009812312;
 0.02223560352253669, 0.9826008005030865, 6.50891083922104;
 -0.000100156038109612, 0.0001037779436268401, 1]
R is 
[0.9980704024700457, -0.05457644989749674, 0.02961220744670522;
 0.05354481493884546, 0.9979665375218761, 0.03457951387400768;
 -0.03143921924039243, -0.03292720916178488, 0.9989631496658776]
t is 
[-0.9411804751897357;
 -0.1569351957186449;
 0.2992501586739325]
t^R=
[-0.01108937434188349, -0.293474206690423, -0.1671204024221927;
### 关于《视觉SLAM十四第二中的Eigen相关内容 在《视觉SLAM十四第二中,虽然主要讨论的是SLAM系统的理论基础和技术实现[^3],但Eigen库作为线性代数运算的重要工具,在多个章节都有提及和应用。 #### Eigen简介及其重要性 Eigen是一个高效的C++模板库,用于矩阵和向量操作。对于SLAM系统而言,Eigen提供了必要的数学支持来处理各种几何变换、优化问题等。由于其高效性和易用性,Eigen成为许多计算机视觉和机器人项目不可或缺的一部分[^5]。 #### 安装与配置 当涉及到具体安装时,建议按照官方文档或可靠教程来进行设置。需要注意的是,在遇到编译错误时不应急于重新安装整个环境;很多时候可能是某些细节上的疏忽所致。例如,有经验表明,初次尝试失败后不必轻易放弃当前本的Pangolin或其他依赖项,而应仔细排查其他可能的原因。 #### 应用实例 在实际编程实践中,Eigen被广泛应用于表示三维空间内的点云数据结构以及执行诸如旋转和平移之类的刚体运动学计算。下面给出一段简单的代码片段展示如何利用Eigen定义并操作齐次坐标系下的平移矩阵: ```cpp #include <iostream> #include <Eigen/Dense> using namespace std; using namespace Eigen; int main() { Vector3d t(0.7, 0.2, 1.5); // 平移向量 Matrix4d T = Matrix4d::Identity(); // 初始化单位矩阵 // 设置最后三列对应平移分量 T.block<3, 1>(0, 3) = t; cout << "Translation matrix:\n" << T << endl; return 0; } ``` 这段程序创建了一个基于输入参数`Vector3d t`构建出来的四维仿射变换矩阵`T`,其中包含了指定方向上移动的信息。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值