文章目录

  • 介绍
  • 光流法数学过程:
  • 直接法数学过程:
  • 直接法示例程序
  • 参考

介绍

  1. 特征点法:提取图像特征点,计算特征点图像描述子(图像灰度/变化梯度等),通过描述子来匹配特征点,确定特征点的匹配关系,利用三角/对极几何/PnP等算法估算相机运动。计算精度高,但是耗时。
  2. 光流法:提取图像特征点,与特征点法不同的是,光流法通过图像灰度值(RGB)值匹配特征点,光流描述了像素在图像中的运动,再利用三角/对极几何/PnP等算法估算相机运动。减少特征点匹配所需的计算量,精度也有保证。
  3. 直接法:直接使用像素块,也可以提取图像角点(角点像素突出因此能够进行更好的匹配),通过计算灰度值(RGB)值直接解算得到运动估计(R,t)。利用像素移动直接计算得到相机的移动。一般需要位姿的初始估计,通过初始的位姿估计来得到匹配的图像特征点,通过灰度值(RGB)值优化位姿估计。运算速度快,但是由于灰度不变假设,过快的图像运动,容易陷入局部最优解。
  4. 半直接法:以SVO为代表,将图像分块来做匹配。指通过对图像中的特征点图像块进行直接匹配来获取相机位姿,而不像直接匹配法那样对整个图像进行匹配。
    特征匹配解决了SLAM中的数据关联问题(data association),即确定当前看到的路标与之前看到的路标之间的对应关系。通过图像特征点像素级描述子进行准确的匹配。

光流法数学过程:

理解图像函数:用于表示图像灰度值与图像坐标[u,v]之间的关系,图像函数3维示例图如下:

取[u,v]中的一维,2维图像函数示例图如下:

当图像灰度及坐标变化都很小时,如上右图(已知上一帧某特征点的灰度与B相同,当相机运动缓慢,我们就可以估计上一帧的某特征点为B),我们假设匹配的特征点的灰度值不变,光流法就是利用灰度算出与上一帧特征点匹配的当前帧特征点的像素坐标。
光流法计算匹配点像素坐标过程:

设 ttt 时刻位于(u,v)(u,v)(u,v)处像素点的灰度值为I(u,v,t)I(u,v,t)I(u,v,t):
设在t+dtt+dtt+dt时刻,该像素特征点运动到图像(u+du,v+dv)(u+du, v+dv)(u+du,v+dv)处,对应的图像灰度值为 。光流法计算:du,dvdu,dvdu,dv。
灰度不变假设:

将上式泰勒一阶展开:

由于灰度不变假设,得

两边同时除以dtdtdt,得 (*)

其中:∂I∂u\frac{\partial I}{\partial u}∂u∂I​, ∂I∂v\frac{\partial I}{\partial v}∂v∂I​分别为在t时刻图像点[x,y]处的图像梯度;
∂I∂t\frac{\partial I}{\partial t}∂t∂I​为t时刻图像点[u,v][u,v][u,v]处的灰度随时间的变化率,一般由两帧图像之间的差值得到,即∂I∂t≈I(u,v,t+Δt)−I(u,v,t)Δt\frac{\partial I}{\partial t}\approx\frac{I\left(u,v,t+\Delta t\right)-I\left(u,v,t\right)}{\Delta t}∂t∂I​≈ΔtI(u,v,t+Δt)−I(u,v,t)​

利用(*)式得出特征点在[u, v]处的像素移动速度,继而可估计出特征点新的图像坐标【十四讲】。

由于图像灰度及图像梯度容易发生剧烈变化,因此在大运动下,利用灰度下降优化容易陷入局部最优,如下右图。B为全局最优,但是由于灰度变化剧烈导致,下降至C点,便结束迭代。

使用图像金字塔可以得到一定程度的改善。在计算光流时,先从顶层的图像开始计算,然后将上一层的追踪结果,作为下一层光流的初始值。也是SVO中的一个思路。
图像金字塔是只对一个图像进行不同程度缩放,得到不同分辨率下的图像。

直接法数学过程:

直接法一般需要初始估计,利用初始估计预估图像特征匹配点,然后利用灰度约束得到两帧图像之间的相机运动。
假设有两个帧,运动未知,但有初 始估计 R,t第1帧上看到了点P,投影为p1 按照初始估计,P在第2帧上投影为 p2。

投影关系:运动使用李代数ξ\xiξ来表示。

最小化光度误差:

minf(ξ)∑i=1NeiTei,ei=I1(p1,i)−I2(p2,i)min\ f\left(\xi\right)\sum_{i=1}^{N}{e_i^Te_i},\ e_i=I_1\left(p_1,i\right)-I_2\left(p_2,i\right)min f(ξ)i=1∑N​eiT​ei​, ei​=I1​(p1​,i)−I2​(p2​,i)
待估计的量为相机运动ξ\xiξ,在迭代求解上式时,比如使用高斯牛顿,需要知道上式的雅可比矩阵。雅可比矩阵推导计算过程如下:

令:

得:

得雅可比矩阵:
J=∂e∂ξ=−∂I2∂u∂u∂q∂q∂ξJ=\frac{\partial e}{\partial\xi}=-\frac{\partial I_2}{\partial u}\frac{\partial u}{\partial q}\frac{\partial q}{\partial\xi}J=∂ξ∂e​=−∂u∂I2​​∂q∂u​∂ξ∂q​
使用求导链式法则,也可得上式。注意:如果误差函数e的定义为:
e=I2(p2)−I1(p1)e=I_2\left(p_2\right)-I_1\left(p_1\right)e=I2​(p2​)−I1​(p1​)
则雅可比矩阵反号。

