目录

1、整体流程

2、代码实现

3、探讨与思考

4、参考文献


相关链接

VINS_MONO系列:(一)总体框架_Derrr...的博客-CSDN博客_vins框架

VINS_MONO系列:(二)IMU预积分详细推导_Derrr...的博客-CSDN博客

VINS_MONO系列:(三)VIO初始化_Derrr...的博客-CSDN博客

VINS_MONO系列:(四)紧耦合VIO实现_Derrr...的博客-CSDN博客

VINS_MONO系列:(五)前端特征提取_Derrr...的博客-CSDN博客

1、整体流程

VINS_MONO的前端的实现较为简单,核心的内容包括利用cv::goodFeaturesToTrack提取关键点,利用cv::calcOpticalFlowPyrLK对前后帧的关键点进行光流跟踪。

真个前端特征提取的流程如图1所示,回调函数接受到图像数据后会先对图像数据转化为opencv的格式,然后再传入FeatureTracker类中进行处理。处理完以后会更新图像中关键点的id,主要是更新新提取出来的关键。最后将特征提取的结果发布出去,这里发布的数据包括当前帧提取到的关键点的id、速度(图像坐标系下的)、像素坐标和归一化坐标等。

FeatureTracker类主要实现图像关键点的提取、关键点的跟踪以、outlier剔除以及关键点补充等功能。关键点跟踪运用的是金字塔光流跟踪,通过直接调用cv::calcOpticalFlowPyrLK实现。光流跟踪后会利用基础矩阵F对外点进行剔除。剔除外点后,会通过cv::goodFeaturesToTrack来补充新的关键点。最后,计算能实现前后帧追踪关键点的速度。

图1 整体流程

2、代码实现

这里主要列举几个比较主要的函数

void FeatureTracker::readImage(const cv::Mat &_img, double _cur_time)
{cv::Mat img;TicToc t_r;cur_time = _cur_time;//如果EQUALIZE=1,表示太亮或太暗,进行直方图均衡化处理if (EQUALIZE){//自适应直方图均衡cv::Ptr<cv::CLAHE> clahe = cv::createCLAHE(3.0, cv::Size(8, 8));TicToc t_c;clahe->apply(_img, img);ROS_DEBUG("CLAHE costs: %fms", t_c.toc());}elseimg = _img;if (forw_img.empty()){//如果当前帧的图像数据forw_img为空,说明当前是第一次读入图像数据//将读入的图像赋给当前帧forw_img,同时还赋给prev_img、cur_imgprev_img = cur_img = forw_img = img;}else{//否则,说明之前就已经有图像读入,只需要更新当前帧forw_img的数据forw_img = img;}//此时forw_pts还保存的是上一帧图像中的特征点,所以把它清除forw_pts.clear();if (cur_pts.size() > 0){TicToc t_o;vector<uchar> status;vector<float> err;//调用cv::calcOpticalFlowPyrLK()对前一帧的特征点cur_pts进行LK金字塔光流跟踪,得到forw_pts//status标记了从前一帧cur_img到forw_img特征点的跟踪状态,无法被追踪到的点标记为0cv::calcOpticalFlowPyrLK(cur_img, forw_img, cur_pts, forw_pts, status, err, cv::Size(21, 21), 3);//将位于图像边界外的点标记为0for (int i = 0; i < int(forw_pts.size()); i++)if (status[i] && !inBorder(forw_pts[i]))status[i] = 0;//根据status,把跟踪失败的点剔除//不仅要从当前帧数据forw_pts中剔除,而且还要从cur_un_pts、prev_pts和cur_pts中剔除//prev_pts和cur_pts中的特征点是一一对应的//记录特征点id的ids,和记录特征点被跟踪次数的track_cnt也要剔除reduceVector(prev_pts, status);reduceVector(cur_pts, status);reduceVector(forw_pts, status);reduceVector(ids, status);reduceVector(cur_un_pts, status);reduceVector(track_cnt, status);ROS_DEBUG("temporal optical flow costs: %fms", t_o.toc());}//光流追踪成功,特征点被成功跟踪的次数就加1//数值代表被追踪的次数,数值越大,说明被追踪的就越久for (auto &n : track_cnt)n++;//PUB_THIS_FRAME=1 需要发布特征点if (PUB_THIS_FRAME){//通过基本矩阵剔除outliersrejectWithF();ROS_DEBUG("set mask begins");TicToc t_m;setMask();//保证相邻的特征点之间要相隔30个像素,设置maskROS_DEBUG("set mask costs %fms", t_m.toc());ROS_DEBUG("detect feature begins");TicToc t_t;//计算是否需要提取新的特征点int n_max_cnt = MAX_CNT - static_cast<int>(forw_pts.size());if (n_max_cnt > 0){if(mask.empty())cout << "mask is empty " << endl;if (mask.type() != CV_8UC1)cout << "mask type wrong " << endl;if (mask.size() != forw_img.size())cout << "wrong size " << endl;cv::goodFeaturesToTrack(forw_img, n_pts, MAX_CNT - forw_pts.size(), 0.01, MIN_DIST, mask);}elsen_pts.clear();ROS_DEBUG("detect feature costs: %fms", t_t.toc());ROS_DEBUG("add feature begins");TicToc t_a;//添将新检测到的特征点n_pts添加到forw_pts中,id初始化-1,track_cnt初始化为1.addPoints();ROS_DEBUG("selectFeature costs: %fms", t_a.toc());}//当下一帧图像到来时,当前帧数据就成为了上一帧发布的数据prev_img = cur_img;prev_pts = cur_pts;prev_un_pts = cur_un_pts;//把当前帧的数据forw_img、forw_pts赋给上一帧cur_img、cur_ptscur_img = forw_img;cur_pts = forw_pts;//根据不同的相机模型去畸变矫正和转换到归一化坐标系上,计算速度undistortedPoints();prev_time = cur_time;
}

