视觉SLAM十四讲——第八讲视觉里程计2

视觉SLAM十四讲-第八讲笔记 一、主要内容 SLAM中的视觉里程计分为两部分,一是特征点法,先提取特征点,把特征点看做三维空间中的不动点,根据特征点匹配关系进行位姿和深度估计,通过最小化重投影误差优化相机运动;二是不使用特征点,根据图像灰度直接估计的直接法。第七讲中讲了特征点法,本讲将介绍直接法。 直接法的问题 关键点的提取和描述子的构造很耗时。 忽略了特征点以外的信息。 在没有纹理或者纹理重复的地方,难以准确匹配。 解决... 阅读详情

@ 《视觉SLAM十四讲》知识点与习题

《视觉SLAM十四讲》第八讲知识点整理+习题

正在学习SLAM相关知识,将一些关键点及时记录下来。

知识点整理

本讲主要介绍了直接法来实现视觉里程计,包含光流跟踪、直接法等

  1. 特征点法的缺点:关键点的提取和描述子的计算非常耗时;使用特征点法时,忽略了特征点以外的其他特征;当相机运动到特征缺失的地方,会因为缺少纹理信息而无法找到足够的匹配点来计算相机运动
  2. 针对1中的缺陷,从关键点和描述子两个方面提出解决方案:
    1. 保留特征点,但是只计算关键点,不计算描述子,使用光流法来跟踪特征点的运动
    2. 只计算关键点,不计算描述子。且直接用直接法来计算特征点在下一时刻图像中的位置
    3. 关键点和描述子都不计算,根据像素灰度的差异,直接计算相机运动
  3. 在直接法中,不需要知道点与点之间的对应关系,而是通过最小化光度误差来求得
  4. 光流:描述像素随时间在图像之间运动的方法,跟踪同一个像素的运动过程。光流法基于灰度不变假设。可以加速基于特征点的VO算法,避免计算和匹配描述子的过程,但要求相机运动较慢(或采集频率较高)
  5. 灰度不变假设:同一个空间点的像素灰度值,在各个图像中是固定不变的。虽然这个假设很强,然而特征点法对光照就具有一定的容忍性。但是基于该假设,可以来看如何计算像素的运动
  6. Lucas-Kanade光流:稀疏光流(跟踪部分像素运动),可用于跟踪特征点位置。除了灰度不变假设,还具有以下假设:某一个窗口内的像素具有相同的运动
  7. 通过光流跟踪的特征点,用PnP,ICP或对极几何来估计相机运动
  8. 直接法:思路是根据当前相机的位姿估计值来寻找第二个图像对应的相机位姿,所以,只需要通过解一个优化问题,即采用光度误差的二范式来进行优化,由像素梯度引导优化的方向。若想要得到正确的优化结果,就必须保证大部分像素梯度能够把优化引导到正确的方向,即必须保证沿着图像梯度走时,灰度误差会不断下降
  9. 直接法的讨论:
    1. 稀疏直接法:P来自于稀疏关键点,仅使用数百个至上千个关键点,假设其周围像素是不变的。多用于快速求解相机位姿
    2. 半稠密直接法:只是用带有梯度的像素点,舍弃像素梯度不明显的地方
    3. 稠密直接法:计算所有像素,多数不能在现有的CPU上实时计算。像素梯度不明显的点,在运动估计中不会有太大贡献,在重构时也会难以估计位置。多用于构建完整地图
  10. 在直接法中,会用像素的局部梯度来近似它附近的灰度分布。只有当相机运动很小,图像中的梯度不会有很强的非凸性时,直接法才能成立。且有时会使用小的图像块,使用更复杂的差异度量方式来提高区分性