雅可比矩阵分为三部分:
第一部分:图像梯度;
第二部分:像素对投影点导数:

第三部分:投影点对位姿导数:(李代数左扰动模型)

综合得:

直接法示例程序

代码及数据地址:https://gitee.com/nie_xun/zhijiefa.git
使用:

mkdir build; cd build
cmake ..; make
./zhijiefa

摁任意键进行下一步运算。

结果示例:

参考

视觉十四讲-高翔

特征点法光流法直接法相关推荐

  1. 【视觉SLAM十四讲】第八讲 光流法与直接法

    特征点法的缺点: 1. 关键点的提取与描述子的计算非常耗时.实践当中,SIFT目前在CPU上是无法实时计算的,二ORB页需要近20ms的计算.如果整个SLAM以30毫秒/帧的速度运行,那么一大半实践都 ...

  2. 视觉SLAM——特征点法与直接法对比以及主流开源方案对比 LSD SVO ORB DSO

    前言 单目视觉SLAM可以根据其前端视觉里程计或是后端优化的具体实现算法进行分类:前端可以分为特征点法与直接法,后端可以分为基于滤波器和基于非线性优化.其中在后端上目前已经公认基于非线性优化的方法在同 ...

  3. 视觉SLAM——特征点法与直接法对比以及主流开源方案对比 ORB LSD SVO DSO

    前言 单目视觉SLAM可以根据其前端视觉里程计或是后端优化的具体实现算法进行分类:前端可以分为特征点法与直接法,后端可以分为基于滤波器和基于非线性优化.其中在后端上目前已经公认基于非线性优化的方法在同 ...

  4. 目标检测、追踪梳理:帧差法、光流法、背景减除法

    (0)总览 运动目标检测是指在序列图像中检测出变化区域并将运动目标从背景图像(背景层)中提取出来.通常情况下,目标分类.跟踪和行为理解等后处理过程仅仅考虑图像中对应于运动目标的像素区域(前景层),因此 ...

  5. 【入门向】光流法(optical flow)基本原理+深度学习中的应用【FlowNet】【RAFT】

    目录 1. 理论背景 1.1 光流 1.2 光流场 2. 基本原理 2.1 假设条件 2.2 约束方程 3. 光流估计方法 3.1 思路概述 3.2 优缺点对比 4. 稠密光流和稀疏光流 4.1 稠密 ...

  6. SVO: 视觉SLAM中特征点法与直接法结合

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 前面的话 VSLAM 是利用多视图几何理论,根据相机拍摄的图像信息 ...

  7. SLAM | 视觉SLAM中特征点法与直接法结合:SVO

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 前面的话 VSLAM 是利用多视图几何理论,根据相机拍摄的图像信息对相机进行定位并同时构建周围环境地图 ...

  8. (3分钟速通)Visual Odometry的特征点法和直接法

    光流法:(https://zhuanlan.zhihu.com/p/537113460) ​ 编辑切换为居中 添加图片注释,不超过 140 字(可选) ​ 编辑切换为居中 添加图片注释,不超过 140 ...

  9. 视觉SLAM笔记(42) 光流法跟踪特征点

    视觉SLAM笔记(42) 光流法跟踪特征点 1. 使用 TUM 公开数据集 2. 使用 LK 光流 1. 使用 TUM 公开数据集 准备了若干张数据集图像,存放在程序目录中的 VSLAM_note/0 ...

  10. opencv学习笔记(1) TermCriteria 和 光流法特征点

    opencv学习笔记(1) 本系列文章由 @苏安6629 出品,转载请注明出处. TermCriteria类和calcOpticalFlowPyrLK的使用 在SLAM中,因为可能存在运动的目标,所以 ...

最新文章

  1. C#Winform调用wsdl接口webservice#http
  2. 关于如何在PSA众多请求号中查找数据是属于哪一条。
  3. 少儿编程100讲轻松学python(十二)-python如何将数据写入txt
  4. 链表的分解(C++)
  5. 宇视摄像头ip搜索软件下载_搜索资源?下载资源?一款软件就给你安排的妥妥的...
  6. 交叉风帆行业调研报告 - 市场现状分析与发展前景预测
  7. Xcode 添加 background modes、Associated Domains 等设置项
  8. LINUX编译OPENJDK:unsupported cpu xxx
  9. 2005计算机编程入门教学,Micro:bit教程05—小bit编程入门教程
  10. hautoj 1260
  11. Zigbee和WiFi的信道重叠
  12. 【实用的微缩版 初级开发面试题】
  13. 运动式蓝牙耳机什么牌子好、运动式蓝牙耳机推荐
  14. Eggjs笔记:详解Mongoose的聚合管道以及populate实现关联查询
  15. 软件 耗电 android OS 系统,六款安卓平台浏览器耗电量实测
  16. [附源码]Python计算机毕业设计Django的项目管理系统
  17. WITH AS 用法 (说实话,WITH AS还真是简单)
  18. 胖人瘦下来后,会长高或变矮吗?
  19. 【星游记】新4K分享
  20. 电脑开机将在一分钟后自动重启问题

热门文章

  1. 360路由器v2刷第三方固件_路由器刷固件图文教程,刷机OpenWrt第三方固件,路由器升级固件...
  2. 界面原形设计/UI原型设计
  3. 怎么设置html z值,正态分布1.96 统计学,Z=1.96怎么来的
  4. html比赛项目,趣味运动会项目
  5. 用python写问答机器人_机器人之Python入门到实践-问答机器人
  6. 你都用 Python 来做什么?
  7. JS match() 方法 使用
  8. pyodbc 操作SQL Server数据库
  9. 一个vue项目同时兼容pc和移动端
  10. HCNP-Cloud云计算认证