3、探讨与思考

4、参考文献

[1] Tong Q ,  Li P ,  Shen S . VINS-Mono[J]. IEEE Transactions on Robotics, 2018.

VINS_MONO系列:(五)前端特征提取相关推荐

  1. 盘点2013年那些最优秀的网页设计作品【系列五】

    这个系列的文章向大家展示2013年最优秀的国外网页设计作品,这些都是过去的一年在图片,纹理,导航等等各个方面的优秀网站.2013年,网页设计领域出现了几个新的流行趋势,最热门的就是响应式设计(Resp ...

  2. CSS 魔法系列:纯 CSS 绘制各种图形《系列五》

    我们的网页因为 CSS 而呈现千变万化的风格.这一看似简单的样式语言在使用中非常灵活,只要你发挥创意就能实现很多比人想象不到的效果.特别是随着 CSS3 的广泛使用,更多新奇的 CSS 作品涌现出来. ...

  3. 【Youtobe trydjango】Django2.2教程和React实战系列五【python shell操作models模型】

    [Youtobe trydjango]Django2.2教程和React实战系列五[python shell操作models模型] 1. 用python shell查询新增models对应的数据 2. ...

  4. python解复杂方程_Python数据处理篇之Sympy系列(五)---解方程

    前言 sympy不仅在符号运算方面强大,在解方程方面也是很强大. 本章节学习对应官网的:Solvers 官方教程 (一)求解多元一次方程-solve() 1.说明: 解多元一次方程可以使用solve( ...

  5. 《ASP.NET Core In Action》读书笔记系列五 ASP.NET Core 解决方案结构解析1

    <ASP.NET Core In Action>读书笔记系列五 ASP.NET Core 解决方案结构解析1 参考文章: (1)<ASP.NET Core In Action> ...

  6. Silverlight Blend动画设计系列五:故事板(StoryBoards)和动画(Animations)

    原文:Silverlight & Blend动画设计系列五:故事板(StoryBoards)和动画(Animations) 正如你所看到的,Blend是一个非常强大的节约时间的设计工具,在Bl ...

  7. 最佳实践系列:前端代码标准和最佳实践

    最佳实践系列:前端代码标准 @窝窝商城前端(刘轶/李晨/徐利/穆尚)翻译于2012年 版本0.55 @郑昀校对 isobar的这个前端代码标准和最佳实践文档,涵盖了Web应用开发的方方面面,我们翻译了 ...

  8. 数学之美系列五 -- 简单之美:布尔代数和搜索引擎的索引

    数学之美系列五 -- 简单之美:布尔代数和搜索引擎的索引 [建立一个搜索引擎大致需要做这样几件事:自动下载尽可能多的网页:建立快速有效的索引:根据相关性对网页进行公平准确的排序.我们在介绍 Googl ...

  9. 智能路由器-OpenWRT 系列五 (NAS-SMB家庭共享)

    NAS是我觉得家里必不可少的一台设备,NAS 全称 Network Attached Storage,即网络附加存储服务器,它通过自身的操作系统和 SMB/NFS/CIFS/FTP 等多种通信协议来给 ...

最新文章

  1. 配置tomcat虚拟主机
  2. 英文文献中的一些单词
  3. 文巾解题 2. 两数相加
  4. luogu P4725 多项式对数函数 (模板题、FFT、多项式求逆、求导和积分)
  5. wxWidgets:wxDataViewCtrl类用法
  6. C语言实现hash/adler32算法(附完整源码)
  7. SQL Server 数据库的整理优化的基本过程(三)
  8. navicat 备份 mysql 报错 1548 cannot load mysql.proc
  9. c# winform 打印 窗体 及 窗体控件内容 的 初级尝试
  10. python自动获取北京时间_python实现定时同步本机与北京时间的方法
  11. linux实验的试验环境,Linux基本环境_实验日志解析.docx
  12. 【项目管理】项目管理四要素
  13. 基于TILE-GX实现快速数据包处理框架-netlib实现分析
  14. 通达信波段王指标公式主图_通达信波段操盘主图指标公式
  15. tiff与GDAL笔记
  16. 局域网内帆软BI使用arcgis发布的wms服务
  17. 社群运营中品牌化和IP化运营实践
  18. python中变量无须先创建和赋值而直接使用_python综合练习1
  19. 虚幻4混合空间动画蓝图
  20. 银行应构建主动式客户体验管理体系,助力客户价值增长

热门文章

  1. 进入SeekTiger创世节点,以开启你的元宇宙之旅
  2. 模拟开关(CD4051B、CD4052B)介绍与应用
  3. wine gigaget(迅雷国际版)
  4. 在线音乐玩儿三国杀,一统天下为时尚早
  5. c语言编写http服务器
  6. 从三季报中读浙商银行的金融服务价值
  7. 【五一创作】智能手机还是不够智能?这些事情交给自动化来做吧:3、打造自己掌控的AI语音助理
  8. 自媒体配音素材怎么找?4个办法教你
  9. (1) IOS笔记本——第一个IOS小游戏----猜图游戏
  10. dotnetty java netty,DotNetty发送请求的最佳实践