主要是frame_handler_mono.cpp
关于ros部分不了解.
做的笔记主要来方便保存,不定正确....
主要目的还是想代码 论文结合的整明白.
initialize:
1.快速的特征检测:返回相机分辨率的宽度,高度,格子数,金字塔层数2.边的检测:相同
3.这是一个绑定函数.(对boost不了解)
4.深度滤波线程
1.添加一张图像.
2.判断启动程序是否启动.
3.清理一些离的更近的关键帧.
4.清理所有具有重叠视野的关键帧.
5.创建新的帧
5.判断帧的类型并根据类型进行相应的操作.
6.如果当前状态判断为第二帧
6.1返回第一二关键帧由单映性估计出的Pose的参考帧keypoints坐标集
6.2返回第一二关键帧由单映性估计出的Pose的当前帧被追踪的keypoints坐标集
6.3返回第一二关键帧由单映性估计出的Pose的特征点类型
6.4迭代器的遍历 遍历当前帧和参考帧的特征点
6.5如果type为1(代表什么?) 画红线 否则画绿线
7.如果当前状态不是第二帧
7.1 判断是否为关键帧 如果是,变为蓝色 如果不是 为绿色
7.2 迭代器的遍历 遍历此帧
7.3 判断此帧特征类型为边还是点
8.显示 end debug
9.将新来的帧赋予last_frame_
10.判断新来帧为关键帧并且将已将此帧赋予last_frame_ 则将新来帧重置.
11.调用finishFrameProcessingCommon成员函数
11.1
processFirstFrame()
1.新建一个新来帧的变换矩阵T_f_w_表示从世界坐标到相机?(Transform (f)rame from (w)orld)2.对new_frame_新来帧调用初始化类中的addFirstFrame成员函数判断是否为initialization::FAILURE,如果是则结束,并返回RESULT_NO_KEYFRAME.
2.1addFirstFrame成员函数 先进行reset()成员函数,清理参考帧keypoints点集,重置参考帧.
2.2 调用detectFeatures成员函数 对输入的帧 也就是new_frame_帧进行Fast特征检测.输出为对应特征点位置和单位方向向量
2.2.1 调用feature_detection::FastDetector detector, FastDetector又包含了抽象检测AbstractDetector主要是将图像分为格子,将特征分散
2.2.2detector.detect 对每层金字塔都进行fast特征检测选择一些得分高的角点放入new_features.
2.2.3 与2.2.1类似 变成对特征类型为边而已
2.2.4 与2.2.2类似
2.2.5 对new_features遍历 返回特征位置和对应的特征单位方向向量
3.经过第二步,如果继续,就可以判断此帧为关键帧,设为关键帧.
3.1 点开setKeyframe,里面是setKeyPoints (这些点用于快速检测是否两个帧有重叠的视野,选取5个特征,一个在图像中点另外4个靠近图像的4个边角,并且这5个特征都要有对应的3D点)
3.2 再点开setKeyPoints,如果特征指向的3D点为空,则设置该特征为NULL.再通过调用checkKeyPoints函数,对当前图像中每个特征点进行遍历比较,最终选出最具有代表性的5个作为关键点。实质上是1个靠近图像中心的点和4个靠近图像四个角的点.
4.不知道为啥我的addKeyframe点不进去...
5.stage_设为second_frame
6.将信息"Init: Selected first frame."记录在日志
7.返回 result_is_keyframe.
processSecondFrame
1.调用initialization.cpp中addSecondFrame函数返回一个初始化结果.
1.1调用tracklt,第一帧确定好了之后,然后通过金字塔Lucas-Kanade光流方法计算前期特征的光流(稀疏光流),具体使用OpenCV的方法calcOpticalFlowPyrLK
1.1.1 创建cv::TermCriteria类型变量termcrit(用于设置迭代算法终止条件)最大迭代次数和所期望的精度,两个加起来一个满足即可.
1.1.2 Opencv中LK法,具体构造函数(
img_prev 帧与帧之间的传递?
frame_cur->img_pyr_[0] 当前帧图像的金字塔
px_prev, //被跟踪特征点(上帧)坐标集合
px_cur, //当前帧特征点坐标集合
status,//输出状态向量status,用于表示每个特征是否被找到,找到就置1
error,//输出错误向量error,用于表示每个特征的错误(距离误差)。
cv::Size2i