文章目录
- 1. 1. 跟踪初始化求本质矩阵和单应矩阵时,开双线程进行并行加速
- 2. 2. 计算关键点灰度质心方向时,利用圆的对称性每次循环求解对称的两组值。最后使用FastAtan2函数加速计算角度
- 3. 3. 通过近邻窗口半径(提取特征时预先分配至网格)、投影后坐标窗口附近、Bow词袋等几种方法加速特征匹配
- 4. 4. 每次先将某些变量的倒数值计算出来存放至inverse变量,减少计算时除法的计算量
- 5. 5. 循环或函数开始前先把vector等变量reserve扩容至足够大,防止循环时因容量不够发生临时扩容
- 6. 6. 计算双目特征匹配时,只在某近邻像素行范围内查找,不全局暴力匹配
- 7. 7. 访问多线程加锁数据时,快速解锁,避免长时间独占共享数据
- 8. 8. 为不同作用的数据变量选用合适的容器
- 9. 9. 待补充
Author: [矩阵的秩]
Link: [https://zhuanlan.zhihu.com/p/618562057]
1. 跟踪初始化求本质矩阵和单应矩阵时,开双线程进行并行加速
1 | // 构造线程来计算H矩阵及其得分 |
2. 计算关键点灰度质心方向时,利用圆的对称性每次循环求解对称的两组值。最后使用FastAtan2函数加速计算角度
1 | static float IC_Angle(const Mat& image, Point2f pt, const vector<int> & u_max) |
3. 通过近邻窗口半径(提取特征时预先分配至网格)、投影后坐标窗口附近、Bow词袋等几种方法加速特征匹配
1 | void Frame::AssignFeaturesToGrid() |
4. 每次先将某些变量的倒数值计算出来存放至inverse变量,减少计算时除法的计算量
1 | //例如:1 |
5. 循环或函数开始前先把vector等变量reserve扩容至足够大,防止循环时因容量不够发生临时扩容
1 | //例如:1 |
6. 计算双目特征匹配时,只在某近邻像素行范围内查找,不全局暴力匹配
1 | void Frame::ComputeStereoMatches() |
7. 访问多线程加锁数据时,快速解锁,避免长时间独占共享数据
1 | //多线程编程注意,例如 |
8. 为不同作用的数据变量选用合适的容器
例如:
存储特征点的vector容器(频繁随机访问,变化较小:提取完成后很少再进行插入和删除)
存储共视关键帧mConnectedKeyFrameWeights的map容器。 mConnectedKeyFrameWeights是一个用于保存当前关键帧与其连接的其他关键帧之间权重信息的数据结构,其中键是连接的关键帧 ID,值是权重。此变量在 ORB-SLAM2 中被频繁地使用,因此它需要支持高效的查找和插入操作。
个人猜测,由于该变量的大小通常比较小,因此使用 std::map
。
std::map
是一种有序关联容器,它使用红黑树实现。由于它是一个有序容器,因此它提供了按键排序的功能,这使得它在查找和插入操作方面具有较高的效率。另外,由于红黑树的高效性能和可预测的内存占用,std::map
通常比 std::unordered_map
在处理小规模数据时表现更好。
四叉树均匀化分配特征点以及记录连接关键帧、局部地图点(如lLocalMapPoints)时使用list链表容器(不经常随机访问,而是遍历迭代访问,经常需要插入,list插入效率高)
Map中的地图点和关键帧用set容器,因为经常需要做插入删除动作(印象中orbslam2这里地图点的删除没实现,可能会造成内存泄漏)set容器有序,无重复元素,方便转vector(返回关键帧集合转化的vector给可视化和BA优化程序用)