实践

  1. LK光流:使用freiburg1_room数据集进行测试,部分测试结果如图
    tracked keypoints: 2320
    在这里插入图片描述
    tracked keypoints: 1946
    在这里插入图片描述
    tracked keypoints: 1251
    在这里插入图片描述
    tracked points: 569
    在这里插入图片描述
    tracked keypoints: 59
    在这里插入图片描述
    tracked keyponts: 6
    在这里插入图片描述
    tracked points: 5
    在这里插入图片描述
    由上述结果,很明显的发现,当后来重新回到初始位置时,之前那些跟踪到过的特征点竟然也无法再被跟踪到了,当然有一个很显然的原因是后面的图片明显模糊了,第一直觉是因为相机运动变快了,这使得无法找到清晰的特征,但会不会还有其他的原因呢?仔细阅读源码
    1. 迭代100次,即总共对freiburg1_room文件夹里面的前100组depth和color图片进行光流跟踪。其中,使用associate.txt来将depth和color文件夹中的图片配对起来
    2. 仅从第一张图片中提取FAST特征点,在后续每一次使用中,会将那些已经无法跟踪到的点删除,并且设置成新的能够哦检测到的关键点。将这些特征点存在keypoints向量中,并且将第一张图片作为last_color
       if (index ==0 )
       {
           // 对第一帧提取FAST特征点
           vector<cv::KeyPoint> kps;
           cv::Ptr<cv::FastFeatureDetector> detector = cv::FastFeatureDetector::create();
           detector->detect( color, kps );
           for ( auto kp:kps )
               keypoints.push_back( kp.pt );
           last_color = color;
           continue;
       }
       if ( color.data==nullptr || depth.data==nullptr )
           continue;
      
      1. 调用OpenCV中的LK光流跟踪算法。由于LK算法具有灰度不变假设,所以需要last_color和color两个矩阵来计算图像灰度随着时间的变化量。next_keypoints中存储的是在第二幅图像中,输入特征们新的位置,并设置status(若特征的flow被检测道,就设置为true)及error。具体LK光流跟踪的源码在lkpyramid.cpp文件中实现,先是void cv::calcOpticalFlowPyrLK(…),然后在该函数中调用void SparsePyrLKOpticalFlowImpl::calc(…)函数。(具体实现还没看,之后填坑)
         cv::calcOpticalFlowPyrLK( last_color, color, prev_keypoints, next_keypoints, status, error );
        
      2. 下述步骤即为步骤1中描述的对keypoints的更新
         // 把跟丢的点删掉S
         int i=0; 
         for ( auto iter=keypoints.begin(); iter!=keypoints.end(); i++)
         {
             if ( status[i] == 0 )
             {
                 iter = keypoints.erase(iter);
                 continue;
             }
             *iter = next_keypoints[i];
             iter++;
         }
        
  2. RGB-D的直接法——稀疏直接法
    此时图优化问题由一个相机位姿顶点与许多条一元边组成
    优化问题对应的线性方程是计算李代数增量,本身规模不大,所以主要的计算时间会花费在每条边的误差与雅可比矩阵的计算上
    随着相机的移动,特征点的对应关系也会展示出来
    在这里插入图片描述
    在这里插入图片描述
  3. RGB-D的直接法——半稠密直接法
    此时就会感觉相机旋转时,参与估计的像素像是固定在空间中的一样
    在这里插入图片描述
    在这里插入图片描述
【视觉SLAM十四讲】第八讲 光流法与直接法 特征点法的缺点:1. 关键点的提取与描述子的计算非常耗时。实践当中,SIFT目前在CPU上是无法实时计算的,二ORB页需要近20ms的计算。如果整个SLAM以30毫秒/帧的速度运行,那么一大半实践都花在计算特征点上。2. 使用特征点时,忽略了除特征点以外的所有信息。一张图像有几十万个像素,而特征点只有几百个。只使用特征点丢弃了大部分可能有用的图像信息。3. 相机有时会运动到特征缺失的地方,往往这些地方没有明显的纹理信息。例如,有时我们会面对一堵白墙,或者一个空荡荡的走廊。 阅读详情

相关推荐

视觉SLAM十四讲 第八讲 视觉里程计2 8.5直接法 代码解析

总体思路 随机选取图像点 根据选取到的点和depth图、相机内参,获取这些点的三维空间点坐标 由三维空间点坐标,相机位姿,投影到第二幅图像的相机坐标,再由相机内参,投影到第二幅图像。 在第二幅图像上,遍历每个投影点,并累积该投影点固定窗口半径内的误差和雅可比 由雅可比矩阵计算Hessian矩阵和bias矩阵及代价 由LDLT分解法,求解增量,并由增量更新位姿T21 = Sophus::SE3d::...

