slam14讲-ch13 和 orb-slam2

OpenSLAM.org

1、基础知识

1.1 c++

      1.1.1 h文件的撰写规则

#pragma once

#ifndef MYSLAM_CAMERA_H
#define MYSLAM_CAMERA_H
#endif  // MYSLAM_CAMERA_H

    1.1.2 共享指针

        在实际的 C++ 开发中,我们经常会遇到诸如程序运行中突然崩溃、程序运行所用内存越来越多最终不得不重启等问题,这些问题往往都是内存资源管理不当造成的。比如:

  • 有些内存资源已经被释放,但指向它的指针并没有改变指向(成为了野指针),并且后续还在使用;
  • 有些内存资源已经被释放,后期又试图再释放一次(重复释放同一块内存会导致程序运行崩溃);
  • 没有及时释放不再使用的内存资源,造成内存泄漏,程序占用的内存资源越来越多

         C++ 11 后实现了unique_ptr、shared_ptr 以及 weak_ptr 这 3 个智能指针来实现堆内存的自动回收。具体来讲,智能指针和普通指针的用法是相似的,不同之处在于,智能指针可以在适当时机自动释放分配的内存。也就是说,使用智能指针可以很好地避免“忘记释放内存而导致内存泄漏”问题出现。

C++ 智能指针底层是采用引用计数的方式实现的。简单的理解,智能指针在申请堆内存空间的同时,会为其配备一个整形值(初始值为 1),每当有新对象使用此堆内存时,该整形值 +1;反之,每当使用此堆内存的对象被释放时,该整形值减 1。当堆空间对应的整形值为 0 时,即表明不再有对象使用它,该堆空间就会被释放掉。

  •         std::shared_ptr 和 unique_ptr、weak_ptr 不同之处在于,多个 shared_ptr 智能指针可以共同使用同一块堆内存。并且,由于该类型智能指针在实现上采用的是引用计数机制,即便有一个 shared_ptr 指针放弃了堆内存的“使用权”(引用计数减 1),也不会影响其他指向同一堆内存的 shared_ptr 指针(只有引用计数为 0 时,堆内存才会被自动释放)。
  •         std::weak_ptr 定位为智能指针的一种,但该类型指针通常不单独使用(没有实际用处),只能和 shared_ptr 类型指针搭配使用。甚至于,我们可以将 weak_ptr 类型指针视为 shared_ptr 指针的一种辅助工具,借助 weak_ptr 类型指针, 我们可以获取 shared_ptr 指针的一些状态信息,比如有多少指向相同的 shared_ptr 指针、shared_ptr 指针指向的堆内存是否已经被释放等等。需要注意的是,当 weak_ptr 类型指针的指向和某一 shared_ptr 指针相同时,weak_ptr 指针并不会使所指堆内存的引用计数加 1;同样,当 weak_ptr 指针被释放时,之前所指堆内存的引用计数也不会因此而减 1。也就是说,weak_ptr 类型指针并不会影响所指堆内存空间的引用计数。除此之外,weak_ptr 模板类中没有重载 * 和 -> 运算符,这也就意味着,weak_ptr 类型指针只能访问所指的堆内存,而无法修改它。
  •         std::unique_ptr 指针自然也具备“在适当时机自动释放堆内存空间”的能力。和 shared_ptr 指针最大的不同之处在于,unique_ptr 指针指向的堆内存无法同其它 unique_ptr 共享,也就是说,每个 unique_ptr 指针都独自拥有对其所指堆内存空间的所有权。这也就意味着,每个 unique_ptr 指针指向的堆内存空间的引用计数,都只能为 1,一旦该 unique_ptr 指针放弃对所指堆内存空间的所有权,则该空间会被立即释放回收。

2、特征提取

2.1 ORB特征点

        特征点是由关键点(keypoint) 和描述子(descriptor),关键点是描述特征点在图像中的位置,描述子用来量化描述该关键点周围像素的信息。

        ORB特征点的关键点是Oriented-FAST,描述字是Steered BRIEF。

2.1.1 Oriented-FAST

2.1.2 Steered BRIEF

2.2 特征点均匀化

        OpenCV的ORB特征提取方法存在一个问题,就是特征点往往集中在纹理丰富的区域,而在缺乏纹理的区域提取到的特征点的数量会少很多。会带来特征点冗余的问题(一个小区域一个特征点可以表示清楚,而提取到了十个特征点,导致其余9个多余)和影响位姿的解算(特征点在空间中分布的层次越多,越均匀,特征匹配越能精确的表达出空间的几何关系)。

2.2.1 四叉树实现特征点均匀化分布

3、特征匹配

3.1 单目初始化中的特征匹配

        核心思想是在第一帧特征点坐标\left ( x_1,y_1 \right )对应的第2帧中\left ( x_1,y_1 \right )位置的附近画一个圆,匹配点是落在这个圆内。通过划分网格的方法(在院内华裔对正方形网格,再进行特征匹配时,先检测网格内是否有特征点,没有特征点就跳过,有的话就对内部的特征点进行检测),加快特征匹配的过程。

3.2 通过词袋进行特征匹配

3.3 通过地图点投影进行特征匹配

3.4 通过sim(3)变换进行特征匹配

你可能感兴趣的:(c++,开发语言)