GPO:快速、准确地进行单眼SLAM初始化的全局平面优化

GPO:快速、准确地进行单眼SLAM初始化的全局平面优化

摘要

初始化对于单目SLAM来说是必须的。本文重点研究了一种基于平面特征的单目SLAM初始化方法。该算法从滑动窗口的单应矩阵估计开始,然后通过全局平面优化(global plane optimization, GPO)获取相机位姿和平面法线。3D点可以通过使用平面约束恢复,无需三角化(or三角测量)。本文提出的方法充分利用了多帧的平面信息,避免了单应矩阵分解中的模糊性。我们在收集来的棋盘数据集上参照基准方法的实现,验证了我们的算法,并进行了广泛的分析。实验结果表明,我们的方法在准确度和实时性两方面都优于调优后的基准方法。

背景介绍

单目SLAM旨在从单个输入的视频流中,同时估计相机轨迹、重建未知环境。其被广泛应用于增强现实(AR)和自动驾驶领域。为了引导单目SLAM系统,通常必须进行初始化。在初始化期间,相机位姿和初始地图是为后续的跟踪和建图建造的。不良的初始化会减慢系统的收敛速度,甚至导致定位的失败。

单目SLAM的一般初始化方法基于本征矩阵(or基础矩阵)分解。然后通过三角化获得三维地图。接着,使用PnP算法估计其他帧的位姿。整个过程之后可以进行增量式局部SFM。

然而,这种初始化机制有一些缺陷。首先,需要足够大的视差才能进行准确的三角化,并且不能通过纯旋转估计特征点深度(译者注:因为会导致基础矩阵自由度下降);其次,由于SfM问题的规模很大,需要很长时间才能收敛;最后,人造长江通常由地面和前面之类的平面结构组成,导致本征矩阵的退化。

为了处理平面规则性,一些方法估计两帧之间的单应矩阵,而不是本征矩阵。但是,单应矩阵分解的几何模糊性使得设计适应不同应用的良好选择策略变得很棘手。此外,上面所有的系统只使用了两帧的观测。如果我们可以利用更多来自平面场景的帧的信息,就有望获得更准确的估计。

为了解决所有的这些问题,我们提出了一种快速、准确的单目SLAM初始化方法。在我们的方法中,我们首先使用RANSAC估计第一帧和当前帧之间的滑动窗口中的单应矩阵。然后,我们使用全局

### C/C++ 中初始化数组 `curState_GPO[64]` 为 0 的方法 在 C/C++ 中,可以通过多种方式将数组初始化为 0。以下是几种常见的方法: #### 方法一:使用 `{0}` 初始化 如果是在定义数组时进行初始化,可以直接使用 `{0}` 来初始化整个数组为 0。 ```c int curState_GPO[64] = {0}; ``` 这种方式会将数组的第一个元素显式设置为 0,其余元素隐式初始化为 0[^1]。 #### 方法二:使用 `memset` 函数 如果数组已经定义,或者需要在运行时动态初始化为 0,可以使用标准库函数 `memset`。 ```c #include <string.h> int curState_GPO[64]; memset(curState_GPO, 0, sizeof(curState_GPO)); ``` `memset` 将目标内存区域填充为指定的值(这里是 0),并且需要指定内存大小以确保所有元素都被正确初始化[^3]。 #### 方法三:使用循环初始化 通过循环逐一将数组中的每个元素设置为 0。 ```c int curState_GPO[64]; for (int i = 0; i < 64; i++) { curState_GPO[i] = 0; } ``` 虽然这种方法效率较低,但在某些特定场景下可能更直观或灵活[^2]。 #### 方法四:使用 C++ 的构造函数初始化 在 C++ 中,可以利用类的构造函数或初始化列表来初始化数组成员变量。 ```cpp class MyClass { private: int curState_GPO[64]; public: MyClass() { memset(curState_GPO, 0, sizeof(curState_GPO)); } }; ``` 这种方式特别适用于面向对象编程中对类成员变量的初始化[^2]。 #### 方法五:使用 C++11 的统一初始化语法 C++11 引入了统一初始化语法,可以更加简洁地初始化数组。 ```cpp int curState_GPO[64] {}; ``` 这种方式与 `{0}` 类似,但更现代且语法上更为一致[^2]。 ### 注意事项 - 如果数组是全局变量或静态变量,则其默认会被初始化为 0,无需额外操作[^1]。 - 使用 `memset` 时需注意数据类型。例如,对于浮点数数组,`memset` 可能无法正确初始化为数值 0.0[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值