视觉里程计原理(二)特征匹配与追踪(LK光流法)
- 格式:pptx
- 大小:1.88 MB
- 文档页数:26
光流法的作用1. 什么是光流法光流法(Optical Flow)是计算机视觉领域中一种重要的运动估计方法,用于分析图像序列中的物体运动。
它通过分析相邻帧之间的像素强度变化来估计每个像素点在图像上的运动方向和速度。
在实际应用中,光流法可以用于目标跟踪、视觉里程计、三维重建和视频压缩等领域。
它对于理解和分析视频序列中的运动行为具有重要意义。
2. 光流法原理光流法基于一个假设:相邻帧之间相同物体上的像素点在时间上保持连续。
根据这个假设,我们可以通过比较两帧之间的像素强度差异来计算每个像素点在图像上的位移。
具体而言,光流法通过以下步骤实现:步骤一:特征提取首先需要从图像序列中提取出关键特征点,例如角点或边缘等。
这些特征点通常具有良好的区分性和稳定性,能够在不同帧之间进行匹配。
步骤二:特征匹配对于每个特征点,光流法通过在相邻帧之间进行搜索来找到其对应点。
一般采用的方法是在当前帧的局部区域内寻找与上一帧中特征点最相似的像素。
步骤三:光流计算通过比较特征点在两帧之间的位置变化,可以计算出光流向量,即每个像素点在图像上的运动方向和速度。
常用的光流计算方法有基于亮度约束和基于相关性约束等。
步骤四:光流可视化为了更直观地展示运动信息,可以将计算得到的光流向量以箭头或颜色等形式叠加在图像上,从而形成光流可视化结果。
3. 光流法的作用3.1 目标跟踪光流法可以用于目标跟踪,即在视频序列中实时追踪目标物体的位置和运动轨迹。
通过不断更新目标物体的位置信息,可以实现对其准确跟踪,并应用于视频分析、智能监控等领域。
3.2 视觉里程计视觉里程计是指通过分析相机连续拍摄的图像序列来估计相机在三维空间中的运动轨迹。
光流法可以用于计算相邻帧之间的相对位移,从而实现对相机运动的估计。
视觉里程计在自动驾驶、增强现实等领域具有重要应用价值。
3.3 三维重建光流法可以用于三维重建,即通过分析多个视角下的图像序列来恢复场景的三维结构。
通过计算不同视角之间的光流向量,可以估计出物体在空间中的位置和形状信息,从而实现对场景的三维重建。
klt跟踪算法公式KLT跟踪算法公式1. 算法介绍KLT(Kanade-Lucas-Tomasi)跟踪算法是一种常用的光流估计算法,用于在视频序列中追踪目标的运动。
该算法的核心思想是通过对目标特征点的追踪,根据特征点在连续帧之间的位置变化来估计目标的运动。
2. 公式1:灰度图像金字塔KLT跟踪算法首先将原始图像转换为灰度图像,然后构建金字塔来实现多尺度分析。
灰度图像金字塔的公式如下:G_i = F * G_(i-1)其中,G_i表示第i层金字塔图像,G_(i-1)表示第i-1层金字塔图像,F表示图像的缩放因子。
3. 公式2:特征点的坐标更新KLT跟踪算法通过追踪特征点的位置来估计目标的运动。
对于每个特征点,根据特征点在前一帧和当前帧中的位置,可以计算出特征点的坐标更新量。
坐标更新的公式如下:delta_x = sum((dI/dx)^T * dI/dx)^-1 * sum((dI/dx)^T * dt)delta_y = sum((dI/dy)^T * dI/dy)^-1 * sum((dI/dy)^T * dt)其中,delta_x和delta_y分别表示特征点在x和y方向上的坐标更新量,dI/dx和dI/dy分别表示图像在x和y方向上的梯度,dt 表示两帧之间的时间差。
4. 公式3:特征点的速度根据特征点的坐标更新量,可以计算出特征点在图像上的速度。
特征点的速度公式如下:v = sqrt(delta_x^2 + delta_y^2)其中,v表示特征点的速度。
5. 举例解释假设有一段视频序列,我们选取其中一个目标的特征点进行KLT跟踪。
1.首先,将视频序列的帧转换为灰度图像,并构建金字塔来实现多尺度分析。
2.在连续帧之间,选取目标特征点在前一帧和当前帧中的位置,计算出特征点的坐标更新量。
3.根据坐标更新量,计算出特征点在图像上的速度。
通过KLT跟踪算法,我们可以得到目标特征点在视频序列中的运动轨迹,并估计出目标的运动速度。
视觉里程计来源 | ADAS视觉里程计(Visual Odometry)在机器人学与计算机视觉领域,视觉里程计是一个通过分析相关图像序列,来确定机器人位置和朝向的过程。
在导航系统中,里程计(odometry)是一种利用致动器的移动数据来估算机器人位置随时间改变量的方法。
例如,测量轮子转动的旋转编码器设备。
里程计总是会遇到精度问题,例如轮子的打滑就会导致产生机器人移动的距离与轮子的旋转圈数不一致的问题。
当机器人在不光滑的表面运动时,误差是由多种因素混合产生的。
由于误差随时间的累积,导致了里程计的读数随着时间的增加,而变得越来越不可靠。
视觉里程计是一种利用连续的图像序列来估计机器人移动距离的方法。
视觉里程计增强了机器人在任何表面以任何方式移动时的导航精度。
视觉里程计算法:大多数现有的视觉里程计算法都是基于以下几个步骤:1、图像获取:单目照相机、双目照相机或者全向照相机;2、图像校正:使用一些图像处理技术来去除透镜畸变;3、特征检测:确定感兴趣的描述符,在帧与帧之间匹配特征并构建光流场;(1)、使用相关性来度量两幅图像间的一致性,并不进行长时间的特征跟踪;(2)、特征提取、匹配(Lucas–Kanade method);(3)、构建光流场;4、检查光流场向量是否存在潜在的跟踪误差,移除外点;5、由光流场估计照相机的运动;(1)、可选方法1:使用卡尔曼滤波进行状态估计;(2)、可选方法2:查找特征的几何与3D属性,以最小化基于相邻两帧之间的重投影误差的罚函数值。
这可以通过数学上的最小化方法或随机采样方法来完成;6、周期性的重定位跟踪点;我选择的视觉里程计算法是:“ sift特征匹配点——基本矩阵——R和T”。
第一步:由特征点计算基本矩阵F。
一般而言,sift点是存在误匹配的情况,因此,采用ransac鲁棒方法计算基本矩阵F。
这个过程已经实现,但是还有一个小问题:同样的一组sift点,进行两次基本矩阵计算,得到的基本矩阵差异很大,因此,我在ransac方法的基础上,根据得到的inliers点,采用常规的8点基本矩阵计算方法,这样得到的基本矩阵能保持不变第二步:由基本矩阵计算R和T方法1:奇异值分解E = KK'*F*KK; %%这是真实的本质矩阵E[U,S,V] = svd(E); %奇异值分解。
光流法原理和跟踪流程-回复光流法(Optical Flow)是计算机视觉中常用的一种运动估计方法。
它通过分析图像中像素点随时间的变化,来推测出像素点的运动方向和速度。
光流法在目标追踪、医学影像分析、自动驾驶等领域发挥着重要作用。
在本文中,我将详细介绍光流法的原理和跟踪流程,帮助读者更好地理解和应用该方法。
光流法的原理基于一个基本假设:相邻时刻的像素点的灰度值之差(即图像亮度的变化)主要由相机的运动引起,而不是物体的运动。
基于这个假设,光流法试图通过计算相邻帧之间像素点之间的运动矢量来估计相机的运动。
那么,光流法的具体跟踪流程是怎样的呢?以下是一个典型的流程:1. 图像预处理在进行光流计算之前,首先需要对图像进行预处理。
这包括图像去噪、灰度化、图像金字塔构建等步骤。
图像金字塔的构建是为了对不同尺度的运动进行估计,以应对不同场景下的运动速度变化。
2. 特征提取在光流法中,通常选择一些具有较好区分度和稳定性的特征点进行运动估计。
常用的特征点包括角点、边缘等。
特征提取方法可以是角点检测算法(如Harris角点检测)或其他滤波器。
提取到的特征点可以用来计算光流向量。
3. 光流计算光流计算是光流法的核心环节。
常用的光流计算方法有基于亮度差异的光流计算方法和基于约束条件的光流计算方法。
基于亮度差异的光流计算方法基于光流法的基本假设,通过计算相邻帧之间像素点的灰度值之差来估计运动矢量。
这种方法简单直观,但对于大灰度变化和光照变化较大的情况不够稳定。
基于约束条件的光流计算方法则利用了光流场的光滑性和连续性约束。
其中一种常见的方法是使用光流方程,将其转化为一个光流方程约束优化问题,并用迭代方法求解。
这种方法对光照变化和大灰度变化具有一定的鲁棒性。
4. 光流可视化和结果分析经过光流计算之后,得到的光流场可以用来可视化和分析。
常见的可视化方法有箭头可视化和色彩编码可视化。
箭头可视化将每个特征点的光流矢量表示为箭头的方向和长度,色彩编码可视化则利用不同颜色来表示光流的方向和大小。
融合光流跟踪和特征点匹配的单目视觉里程计研究融合光流跟踪和特征点匹配的单目视觉里程计研究摘要:单目视觉里程计(Visual Odometry,VO)是指在没有GPS等定位设备的情况下,通过单目摄像头的输入获取并处理图像信息,实现相机的运动轨迹估计。
VO技术在自动驾驶、机器人导航、无人机等领域有重要应用价值。
但由于单目摄像头只能获得二维图像信息,所以实现稳定和精度较高的VO并不容易。
本文结合光流跟踪和特征点匹配两类方法,提出了一种新的单目VO方法,并进行了实验验证。
实验结果表明,该方法具有较好的准确性和鲁棒性。
关键词:单目视觉里程计;光流跟踪;特征点匹配;估计误差;鲁棒性1. 引言在自动驾驶、机器人导航、无人机等领域,利用单目摄像头获取图像信息来估计相机的运动轨迹是一种十分重要的技术。
单目视觉里程计技术(Visual Odometry,VO)可用于实现相应的目标。
VO在没有GPS等定位设备的情况下,通过处理输入图像信息,估计相机的运动轨迹。
其原理是利用图像中相邻两帧之间的运动信息,结合运动学模型,计算相机相对于前一时刻的运动量。
VO技术的主要应用领域包括自动驾驶、机器人导航、无人机等领域。
虽然技术的应用前景广阔,但是由于单目摄像头只能获得二维图像信息,实现稳定和精度较高的VO 并不容易。
2. 光流跟踪光流跟踪是一种基于像素级别的方法,它通过输入图像中像素点的运动,计算相邻两帧之间的相机运动量。
光流法是通过对图像内像素的偏移量进行计算,实现像素的运动跟踪。
在VO 中,光流法的主要作用在于对图像局部区域内像素的运动进行估计,并通过局部运动结果对整个图像区域内的相对运动进行分析。
然后,基于这些分析结果可以对相对运动量进行计算。
3. 特征点匹配在单目VO中,特征点匹配也是一种常用的方法,它通过提取图像中独特的点,即特征点,并匹配图像中相邻两帧之间的特征点来计算相机的运动轨迹。
特征点通常是图像中一些特定的区域,其特征包括灰度、边缘信息等。
运动目标检测之Lucas-Kanade光流算法读书笔记视觉是人类感知自身周围复杂环境最直接有效的手段之一,而在现实生活中大量有意义的视觉信息都包含在运动中,人眼对运动的物体和目标也更敏感,能够快速的发现运动目标。
随着计算机技术、通信技术、图像处理技术的不断发展,计算机视觉己成为目前的热点研究问题之一。
而运动目标检测是计算机视觉研究的核心课题之一,融合了图像处理、模式识别、人工智能、自动控制、计算机等众多领域的先进技术,在军事制导、视觉导航、视频监控、智能交通、医疗诊断、工业产品检测等方面有着重要的实用价值和广阔的发展前景。
一目标检测运动目标检测运动目标检测是指从序列图像中将运动的前景目标从背景图像中提取出来。
目前,已有的运动目标检测方法按照算法的基本原理可以分为三类:背景差分法,帧间差分法和光流法。
1背景差分法背景差分法又称背景减除法,背景差分法的原理是将当前帧与背景图像进行差分来得到运动目标区域,但是需要构建一幅背景图像,这幅背景图像必须不含运动目标,并且应该能不断的更新来适应当前背景的变化,构建背景图像的方法有很多,比较常用的有基于单个高斯模型的背景构建,基于混合高斯模型的背景构建,基于中值滤波器的背景构造,基于卡尔曼滤波器的背景构造,基于核函数密度估计的背景模型构造。
缺点:因为要求背景是静止的,所以背景的变化,场景中有很多干扰,比如场景中有树枝和叶子在风中晃动、水面的波动等等,还有照明的变化和天气的变化等都可能影响检测的结果2帧间差分法帧间差分法是一种通过对视频图像序列中相邻两帧作差分运算来获得运动目标轮廓的方法,它可以很好地适用于存在多个运动目标和摄像机移动的情况。
当监控场景中出现异常物体运动时,帧与帧之间会出现较为明显的差别,两帧相减,得到两帧图像亮度差的绝对值,判断它是否大于阈值来分析视频或图像序列的运动特性,确定图像序列中有无物体运动。
图像序列逐帧的差分,相当于对图像序列进行了时域下的高通滤波。
基于L K光流法的单目视觉里程计陈伟杰,孙作雷(上海海事大学机器辨识与交互研究组,上海2〇13〇6)摘要:在移动机器人快速发展的今天,视觉里程计是通过视觉传感器进行导航定位的主要方式之一。
文章介绍了基于单个摄 像头的单目视觉里程计的一种实现方法,使用S U R F算法提取特征点,用L K光流法进行特征追踪,相比于传统特征匹配在运算 效率上有极大的提高,再对特征点计算位移与旋转量,以里程计的方式达到定位目的。
详细介绍了视觉里程计的数学原理以及 S U R F算法和L K算法的原理及其数学推导、单目视觉里程计的尺度不确定原理。
最后通过对比确定L K算法的优势以及最优 参数的选择。
关键词!视觉里程计;L K光流法;图像处理;特征跟踪;多视图几何中图分类号:T P242.6+2文献标识码:A D O I:10. 19358/j. iss n. 1674-7720. 2017. 21.014引用格式:陈伟杰,孙作雷.基于L K光流法的单目视觉里程计[J].微型机与应用,2017,36(21):45H7,50.Monocular visual odometry based on LK optical flowChen W eijie,Sun Zu o l ei(Machine Perception and Interaction Group ( M P IG),Shanghai Maritime University,Shanghai 201306,China)A b s tr a c t: Nowadays,with the rapid development 〇: mobile robots,visual odometer is one 〇:the main ways 〇: navigating through visual sensors. In this paper,we introduce a metliod of monocular visual odometer based on single camera. W e use SURF to extract feature points and then use LK optical flow to track features. The operational efficiency of LK is higher than usual matching. F in a iy,we use matching points to get translation and rotation to achieve the purpose of positioning. W e introduce how S U R F a n d LK work and what ’ s projective ambiguity. At la st,we show the result that LK is really faster than usual m atching,and the optimal parameters are determined by comparing the selection.K ey w ord s :visual odometry;LK optical flow ;image processing;feature tracking; multi-view geometry〇引言智能机器人在近年来越来越多地进人公众视野。
光流法应用光流法是一种计算机视觉中常用的技术,它可以用于解决运动估计、目标跟踪、视觉里程计等问题。
本文将从光流法的基本原理、应用领域以及一些常见算法进行介绍和探讨。
一、光流法的基本原理光流法是基于图像中像素亮度的变化来推测物体的运动方向和速度的一种方法。
其基本原理是假设相邻帧之间的图像存在连续性,即物体在短时间内的移动是平滑的。
根据这个假设,可以通过计算图像中每个像素点在两帧之间的亮度变化来推测物体的运动。
具体来说,光流法首先假设相邻帧之间的图像亮度的变化是由物体的运动引起的,然后利用亮度一致性约束来进行计算。
亮度一致性约束是指在相邻帧中的同一物体点的亮度是相等的。
根据这个约束,可以得到光流方程,通过求解这个方程可以得到物体的运动信息。
二、光流法的应用领域光流法在计算机视觉中有广泛的应用,下面将介绍几个常见的应用领域。
1. 运动估计:光流法可以用于估计图像中物体的运动轨迹。
通过计算物体在相邻帧之间的光流,可以得到物体的运动方向和速度信息。
这对于目标跟踪、行为分析等应用非常重要。
2. 目标跟踪:光流法可以用于目标的连续跟踪。
通过计算目标在连续帧之间的光流,可以实现对目标的跟踪和定位,从而实现目标的识别和追踪。
3. 视觉里程计:光流法可以用于计算相机在空间中的运动轨迹。
通过计算相邻帧之间的光流,可以得到相机的运动信息,进而计算相机在三维空间中的运动轨迹。
三、光流法的算法光流法有多种不同的算法,下面将介绍一些常见的算法。
1. Lucas-Kanade算法:Lucas-Kanade算法是光流法中最经典的算法之一。
它基于局部相似性的假设,通过最小化像素间的亮度差异来计算光流。
2. Horn-Schunck算法:Horn-Schunck算法是光流法中另一个经典的算法。
它通过最小化光流的平方差来计算光流,同时还考虑了平滑性约束。
3. 光流约束方程:光流约束方程是一种基于光流的模型,通过求解这个方程可以得到光流场。
2 LK 光流(5分,约3小时)2.1光流文献综述(1分)我们课上演示了Lucas-Kanade 稀疏光流,用OpenCV 函数实现了光流法追踪特征点。
实际上,光流法有很长时间的研究历史,直到现在人们还在尝试用Deeplearning 等方法对光流进行改进[1,2]。
本题将指导你完成基于Gauss-Newton 的金字塔光流法。
首先,请阅读文献[3](paper 目录下提供了pdf ),回答下列问题。
问题:1. 按此文的分类,光流法可分为哪几类?答:作者在文中对光流法按照两种不同的方法进行分类。
➢ 按照估计的是参数的叠加增量还是增量Warp 将光流法分为叠加(additional)和组合(compositional)算法➢ 按照Warp 更新规则可以将光流法分为前向(forward )和逆向/反向(inverse)两种算法综上:可以分4类,分别是 FA(Forward Additional), FC(Forward Composition), (Inverse Additional) 和 IC(Inverse Compositional)。
2. 在compositional 中,为什么有时候需要做原始图像的wrap ?该wrap 有何物理意义?答: 与Lucas-Kanade 算法中那样简单地将迭代的更新 p ∆添加到当前估计的参数p 不同,组合(compositional )算法中,对扭曲();W x p ∆的增量更新必须由Warp 的当前估计组成() ;Wx p 。
这两个 warp 的组合可能更复杂。
因此,我们对 warp 集合有两个要求: 1)warp 集合必须包含 identity warp 。
2)warp 集合必须在组合运算中闭合。
需要在当前位姿估计之前引入增量式 warp (incremental warp )以建立半群约束要求(the semi-group requirement )。
KLT算法原理1. 引言KLT(Kanade-Lucas-Tomasi)算法是一种在计算机视觉中常用的特征点跟踪算法。
它能够在连续的图像帧中跟踪一组特征点,并估计它们的运动。
KLT算法具有计算简单、鲁棒性强、对图像变化具有较好适应性等优点,因此在很多应用中得到了广泛的应用,例如目标跟踪、光流估计、相机姿态估计等。
2. KLT算法基本原理KLT算法的基本原理是通过追踪特征点在连续帧之间的位置变化来估计它们的运动。
它的核心思想是利用局部窗口内的像素灰度信息来匹配特征点,从而实现对特征点的跟踪。
KLT算法的具体步骤如下:2.1 特征点检测首先,在图像中选择一组待跟踪的特征点。
常用的特征点检测算法有Harris角点检测、SIFT、SURF等。
这些算法能够在图像中找到具有显著变化的位置,作为特征点进行跟踪。
2.2 特征点跟踪对于每个待跟踪的特征点,KLT算法通过以下步骤来跟踪它的运动:2.2.1 特征点周围区域选择在当前帧中,以特征点为中心选择一个局部区域(通常是一个正方形窗口)作为特征点的邻域。
区域的大小和形状可以根据实际应用进行选择。
2.2.2 特征点邻域内的像素灰度值提取从特征点的邻域中提取像素的灰度值,用于后续的特征点匹配。
2.2.3 特征点匹配将当前帧中特征点邻域内的像素灰度值与前一帧中对应特征点邻域内的像素灰度值进行匹配。
常用的匹配方法有均方差匹配、互相关匹配等。
匹配的目标是找到在当前帧中与前一帧中特征点邻域内的像素灰度值最相似的位置。
2.2.4 特征点位置更新根据匹配结果,更新特征点的位置。
通常情况下,更新的方式是将当前帧中匹配位置的坐标作为特征点的新位置。
2.3 运动估计通过特征点的位置变化,可以估计出特征点的运动。
常用的运动估计方法有平移模型、仿射模型、透视模型等。
这些模型可以根据实际应用进行选择。
3. KLT算法的优点和局限性3.1 优点•计算简单:KLT算法的计算量相对较小,适用于实时应用。
视觉里程计原理视觉里程计是一种基于机器视觉的定位技术,它利用摄像头来捕捉场景图像,并通过视觉模式识别、图像匹配和定位算法来定位于空间中的物体和环境,从而获取运动的轨迹等一系列受控数据。
由于其具有低成本、易操作等优点,视觉里程计技术广泛应用于机器人定位导航、工业自动化、空中和地面测绘等领域。
一般情况下,视觉里程计系统是由两个主要构成部件组成的:摄像头和定位系统。
摄像头用于捕捉场景图像,而定位系统则用来根据捕获的图像信息进行定位。
对于精度要求较高的应用场景,摄像头可以搭配电子游标等配件使用,以提高场景图像的清晰度;而定位系统则包括硬件设备和软件系统两部分,硬件设备由电脑、运动控制硬件、摄像头等组成,软件系统则负责开发、实现和管理视觉里程计系统的各项功能。
视觉里程计系统的核心技术主要有视觉模式识别技术、图像匹配技术和定位算法技术。
视觉模式识别技术提供了定位系统的基础技术支持,能够根据图像的结构特征划分或识别出不同的场景,以实现空间识别;图像匹配技术则主要用于识别捕捉图像中特定物体,从而提取其特征信息;定位算法技术则在视觉模式识别和图像匹配的基础上,采用多种不同的定位算法(例如最小二乘法、基于距离的定位算法等),根据物体和环境的特征信息,对定位性能进行更进一步的改善和优化。
视觉里程计技术被广泛应用于机器人定位导航、空中和地面测绘,工业自动化以及无人机等多个领域,它结合了摄像头和定位系统,具有低成本、易操作、可移植性等特点;此外,它还可以根据特定场景的要求进行实时优化和调整,以期获得更好的定位性能。
与GPS和红外技术相比,视觉里程计技术的优势在于它可以在有阴影、遮挡或改变地形的情况下实现定位,以及不受白天黑夜的影响,从而更好地满足室内定位和室外定位的需求。
总之,视觉里程计技术是一种由摄像头、定位系统和定位算法技术构成的综合机器视觉位置定位技术,它具有低成本、易操作和可移植性优势,同时可以根据场景要求进行实时优化和调整,更好地满足各种室内和室外定位需求。
⽬标跟踪之klt---光流跟踪法近来在研究跟踪,跟踪的⽅法其实有很多,如粒⼦滤波(pf)、meanshift跟踪,以及KLT跟踪或叫Lucas光流法,这些⽅法各⾃有各⾃的有点,对于粒⼦滤波⽽⾔,它能够⽐较好的在全局搜索到最优解,但其求解速度相对较慢,由于其是基于颜⾊直⽅图的计算,所以对相同颜⾊东西不太能够区别,meanshift⽅法很容易陷⼊局部最优,但速度还是挺快,所以现在很有⼀些⼈是将meanshift跟pf结合做跟踪,恰好在很多⽅⾯能够互补。
Kanade-Lucas-Tomasi⽅法,在跟踪⽅⾯表现的也不错,尤其在实时计算速度上,⽤它来得到的,是很多点的轨迹“trajectory”,并且还有⼀些发⽣了漂移的点,所以,得到跟踪点之后要进⾏⼀些后期的处理,说到Kanade-Lucas-Tomasi⽅法,⾸先要追溯到Kanade-Lucas两⼈在上世纪80年代发表的paper:An Iterative Image Registration Technique with an Application to Stereo Vision,这⾥讲的是⼀种图像点定位的⽅法,即图像的局部匹配,将图像匹配问题,从传统的滑动窗⼝搜索⽅法变为⼀个求解偏移量d的过程,后来Jianbo Shi和Carlo Tomasi两⼈发表了⼀篇CVPR(94')的⽂章Good Features To Track,这篇⽂章,主要就是讲,在求解d的过程中,哪些情况下可以保证⼀定能够得到d的解,这些情况的点有什么特点(后来会发现,很多时候都是寻找的⾓点)。
PS: 其实我很奇怪这个算法为什么叫做KLT算法,⽽不加上Jianbo Shi的名字~ 好吧,前戏就这么多,接下来进⼊正题,KLT是如何实现跟踪的? 先说KLT算法的⼏个前提假设: 1)亮度恒定 2)时间连续或者是运动是“⼩运动”3)空间⼀致,临近点有相似运动,保持相邻 这⼏个为什么要这么假设,我在后⾯来解释,很直观的讲,如果判断⼀个视频的相邻两帧I、J在某局部窗⼝w上是⼀样的,则在窗⼝w内有:I(x, y, t) = J(x', y', t+τ),亮度恒定的假设(假设1)即为了保证其等号成⽴不受亮度的影响,假设2是为了保证KLT能够找到点,假设3则为以下原因假设(即对于同⼀个窗⼝中,所有点的偏移量都相等): 在窗⼝w上,所有(x, y)都往⼀个⽅向移动了(dx, dy),从⽽得到(x', y'),即t时刻的(x, y)点在t+τ时刻为(x+dx, y+dy),所以寻求匹配的问题可化为对以下的式⼦寻求最⼩值,或叫做最⼩化以下式⼦: ⽤积分来表⽰上述式⼦,以上式⼦可等效为: 这个式⼦的含义,即找到两副图像中,在W窗⼝中,I、J的差异,其中I以x-d/2为中⼼,J以x+d/2为中⼼,w/2为半径的⼀个矩形窗⼝间的差异,好吧,结合我们微积分的知识,函数ε(d)要取得最⼩值,这个极值点的导数⼀定为0,即的值为0,由泰勒展开的性质:可以得到:于是,问题转化为:其中:从⽽,问题即为:=>即其等式可看作为:其中,Z为⼀个2*2的矩阵,e为⼀个2*1的向量,为了要使d能够得到解,则Z需要满⾜条件,即Z*Z'矩阵可逆,其中Z'为Z矩阵的转置(ZT),在⼀般情况下,⾓点具有这样的特点。
视觉SLAM⼗四讲——LK光流主要内容 直接法是从光流演变⽽来的。
光流(Optical Flow)描述了像素在图像中的运动,⽽直接法则附带着⼀个相机的运动模型。
1. 定义 描述像素随时间在像素中运动的⽅法,追踪像素在图像中运动。
追踪部分像素或全部像素分为稀疏光流和稠密光流,稀疏光流以Lucas-Kanade光流为代表,可以在SLAM中跟踪特征点的位置。
(避免随时间在两两图像之间进⾏特征点提取匹配,减少计算量,光流本省匹配需要⼀定的时间,跟踪以后可以直接⽤像素坐标信息,使⽤对极⼏何、PnP和ICP算法估计相机运动)2. LK光流 [P186-187] 1)灰度不变假设:同⼀空间点的像素灰度值,在各个图像中是固定不变的。
2) 理论公式:(两个变量的⼀次⽅程) 分别表⽰:在像素点x⽅向的梯度,像素点在x⽅向的运动速度,在像素点y⽅向的梯度,像素点在y⽅向上的梯度,像素点灰度随时间的变化量。
3)在LK光流中,我们假设某⼀个窗⼝内的像素具有相同的运动。
窗⼝⼤⼩w*w,则共有w2个⽅程。
最⼩⼆乘求解(由于像素梯度仅在局部有效,所以如果⼀次迭代不够好,可以多迭代⼏次这个⽅程)3. 光流特点 1)⾓点具有更好的辨识度,边缘次之,区块最少 2)光流法本⾝计算需要⼀定的时间,在具体SLAM系统的应⽤,根据测试进⾏选择 3)LK光流跟踪能够直接得到特征点的对应关系,实际应⽤会出现特征点跟丢的情况,不太会遇到误匹配(相对于描述⼦的⼀点优势) 4)描述⼦匹配在相机运动较⼤时仍能成功,光流必须要求相机运动是微⼩的(采集频率较⾼)。
光流的健壮性相⽐描述⼦差。
4. 代码关键点 1)根据associate.txt匹配时间点的信息,读取图像及深度信息, 2)遍历图像,第⼀幅图像提取FAST的特征点,后继续的图像利⽤光流跟踪这些特征点,删除跟踪失败的特征点 3)光流法函数调⽤: cv::calcOpticalFlowPyrLK (包括参数的调⽤,返回的结果信息等) 4)每⼀帧图像跟踪出来的特征点进⾏显⽰ 5)注意光流跟踪的点数以及光流计算耗费的时间信息参考链接代码#include <iostream>#include <fstream>#include <list>#include <vector>#include <chrono>using namespace std;#include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui.hpp>#include <opencv2/features2d/features2d.hpp>#include <opencv2/video/tracking.hpp>int main( int argc, char** argv ){if ( argc != 2 ){cout<<"usage: useLK path_to_dataset"<<endl;return1;}string path_to_dataset = argv[1];string associate_file = path_to_dataset + "/associate.txt";ifstream fin( associate_file );if ( !fin ){cerr<<"I cann't find associate.txt!"<<endl;return1;}string rgb_file, depth_file, time_rgb, time_depth;list< cv::Point2f > keypoints; // 因为要删除跟踪失败的点,使⽤listcv::Mat color, depth, last_color;for ( int index=0; index<100; index++ ){fin>>time_rgb>>rgb_file>>time_depth>>depth_file;color = cv::imread( path_to_dataset+"/"+rgb_file );depth = cv::imread( path_to_dataset+"/"+depth_file, -1 );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;// 对其他帧⽤LK跟踪特征点vector<cv::Point2f> next_keypoints;vector<cv::Point2f> prev_keypoints;for ( auto kp:keypoints )prev_keypoints.push_back(kp);vector<unsigned char> status;vector<float> error;chrono::steady_clock::time_point t1 = chrono::steady_clock::now();cv::calcOpticalFlowPyrLK( last_color, color, prev_keypoints, next_keypoints, status, error );chrono::steady_clock::time_point t2 = chrono::steady_clock::now();chrono::duration<double> time_used = chrono::duration_cast<chrono::duration<double>>( t2-t1 ); cout<<"LK Flow use time:"<<time_used.count()<<" seconds."<<endl;// 把跟丢的点删掉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++;}cout<<"tracked keypoints: "<<keypoints.size()<<endl;if (keypoints.size() == 0){cout<<"all keypoints are lost."<<endl;break;}// 画出 keypointscv::Mat img_show = color.clone();for ( auto kp:keypoints )cv::circle(img_show, kp, 10, cv::Scalar(0, 240, 0), 1);cv::imshow("corners", img_show);cv::waitKey(0);last_color = color;}return0;}结果及分析LK Flow use time:0.186846 seconds. //t1 ,对应下⾯的第⼀幅图tracked keypoints: 1749LK Flow use time:0.189048 seconds.tracked keypoints: 1742LK Flow use time:0.232017 seconds.tracked keypoints: 1703LK Flow use time:0.17844 seconds.tracked keypoints: 1676LK Flow use time:0.234777 seconds.tracked keypoints: 1664LK Flow use time:0.185145 seconds.tracked keypoints: 1656LK Flow use time:0.186722 seconds.tracked keypoints: 1641LK Flow use time:0.177791 seconds. // t2,对应下⾯的第⼆幅图tracked keypoints: 1634 结果分析: 1)根据输出结果,随着时间,相机姿态发⽣了⽐较⼤的旋转变化,跟踪的特征点数也从1749点下降到1634点; 2)从图中可以看出,随着图像视⾓的旋转,有些特征消失,新进来的特征点⽆法跟踪(可能需要对新进来的该部分特征重新进⾏提取,不然随着⾓度更⼤的时候,特征点可能完全丢失,⽆法进⾏位姿的解算)。
LK光流算法总结1.时序连续性假设:相邻图像之间的运动是连续的,即相邻帧像素之间的灰度值变化不大。
2.灰度恒定假设:在图像的小区域内,灰度值保持不变,即光流约束方程成立。
3.亮度差异小假设:两帧图像之间的光照变化较小,使得标准LK法的约束条件成立。
1.特征点选择:选择图像中的一组稀疏特征点,通常选择具有较强纹理信息或边缘明显的像素点,以便在两帧图像之间进行匹配。
2.特征匹配:通过在第一帧图像中的特征点附近,在第二帧图像中找到与之对应的点,建立点对的对应关系。
3.构造光流约束方程:利用灰度恒定假设,将特征匹配得到的点对所在的小区域内的像素灰度值进行相等约束。
4.最小二乘法求解:将光流约束方程转化为一个最小二乘问题,通过最小化目标函数来求解运动向量。
5.求解结果:得到每个特征点的运动向量,即图像中每个像素的运动速度。
1.算法简单:LK光流算法只需要基于灰度恒定假设建立光流约束方程并应用最小二乘法求解,计算量较小,易于实现。
2.对小运动和小区域适应性好:由于采用局部约束条件,LK光流算法在小运动和小区域的运动估计中表现良好。
3.特征点稀疏性:LK光流算法通过特征点的选取,使得运动向量的估计更集中在感兴趣的区域,而不是整个图像。
然而,LK光流算法也存在一些缺点:1.对大运动和非纹理区域的适应性较差:LK光流算法在大运动和非纹理区域的运动估计中容易失效,因为违反亮度恒定和小运动假设。
2.特征点选取的影响:LK光流算法的性能受到特征点选择的影响较大,如果选择的特征点不合适,可能会导致运动向量的估计精度下降。
总结而言,LK光流算法是一种简单且有效的光流估计算法,广泛应用于计算机视觉和图像处理领域。
尽管存在一些缺点,但在特定的场景下,LK光流算法仍然具有较好的性能和应用前景。
未来可以通过与其他算法的结合或改进来进一步提升其运动估计的准确性和鲁棒性。