SVO代码笔记

本文详细介绍了SVO(Semi-Direct Visual Odometry)的实现过程,重点关注了帧间光流跟踪、图像对齐、特征匹配和位姿优化等关键步骤。通过对frame_handler_mono.cpp的分析,揭示了SVO如何利用光流计算、RANSAC和BA方法来估计相机运动,并在帧间和帧与地图之间进行重投影。同时,文中提到了SVO在关键帧选取、跟踪质量评估等方面的策略。
摘要由CSDN通过智能技术生成

主要是frame_handler_mono.cpp

关于ros部分不了解.

做的笔记主要来方便保存,不定正确....

主要目的还是想代码 论文结合的整明白.

initialize:

  1.快速的特征检测:返回相机分辨率的宽度,高度,格子数,金字塔层数
  2.边的检测:相同
  3.这是一个绑定函数.(对boost不了解)

  4.深度滤波线程


addImage:
  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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值