自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Fearless的博客

好好学习 天天向上

  • 博客(55)
  • 资源 (4)
  • 收藏
  • 关注

原创 LLVM与Clang

随着 Android P 的逐步应用,越来越多的客户要求编译库时用 libc++ 来代替 libstdc++。libc++ 和 libstdc++ 这两个库有关系呢?它们两个都是 C++ 标准库,libc++ 是针对 Clang 编译器特别重写的 C++ 标准库,而 libstdc++ 则是 GCC 的对应 C++ 标准库了。从 Android 市场来说,Android NDK 已在具体...

2020-02-20 20:21:50 540

转载 GCC与gcc,g++的区别

本文转载。其实在这之前,我一直以为gcc和g++是一个东西,只是有两个不同的名字而已,今天在linux下编译一个c代码时出现了错误才找了一下gcc和g++的区别。先描述一下今天遇到的错误:因为以前写程序的时候,写的都是cpp文件,然后就直接使用g++编译,没出错,也就没有在意过这些问题,今天有一个c文件,但里面包含后STL中的vector语法,想着使用gcc来编译,结果报错了,报错是:...

2020-02-20 18:49:34 633

原创 ORBSLAM2学习之LoopClosing线程

LoopClosing线程的逻辑关系也比较简单,基本上看对应的类即可,这次只是放下该线程的流程图其中闭环检测候选帧的流程如下:

2018-08-30 20:37:15 1073

原创 ORBSLAM2学习之LocalMapping线程

LocalMapping线程的整个过程其实都在对应的文件中,之前已经分析过LocalMapping的源码,因此这里就只放一个流程图就好了。其他的代码部分详见:https://blog.csdn.net/u012936940/article/details/81784080...

2018-08-29 16:18:41 746

原创 ORBSLAM2学习之Tracking线程

        之前阅读了ORBSLAM2代码的各个类,对整个代码的功能有了了解,接下来整理下几个线程的逻辑,这样才能更清晰,计划是用文字书写,其实原本用流程图更加合适一些,不过简单画了下发现很花时间,还是以后闲了再化成图吧。ORBSLAM共有四个线程,分别是Tracking主线程,LocalMapping线程,LoopClosing线程和观测窗口线程,其中Tracking线程运行在主循环中,...

2018-08-27 23:23:36 2036 1

原创 ORBSLAM2源码学习(10) Optimizer类

应该是到最后一个类了。。。先代码后总结。整体参考了网络上吴博大佬的注释,感谢!#include "Optimizer.h"#include "Thirdparty/g2o/g2o/core/block_solver.h"#include "Thirdparty/g2o/g2o/core/optimization_algorithm_levenberg.h"#include "Thir...

2018-08-25 21:41:12 2815 2

原创 ORBSLAM2源码学习(9) LoopClosing类