Bettyshasha的专栏 1150

【SLAM十四讲】第八讲

总结:

weixin_42696356的博客 354

视觉SLAM十四讲 第八讲 视觉里程计2 8.5直接法BA法 代码解析

总体思路 提取特征点 构建图优化问题 边(误差项),在直接法中为光度误差 边的增量项 光度误差相对于李代数的雅可比矩阵: 图像坐标对李代数的雅可比矩阵 为 u 处的像素梯度 边的误差项 _error ( 0,0 ) = getPixelValue ( x,y ) - _measurement; g2o优化库 增加顶点 增加边(每个特征点一条边) 优化迭代 代码 #include <iostr...

Bettyshasha的专栏 878

视觉SLAM十四讲CH8代码解析及课后习题详解

1. 除了LK 光流之外,还有哪些光流方法?它们各有什么特点? KLT 光流 - mthoutai - 博客园

生活如此美好,致敬每一个热爱“热爱”的人! 9493

视觉SLAM十四讲习题答案

阅读《视觉SLAM十四讲》中遇到的问题及习题资源整理,或为原创,或来自网络,如有问题请与我联系,会在第一时间加以修正。 后来自己写完看到另一位写的博客,相形见绌,大家可以互相结合的看。 第一讲 1.线性方程的解:转载自宋洋鹏(youngpan1101),了解线性代数可关注B站3Blue1Brown,以及线性代数,知乎上有其精细笔记。 2.高斯分布参考这位博主Johnny-Cuii的文章,具体...

INFINITE POSSIBILITIES 1万+

视觉SLAM十四讲(第二版)章节总结+课后习题分析

感谢博主nullwh 的分享,原文链接 视觉SLAM十四讲 《视觉SLAM十四讲 第二版》笔记及课后习题(第一讲) 《视觉SLAM十四讲 第二版》笔记及课后习题(第二讲) 《视觉SLAM十四讲 第二版》笔记及课后习题(第三讲) 《视觉SLAM十四讲 第二版》笔记及课后习题(第四讲) 《视觉SLAM十四讲 第二版》笔记及课后习题(第五讲) 《视觉SLAM十四讲 第二版》笔记及课后习题(第...

Night___Raid的博客 3911

视觉SLAM十四讲第八讲

第 8 讲 视觉里程计 2 本节目标 理解光流法跟踪特征点的原理。 理解直接法是如何估计相机位姿的。 使用 g2o 进行直接法的计算。 一、直接法 直接法拥有如下的缺点: 1.、关键点的提取与描述子的计算非常耗时。 2、 使用特征点时,忽略了除特征点以外的所有信息。 3.、相机有时会运动到特征缺失的地方,往往这些地方没有明显的纹理信息。 为了克服特征点法的上述缺点而存在的。直接法根据像素的亮度信息,估计相机的运动,可以完全不用计算关键点和描述子,于是,既避免了特征的计算时间,也避免了特征缺失的情况。只要场

weixin_40486179的博客 1049

《视觉SLAM十四讲》学习笔记一

此系列学习笔记是针对《视觉SLAM十四讲》的内容进行个人理解性记录,书本地址与书本代码如下:  书本地址:http://www.broadview.com.cn/book/4938   书本代码:https://github.com/gaoxiang12/slambook 第一讲:预备知识  SLAM:(Simultaneous Localization and Mapping )同时定位...

weixin_42694430的博客 2068

视觉 SLAM 十四讲 —— 第八讲 视觉里程计2

视觉 SLAM 十四讲 —— 第八讲 视觉里程计2 本讲主要介绍求解相机位姿的直接法,其中涉及光流法跟踪特征点,以及直接法的具体原理。 直接法的引出 上一讲中介绍虽然特征点法当前是SLAM的主流,但是其存在以下几个缺点: 关键点的提取和描述子的计算非常耗时,即使使用ORB计算也需要20毫秒,如果整个SLAM以30毫秒/帧的速度运行,那么一大半时间都花在了计算特征点上 只使用特征点丢弃了大部分可能有用的图像信息 相机有时会运动到特征缺失的地方(一堵白墙),往往这些地方没有明显的纹理信息 为了克服这

健康工作每一天 697

【学习笔记】视觉SLAM十四讲第八讲:使用LK光流

最近在学习视觉SLAM十四讲,发现数学方面的内容比较好理解(机械学院自动控制工科出身),但涉及到实践部分与代码相关的内容就感觉有点啃不懂(没系统学习过编程),经常有些代码的细节看不懂,网上查到的内容大多也是一笔带过(估计我水平太低, 很多显而易见的内容都不懂),所以决定把自己的学习心得记录下来,一个是方便自己学习和整理知识,另一个也是方便其他像我一样的小白在搜索相关问题的时候能找到详细的解释。 ...

1491

【视觉SLAM十四讲】特征点法视觉里程计.pdf

视觉SLAM十四讲;ORB特征点;G-N;Bundle Adjustment

【SLAM十四讲--第八讲】视觉里程计2

SLAM中的直接法

weixin_42126210的博客 944

LeGO-LOAM运行kitti数据集

文章目录1. kitti-lego-loam2. 改动3. 实验结果4. evo轨迹测评 1. kitti-lego-loam 链接:kitti-lego-loam kitti-lego-loam提供了将kitti序列转化成rosbag的代码,在kittibag中. 需要注意下数据文件的存放顺序,以00序列为例: datafolder          |____results          &

Zlp19970106的博客 8705

视觉SLAM十四讲 第八讲 视觉里程计2 8.3 使用LK光流 代码解析

整体思路 单层图像的光流 对第一帧图像提取FAST角点 对提取到的角点提取光流 特征检测及描述子生成,调用opencv的GFTTDetector 对特征点,假定一个初始的运动量dx=0,dy=0。 采用高斯牛顿法,最小化光度误差,求解运动量 雅可比矩阵dx/dt,dy/dt即u,v。由u+1的像素值减u-1的像素值,得到dx/dt,同理得到dy/dt。 由雅可比矩阵构建 矩阵和 ,代价...

Bettyshasha的专栏 1267

DeepSeek+Coze扣子搭建智能体(保姆级教程)

DeepSeek+Coze扣子搭建智能体(保姆级教程)

yizhen91y的博客 1万+

MLNX_OFED 5.4-3.7.5.0 驱动安装:银河麒麟V10SP2 ARM 内核升级后编译避坑 3 步

本文详细介绍了在银河麒麟V10SP2 ARM环境下安装MLNX_OFED 5.4-3.7.5.0驱动的完整流程,包括内核升级后的驱动兼容性挑战、编译环境准备、分步编译与安装流程以及性能优化与故障排查。特别针对国产化ARM服务器(如华为Atlas系列)提供了实用的解决方案和常见问题处理建议,帮助用户顺利完成mlnx网卡驱动的安装与配置。

weixin_29184075的博客 406

视觉SLAM十四讲 第八讲 视觉里程计2 8.2L-K光流 理论推导

光流描述了像素在图像中的运动,直接法附带着一个相机运动模型。 光流是一种描述像素随时间在图像之间运动的方法,如图。随着时间的流逝,同一个像素会在图像中运动,而我们希望追踪它的运动过程。其中,计算部分像素运动的称为稀疏光流,计算所有像素的称为稠密光流。稀疏光流以Lucas-Kanade光流为代表,并可以在SLAM中用于跟踪特征点位置。 Lucas-Kanade光流 在LK光流中,认为来自相机的图像是...

Bettyshasha的专栏 644

Vmware安装windowsServer2022版本

全网最详细的Vmware安装windowsServer2022版本

A乐神的博客 7021

视觉SLAM十四讲 第8讲 视觉里程计2

1、光流法原理 2、直接法估计相机位姿 3、g2o在直接法的应用 文章目录

sinat_39659902的博客 558

OrthoFinder功能、流程和文件注释

OrthoFinder 的标准输出包括:直系同源组,直系同源基因,有根基因树,解析基因树,无根物种树、有根物种树,基因重复事件以及相关的统计数据。

hs6605015的博客 3047

零信任架构实战:“持续验证+动态授权”全流程解析(附策略引擎联动图)

《零信任实战指南:7图拆解核心流程与行业案例》摘要:本文通过7张架构图系统解析零信任五大核心流程:强身份认证、设备检查、动态授权、持续监控和自动降权。对比金融(重数据审计)与制造业(重物理绑定)的落地差异,指出三大常见误区及解决方案。数据显示,零信任可使安全响应提速60%,泄露成本降低45%。文章提供6个月实施路线图,强调零信任是"智能信任"体系,建议企业分阶段改造,优先保护核心系统。附赠金融/制造行业策略模板及甘特图示例。(149字)

sara_han的博客 777

【视觉SLAM14讲】【汇总】

第一讲东西少,就没记录【slam十四讲第二版】【课本例题代码向】【第二讲初识SLAM】【SLAM基础知识】【linux下C++编译】【cmake基础使用】【slam十四讲第二版】【课本例题代码向】【第三~四讲刚体运动、李群和李代数】【eigen3.3.4和pangolin安装,Sophus及fim的安装使用】【绘制轨迹】【计算轨迹误差】【slam十四讲第二版】【课本例题代码向】【第五讲~相机与图像】【OpenCV、图像去畸变、双目和RGB-D、遍历图像像素14种】【slam十四讲第二版】【课本例题代码向】【

qq_45954434的博客 1万+

手把手教你学 AI芯片 SOC软件开发专栏简介

在AI芯片(如NPU、GPU加速器)爆发式增长的今天,软件栈开发已成为AI应用落地的核心瓶颈。无论是模型推理加速、低延迟部署,还是能效优化,都依赖于对芯片底层软件的深度掌握。然而,许多开发者困于“只会调用API,不懂驱动实现”的困境,导致性能瓶颈难以突破。本专栏《手把手教你学 AI芯片 SOC软件开发》专为AI工程师、嵌入式开发者及系统架构师打造,从零基础切入,系统拆解AI芯片SOC(System on Chip)的完整软件栈,覆盖Runtime(运行时)

MHD0815的博客 172

视觉SLAM十四讲笔记

第二讲 初识SLAM 相机: 以二维投影形式记录三维世界的信息 丢掉了一个维度——距离 三种视觉SLAM中主要的相机: 单目相机:没有深度,必须通过移动相机产生深度(近处物体的像运动快,远处物体的像运动慢) 双目相机:通过两个眼睛的视差计算深度(近处物体差别大,远处物体差别小),计算量很大 RGBD相机:通过物理方法测量深度,知道每个点的深度 主动测量,功耗很大 结构光TOF 深度值比较准确 量程小,易受干扰(很多RGBD用的是红外光,会受太阳光干扰,因此室外还是要用单目和双目,RGBD不太行) 视

dada19980122的博客 4025

A算法的蒙特卡洛树搜索

A*算法的蒙特卡洛树搜索 作者:禅与计算机程序设计艺术 1. 背景介绍 在人工智能和游戏开发领域,搜索算法是一个非常重要的研究方向。其中A算法和蒙特卡洛树搜索是两种广泛应用的经典算法。A算法是一种启发式搜索算法,通过评估各个节点到目标节点的启发式代价来引导搜索方向,在

AI天才研究院 1748

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

视觉SLAM十四讲(第二版)环境安装心得体会

前言 将高博的视觉SLAM14讲看完后,也将里面所有的代码都跑了一遍,在安装环境的时候遇到了无数的坑。为了后来的人能够更加快速上手SLAM,现讲书中环境安装心得记录如下。 环境安装 1. 安装 Eigen3 建议直接按书中的方法,使用apt-get安装: sudo apt-get install libeigen3-dev 按照这个方法安装的Eigen版本应该是3.2.92版。 2. 安装 Sophus 如果安装最新的 Sophus(Sophus 1.0.0),则会报错,提示说需要 Eigen3.3.

weixin_43863574的博客 3415

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

上一篇: 视觉SLAM十四讲——第七讲视觉里程计1
下一篇: 光流跟踪算法及OpenCV源代码探索
chenying66
博客等级 码龄10年 31粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值