该类负责闭环的检测和校正,逻辑关系比较简明while(1){ // Check if there are keyframes in the queue // Loopclosing中的关键帧是LocalMapping发送过来的,LocalMapping是Tracking中发过来的 // 在LocalMapping中通过InsertKeyFram...

2018-08-18 23:01:36 1080

原创 ORBSLAM2源码学习(8) LocalMapping类

最近有点事博客更新断了几天,接下来争取一次性更完。LocalMapping这个类维护了一个局部地图,对关键帧进行处理、地图点检查剔除、生成新地图点。还是先上代码再总结。#include "LocalMapping.h"#include "LoopClosing.h"#include "ORBmatcher.h"#include "Optimizer.h"#include<mu...

2018-08-17 22:51:08 1015

原创 ORBSLAM2源码学习(7) Initializer类

Initializer类主要负责SLAM系统的初始化,在ORB中初始化非常重要,好的初始化是系统后续更少出错的基础。以单目为例,ORB中创建了一个初始化器,负责初始化工作。void Tracking::MonocularInitialization(){ // 如果单目初始化器还没有被创建,则创建单目初始化器 if(!mpInitializer) { ...

2018-08-04 20:42:19 1447

原创 ORBSLAM2源码学习(6) ORBmatcher类

还是先上代码再放总结#include "ORBmatcher.h"#include<limits.h>#include<opencv2/core/core.hpp>#include<opencv2/features2d/features2d.hpp>#include "Thirdparty/DBoW2/DBoW2/FeatureVector.h"...

2018-08-04 00:04:00 2604 2

原创 ORBSLAM2源码学习(5) KeyFrame类

先上代码,再做总结#ifndef KEYFRAME_H#define KEYFRAME_H#include "MapPoint.h"#include "Thirdparty/DBoW2/DBoW2/BowVector.h"#include "Thirdparty/DBoW2/DBoW2/FeatureVector.h"#include "ORBVocabulary.h"#inc...

2018-07-29 00:19:58 1792

原创 ORBSLAM2源码学习(4) MapPoint类

真的是愤怒了,写了半天一按发表突然出现个空白的写博客界面???写半天啥都没了???你不是每隔一会自动保存呢?我真的是无语#ifndef MAPPOINT_H#define MAPPOINT_H#include"KeyFrame.h"#include"Frame.h"#include"Map.h"#include<opencv2/core/core.hpp>#inc...

2018-07-28 22:12:03 2088

原创 C++ bind2nd用法

bind1st和bind2nd是将二元函数转换为一元函数,比如一个比较大小的函数是二元函数,当在某些情况下我们想要固定第一个参数或者第二个参数时吗,就成了一元函数,先看用法// Created by 开机烫手 on 2018/7/24.#include <iostream>#include <algorithm>#include <vector>...

2018-07-24 22:15:26 11147 5

原创 ORBSLAM2源码学习(3) Map类和KeyFrameDataBase类

将这两个类放在一起是因为代码都比较短,比较容易理解,否则一个类单独一篇那恐怕要写好久了...1.Map类Map类管理整个地图,因此其具有的属性是所有的地图点和关建针,即普通的帧是不管的,另外还有一些帧编号之类的东西,该类具有添加、删除关键帧的方法和添加、删除地图点的方法,另外就是一个返回属性的函数。直接上代码了。#ifndef MAP_H#define MAP_H#includ...

2018-07-24 16:52:11 1355

原创 ORBSLAM2源码学习(2)Frame类

      这次是Frame类,Frame类应该可以说是SLAM系统中处理的一个基本单元,它将一副(或双目)图像包装成一个类,给他增加基本的信息,如这幅图的位姿、编号、特征点、对应的参考帧等重要信息,还包含一些设置参数、获取参数的方法。是SLAM的基本数据单元,直接上代码Frame.h#ifndef FRAME_H#define FRAME_H#include<vector&...

2018-07-20 22:49:54 3332

原创 ORBSLAM2源码学习(1)ORBextractor

      关于ORBSLAM2的学习已经有一段时间了,开始是照着网上各路大神的博客,对着代码梳理了下流程,算是对这个代码的工作过程有了个了解,接下来详细阅读源码,学习各部分的具体实现。这部分是特征点的提取和描述子的计算。       ORBSLAM使用的是ORB特征,即Oriented FAST and Rotated BRIEF,是对FAST特征点与BREIF特征描述子的一种结合与改进。关...

2018-07-19 22:56:49 4969

原创 STL中的iterator traits

有时候我们可能会需要知道迭代器的某些具体有关类型,如:迭代器所指对象的类型,两个迭代器之间距离的类型,迭代器解引用操作结果的类型,迭代器->操作结果的类型,以及迭代器本身的类型(单向,双向等)。因此,不同容器的迭代器都必须支持对上述迭代器有关类型的查询反馈,STL则采用内嵌类型声明的方式来实现对上述类型的返回。其中:value_type : 迭代器所指对象类型difference_t...

2018-07-19 21:54:28 394

原创 C++中的delete和delete[ ]的区别

以前看书的时候,书上说使用new申请的内存,释放时用delete,使用new [ ]申请的内存释放时要用delete [ ]才行,这两个一定要记住,申请时用了方括号,则释放时也要加上方括号,否则就会出错。但是并没有解释为什么这样,会出什么错。今天正好看到这个,记录下。关于动态申请的内存,分两种情况:基本数据类型的分配和自定义数据类型的分配。两者不同。1、基本数据类型 对于基本数据类型,假如有如下代...

2018-07-04 23:24:00 70903 15

转载 线性方程组的解

贴两个大佬们的总结,感谢大佬!1.[数学]线性方程组的解、SVD2.线性方程组什么时候无解?多个解?唯一解?

2018-06-21 00:26:38 602

原创 对极几何及单应矩阵

1.本质矩阵用两个相机在不同位置拍摄同一物体,两张照片中的景物有重叠部分,那么理论上这两张照片会存在一定的对应关系,本节任务是探索如何描述他们之间的对应关系--对极几何,属于立体视觉的部分。关于相机成像模型等部分这里不多介绍,默认理解这部分知识。首先来看几个基本概念图中的概念有:极点e:分别是左边相机中心在右图像平面上的像,右相机中心在左像平面上的像。极平面:两个相机中心和空间中某店p形成的平面。...

2018-06-18 13:34:09 6245 4

原创 快速排序的几个优化

快排代码的第一句便是选取基准点,此后数据的移动根据这个基准点的大小进行调整,如果基准点选取的不好,将会导致快排的效率低下,经过测试,普通的快排算法针对(1)近乎有序的数列;(2)含有大量重复数据的数列;这两种情况时效率将会变得非常低,针对这些情况,经过适当的优化可以使快排达到很高的效率。1.三数取中法和随机交换法快排将选取的基准点经过调整放到合适的位置,之后将这个基准点左右两边的区间分别递归的进行...

2018-05-06 13:08:19 3775

原创 快速排序

看到一篇讲快排比较容易理解的文章,实在佩服!快速排序是另一种排序算法,不像希尔排序,堆排序那样,要么以发明的人的名字命名,要么以使用的数据结构或特点命名,而快速排序直接嚣张的命名为快速排序!而实际上,快速排序确实是几个复杂度为O(nlogn)的排序算法中效率最高的一种,自然也就敢如此霸气的命名了。快速排序的思想是:1.先从数组中取出一个数作为基准数。2.分区:将比这个数大的数全部放到它的右边,比他...

2018-05-05 12:59:39 222

原创 归并排序的优化

1.合并代码的优化上节中的数组合并代码中,没有做任何判断就进行了数组的合并,实际上当数组1的最后一个元素小于数组2的第一个元素时,根本不需要挨个对比、复制元素进行合并操作,此时数组1和数组2本来就是有序的,不需要合并,因此代码改为(部分代码)MergeSort1(list1, listSize1);MergeSort1(list2, listSize2);if (list1[listSize1...

2018-04-30 16:30:30 611 1

原创 归并排序

思想归并排序是建立在归并操作上的一种排序算法,该算法是采用分治法的典型应用。算法的目的是将长的无序数列递归的划分成小的数列,对小的数列进行排序后再进行合并操作,最终完成整个数列的排序。这么说有点粗略了,下面看详细步骤。有序数列的合并操作假设一个数组共8个元素,其中左右两组分别已经排好序了,下面看如何进行合并排序成一个大的数组a.对于合并的步骤,需要借用一个临时存储空间,该空间大小等于待合并的两个数...

2018-04-29 17:11:20 135

原创 堆排序

基本概念堆排序是指利用堆这种数据结构进行排序的排序算法,堆排序是一种选择排序,最好、最坏,平均时间复杂度均为O(nlogn)。堆:堆是具有以下性质的完全二叉树:当其每个结点的值都大于或等于其左右孩子结点的值时,称为大顶堆;当其每个结点的值都小于或等于其左右孩子结点的值时,称为小顶堆。如下图所示以大顶堆为例,对堆中的结点按层进行编号,从0开始,那么将这种结构按顺序写入数组中就是下图中的样子则大顶堆及...

2018-04-28 16:44:00 204

原创 插入排序和希尔排序

插入排序思想:插入排序的思想是将一个无需的数列中的数据挨个插入到一个已经有序的数列中,使得插入后原本有序的数列依然有序,最终完成整个数列的排序。在实际的排序过程中,“已经有序的数列”指的是数列中被拍好序的部分。考虑对下图的数组进行插入排序:首先考虑6这个元素,因为第一个元素8只有它自己,是已经排好序的。考虑6时将6这个元素插入到有序部分“8”中,6应该在8的前面,因此这一步结束后数组为接下来考虑2...

2018-04-21 16:49:32 188

原创 冒泡排序和选择排序

两个比较简单的排序算法就放到一起写了1.冒泡排序1.1思想冒泡排序的思想是比较两两相邻的关键字,如果反序则进行交换,直到没有反序的为止。设想一个数组按照升序排列,经过第一轮比较之后最大的数就被放在最后了,因此剩下的比较中就不需要将它再参与进来,第二轮比较中第二大的数据被放在了倒数第二的位置,它的位置也就股定了,也不需要参与剩余的比较。因此我们需要两层循环,外层循环控制比较的轮数,和数组元素的个数有...

2018-04-18 20:14:40 18856 3

原创 Eigen学习(九)稠密问题之线性代数和分解

本节介绍如何求解线性系统,计算几种分解,比如LU,QR,SVD等。基本的线性求解问题:假设有一个系统方程写成如下矩阵的形式其中A,b是矩阵,b也可以是向量,当想要求解x时,可以选择多种分解方式,取决于矩阵A的形式以及考虑的速度和精度,下面是一个简单的例子#include <iostream>#include <Eigen/Dense>using namespace st...

2018-04-09 20:46:11 12189 1

原创 Eigen学习(八)几何模块的实践

    Eigen的几何模块用来表达空间的旋转、平移等变换。3维空间中刚体的运动有六个自由度,分别是绕3个轴的旋转运动和沿着3个轴的平移运动。对于旋转可以用3x3的旋转矩阵R表示,旋转矩阵描述了刚体经过矩阵作用后的姿态信息,旋转矩阵是一个正交矩阵;然而旋转矩阵有9个参数,9个参数描述6自由度的旋转,有点冗余了。因此旋转还可以用旋转向量来表示,空间中物体的旋转可以看作是绕这某个轴转过一定的角度完成,...

2018-04-08 19:59:48 2323

原创 Eigen学习(七)规约、迭代和广播

规约Eigen中规约是指对一个矩阵或数组操作并返回一个标量的函数,常用的是sum()方法,返回矩阵或数组的所有元素的和。#include <iostream>#include <Eigen/Dense>using namespace std;int main(){ Eigen::Matrix2d mat; mat << 1, 2, ...

2018-04-07 17:05:46 8356

原创 图(一)

1.概念1.1一些定义图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为G(V,E),G表示一个图,V是图中顶点的集合,E是图G中边的集合。注:线性表中的数据叫元素;树中叫结点;图中称为顶点(Vertex)。线性表中可以没有元素,树中可以没有结点,但图中不能没有顶点,可以没有边。无向边:顶点Vi和Vj之间的边没有方向,成这条边为无向边,用(Vi,Vj)表示。无向图:图中任意两...

2018-04-06 22:41:17 2298

原创 Eigen学习(六)高级初始化

本节介绍几个初始化矩阵的高级方法,会更具体的介绍逗号初始化的方法。同样会介绍如何得到特殊矩阵比如单位矩阵和零矩阵等。逗号初始化Eigen提供了一个逗号初始化方法可以让使用者方便的设置矩阵、向量及数组的所有元素。简单的列出所有的元素,从左上角开始,从左至右,从上到下即可,当然前提是指定对象的尺寸,如果输入的数据少了或者多了,Eigen会报错的。Matrix3f m;m << 1, 2,...

2018-04-05 23:47:16 44040 2

原创 Eigen学习(五)块操作

这节介绍块操作的必要性。块指的是矩阵或数组中的一个矩形区域,块表达式可以用于左值或者右值,同样不会耗费运行时间,由编译器优化。使用块操作Eigen中最常用的块操作是block()方法,共有两个版本Block operationVersion constructing a dynamic-size block expressionVersion constructing a fixed-size b...

2018-04-04 00:05:23 17507

原创 Eigen学习(四)Array类和元素级操作

Array类提供了和Matrix不同的操作,Matrix主要为了线性代数而设计,而Array类是通常用的数组。Array类提供了更方便的元素级的操作,但是没有线性代数方面的意义,比如给每个元素的值加上一个常数或按照元素相乘两个array对象。ArrayArray模板类的参数同Matrix类相同,前三个参数同样是Array<typename Scalar, int RowsAtCompileT...

2018-04-02 23:24:02 10021 2

原创 Eigen学习(三) 矩阵和向量的运算

继续翻译,原文链接:http://eigen.tuxfamily.org/dox/group__TutorialArrayClass.html这一节主要介绍如何在Eigen中实现矩阵、向量及标量之间的运算。Eigen提供了一些矩阵和向量的数值运算,其中一些是通过通用的C++运算符重载实现,如+,-,*等,另一些通过特殊的方法实现,如dot(),cross()等方法。对于Matrix类,这些操作只支...

2018-04-01 22:27:19 22640

原创 二叉树的创建和遍历

1.概念二叉树是树结构的一种,规定每个结点最多有两棵子树,所以二叉树中不存在度大于2的结点。注:不是都需要两棵子树,而是最多!二叉树的左子树和右子树是有顺序的,不能颠倒,颠倒了那就是不同的树,即使只有一个子树也是要区分顺序的,如下是两个完全不同的二叉树二叉树存在以下五种基本形态满二叉树:如果所有分支结点都存在左子树和右子树,并且所有叶子都在同一层上,即上图中最右边那个树,只有最下一层是叶子。完全二...

2018-03-31 21:14:11 238

原创 Eigen学习(二)

本文算是对官网手册的翻译吧,参考:http://eigen.tuxfamily.org/dox/group__TutorialMatrixClass.htmlMatrix类在Eigen中,所有的矩阵和向量都是Matrix模板类的对象,向量只是特殊的矩阵而已,无论是行向量还是列向量。Matrix类共有6个模板参数,主要使用的是前三个参数,剩余的都有默认值,前三个参数分别是Matrix<type...

2018-03-27 00:33:12 2138 1

原创 Eigen学习(一)

参考:http://eigen.tuxfamily.org/dox/group__QuickRefPage.htmlhttp://eigen.tuxfamily.org/dox/GettingStarted.html1.简介Eigen是有关线性代数计算的C++模板库,里面还包含了基本的矩阵、数组的定义和使用,以及矩阵的各种分解、特征值、特征向量、行列式的计算。基本涵盖了各种需要对矩阵的操作,可以说...

2018-03-25 23:20:20 1888

原创 指向数组的指针

1.指针数组和数组指针的概念指针数组:指针数组是一个数组,是指由指针构成的数组,在这个数组中的所有元素都是指针,每个指针占用相同的字节。数组指针:数组指针是一个指针,是指一个数组的指针,数组两字表示这个指针指向一个数组的首地址,并且这个指针加1时移动的位置是整个数组的长度。2.指针数组一个可行的指针数组定义如下:char *arr[4] = {"hello", "world", "xiang", ...

2018-03-24 16:17:39 8527 4

原创 C++中的递归

1.概念        递归函数即自调用函数,在函数内部直接的或者间接地调用自己。在求解某些具有随意性的复杂问题时经常使用递归,如要求编写一个函数,将输入的任意长度的字符串反向输出。普通做法是将字符串放入数组中然后将数组元素反向输出即可,然而这里的要求是输入是任意长度的,总不能开辟一个很大的空间保存字符串吧?这时候递归就起作用了。递归采用了分治的思想,将整体分割成部分,从最小的基本部分入手,逐一解...

2018-03-23 23:07:15 43273 5

第一本无人驾驶技术书

第一本无人驾驶技术书,本书介绍了无人驾驶行业当前的发展情况以及所需的技术简介,适合刚接触的人作为参考入门学习

2018-05-02

C程序设计语言

c语言经典书籍,c语言的圣经

2017-01-17

单片机教程

学习单片机,适合初学者学习单片机,适合初学者学习单片机,适合初学者学习单片机,适合初学者

2013-11-24

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除