LK光流算法总结
- 格式:doc
- 大小:375.50 KB
- 文档页数:8
光流对齐算法-概述说明以及解释1.引言1.1 概述光流对齐算法是一种用于计算图像序列中相邻帧之间运动信息的方法。
在计算机视觉领域,光流是指由于物体在连续帧间的相对运动而导致的像素亮度变化模式。
光流对齐算法通过分析图像中像素点的亮度变化,推断出像素点在不同帧间的运动轨迹和速度。
光流对齐算法的基本原理是基于两个关键假设:亮度恒定性和空间一致性。
亮度恒定性指的是在连续帧之间,同一物体的像素点的亮度保持不变;空间一致性则表明光流在相邻像素点之间应具有较高的一致性。
基于这两个假设,光流对齐算法通过优化像素点的亮度变化来估计物体在视频序列中的运动轨迹。
光流对齐算法在许多领域有着广泛的应用。
其中,视频稳定和视频压缩是最为常见的应用之一。
通过光流对齐算法,可以实现视频稳定,即抑制由于相机抖动或运动引起的视频模糊。
在视频压缩中,光流对齐算法可以用于提供更好的运动预测,以减少视频编码中的冗余信息,从而实现更高效的压缩算法。
总结而言,光流对齐算法是一种基于图像亮度变化的运动估计方法,凭借其在视频稳定和视频压缩等领域的广泛应用,成为计算机视觉领域中重要的技术手段。
本文将围绕光流算法的基本概念、光流对齐算法的原理和应用领域展开讨论,总结光流对齐算法的优点,并探讨其改进和未来发展的展望。
1.2 文章结构本文将详细介绍光流对齐算法的原理、应用领域以及相关的改进和展望。
文章的结构如下:第一部分是引言部分,其中包括以下内容:- 概述:介绍光流对齐算法的背景和意义。
探讨光流对齐算法在图像处理和计算机视觉领域的重要性。
- 文章结构:概括介绍本文的整体结构和各个部分的内容。
- 目的:明确论文的目标和意图,阐述本文旨在解决的问题。
第二部分是正文部分,主要包括以下内容:- 光流算法的基本概念:对光流算法的基本原理和概念进行详细解释,包括描述光流的定义、计算光流的方法以及光流场的特点等。
- 光流对齐算法的原理:剖析光流对齐算法的基本原理和实现方法,介绍对齐算法中使用的技术和策略,包括特征点匹配、运动估计和图像对齐等。
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跟踪算法,我们可以得到目标特征点在视频序列中的运动轨迹,并估计出目标的运动速度。
光流法应用光流法是一种计算机视觉中常用的技术,它可以用于解决运动估计、目标跟踪、视觉里程计等问题。
本文将从光流法的基本原理、应用领域以及一些常见算法进行介绍和探讨。
一、光流法的基本原理光流法是基于图像中像素亮度的变化来推测物体的运动方向和速度的一种方法。
其基本原理是假设相邻帧之间的图像存在连续性,即物体在短时间内的移动是平滑的。
根据这个假设,可以通过计算图像中每个像素点在两帧之间的亮度变化来推测物体的运动。
具体来说,光流法首先假设相邻帧之间的图像亮度的变化是由物体的运动引起的,然后利用亮度一致性约束来进行计算。
亮度一致性约束是指在相邻帧中的同一物体点的亮度是相等的。
根据这个约束,可以得到光流方程,通过求解这个方程可以得到物体的运动信息。
二、光流法的应用领域光流法在计算机视觉中有广泛的应用,下面将介绍几个常见的应用领域。
1. 运动估计:光流法可以用于估计图像中物体的运动轨迹。
通过计算物体在相邻帧之间的光流,可以得到物体的运动方向和速度信息。
这对于目标跟踪、行为分析等应用非常重要。
2. 目标跟踪:光流法可以用于目标的连续跟踪。
通过计算目标在连续帧之间的光流,可以实现对目标的跟踪和定位,从而实现目标的识别和追踪。
3. 视觉里程计:光流法可以用于计算相机在空间中的运动轨迹。
通过计算相邻帧之间的光流,可以得到相机的运动信息,进而计算相机在三维空间中的运动轨迹。
三、光流法的算法光流法有多种不同的算法,下面将介绍一些常见的算法。
1. Lucas-Kanade算法:Lucas-Kanade算法是光流法中最经典的算法之一。
它基于局部相似性的假设,通过最小化像素间的亮度差异来计算光流。
2. Horn-Schunck算法:Horn-Schunck算法是光流法中另一个经典的算法。
它通过最小化光流的平方差来计算光流,同时还考虑了平滑性约束。
3. 光流约束方程:光流约束方程是一种基于光流的模型,通过求解这个方程可以得到光流场。
《自动化技术与应用》2021年第40卷第2期工业控制与应用Industry Control and Applications基于金字塔光流法的无人机室内定点悬停设计於小杰,贺勇,刘盛华(长沙理工大学电气与信息工程学院,湖南长沙410000)摘要:针对GPS定位系统建筑物内信号弱,小型无人机很难在室内实现定点悬停。
本文提岀了一种利用计算机视觉融合惯性导航的组合控制方案。
在光流估计上,采用金字塔LK光流算法,提高特征点跟踪精度。
在速度融合上,采用卡尔曼+互补混合融合方案,提高飞行速度的准确性。
在飞行控制上,采用高度、姿态串级闭环控制方案,光流作为姿态估计的补偿值,提高飞行控制的稳定性。
最后,通过实际飞行测试,验证了该方案的可行性与先进性,较好地实现了无人机室内导航、定点悬停的目的。
关键词:小型无人机;光流法;定点悬停;姿态估计中图分类号:V249;TP391.41文献标识码:A文章编号:1003-7241(2021)002-0016-04Design of Indoor Fixed-point Hovering of UAVsBased on Pyramid Optical Flow MethodYU Xiao-jie,HE Yong,LIU Sheng-hua(School of Electrical and Information Engineering,Changsha University of Science&Technology,Changsha410000China) Abstract:For the weak signal in the building of the GPS positioning system,it is very difficult for the small drone to achieve fixed-point hovering indoors.This paper proposes a combined control method using computer vision fusion inertial navigation to achieve the expected results.In the optical flow estimation,the pyramid LK optical flow algorithm is taken to improve the tracking precision of feature points.In the speed fusion,the Kalman-complementary mixed fusion scheme is adopted to improve the accuracy of flight speed.In the flight control,the cascade closed-loop control scheme of altitude and attitude is adopted,and optical flow is used as the compensation value of attitude estimation,which improve the stability of flight control.Finally,through the actual flight test,the feasibility and advancement of the scheme are verified, which preferably achieves the purpose--indoor navigation and fixed-point hovering of the UAV.Key words:small UAVs;optical flow method;fixed-point hovering;attitude estimation1引言随着硬件技术和控制理论的日趋完善,小型无人机越来越大众化,各行各业中都能看到无人机的身影。
高速动态图像处理中的光流估计算法随着科技的发展,数字视频成为了重要的信息媒介,日益广泛的应用在医学、交通、安防等领域。
然而,视频中的信息是随时间变化的,高速图像处理必须要处理这些信息,这就需要在短时间内对高速动态图像进行处理。
在高速动态图像处理中,光流估计算法是常见的一种方法。
本文将介绍光流估计算法的原理、方法及其在高速动态图像处理中的应用。
光流估计算法原理光流估计算法是一种从连续的图像序列中计算物体运动速度的方法。
它的基本原理是,当一个物体在视频中移动时,其像素会随之移动。
事实上,这些像素点的运动方向和速度是相似的。
因此,通过计算像素的移动,可以确定物体的运动速度。
在图像处理中,光流估计通常通过在两个相邻图像中比较亮度值来实现。
基于亮度的光流估计算法可以通过计算一个像素在两幅相邻图像中的亮度变化,从而确定像素堆叠矢量和速度。
设I(x,y,t)为坐标为(x,y)、时间为t的像素的亮度值,则可以得到下列方程:I(x,y,t)=I(x+u,y+v,t+1)其中,(x,y)为当前像素的坐标,(x+u,y+v)为其在下一帧中的坐标,t和t+1是两帧的时间。
通过解决这个方程,可以得到像素运动的平均速度。
光流估计算法方法基于上述原理,有许多不同的光流估计算法。
这里我们介绍两个常用的方法:基于最小化光流误差的方法这种方法是基于非线性最小二乘法的思想的,通过最小化两帧间的像素匹配误差,得出物体的运动速度。
其数学模型可以表示为:E(v)=∫∫w(w,w)[ww(w,w)+∇w(w,w)·w]²dxdy其中w=(u,v)表示像素运动的速度,I(x,y,t)表示当前像素的亮度值,It表示像素在两幅图像中的亮度变化,而∇f表示灰度的空间梯度。
优化目标为最小化误差函数E。
基于金字塔的光流估计方法基于金字塔的光流估计方法是一种多分辨率的图像处理技术。
该方法主要是为了解决金字塔上不同层次的图像的光流计算精度问题。
光流法光流是一种简单实用的图像运动的表达方式,通常定义为一个图像序列中的图像亮度模式的表观运动,即空间物体表面上的点的运动速度在视觉传感器的成像平面上的表达。
中文名:光流法属于:简单实用的图像运动表示:一种几何变化分为:匹配的方法频域的方法梯度的方法人类主要通过眼睛,耳朵和大脑来获取、处理与理解获得的信息。
然而图像具有最直观、明了、让人一看就懂的特质,因为人们获取信息70%以上依靠视觉,20%左右依靠听觉,10%左右依靠触觉和嗅觉,这就是为什么“百闻不如一见”,一幅图像说明一切问题,胜过千言万语。
计算机视觉这一领域的先驱可追溯到很早的时候,但是直到20世纪70年代后期,当计算机的性能提高到足以处理诸如图像这样的大规模数据时,计算机视觉才得到了正式的关注和发展。
计算机视觉就是用各种成象系统代替视觉器官作为输入敏感手段,由计算机来代替大脑完成处理和解释,也包括对视觉信息的采集,传输,处理,存储与理解等过程。
计算机视觉最终研究目标就是使计算机能像人那样通过视觉观察和理解世界,具有自主适应环境的能力,要经过长期的努力才能达到的目标。
因此,在实现最终目标以前,人们努力的中期目标是建立一种视觉系统,这个系统能依据视觉敏感和反馈的某种程度的智能完成一定的任务。
计算机视觉应用领域较广泛,包括航空航天、卫星照片、军事导弹精确制导、移动机器人视觉导航、工业自动化系统、医学辅助诊断等。
计算机视觉系统的结构形式很大程度上依赖于其具体应用方向。
有些是独立工作的,用于解决具体的测量或检测问题,也有些作为某个大型复杂系统的组成部分出现,比如工业控制系统,汽车导航系统。
计算机视觉系统的具体实现方法同时也由其功能决定,有些是预先固定的,有些是在运行过程中自动学习调整。
尽管如此,以下几个功能却几乎是每个计算机系统都需要具备的。
图像获取,一幅数字图像是由一个或多个图像感知器产生的,例如摄像机,红外遥感摄像仪,雷达,超声波接收器等,所产生的图片包括二维图像,三维图像或者一个图像序列。
光流法原理光流法(Optical Flow)是一种常见的计算机视觉算法,用于估计图像中物体表面上的像素点在连续帧之间的运动方向和速度。
这一技术是基于一个基本假设,即在连续的图像帧之间,相邻像素的亮度是连续变化的。
光流法的基本原理是从图像序列中计算特征点的运动向量,从而估计物体运动的轨迹。
这种方法根据像素之间的亮度变化模式寻找匹配点,进而确定两个图像帧之间的像素点的位移量。
通过分析这些位移量,可以推导出各个像素的运动速度和方向。
光流法的基本假设是在一些时间点上,相邻像素之间在空间上的运动矢量是相似的。
根据这个假设,我们可以得到一个基本的数学表达式: I(x,y,t) = I(x+dx, y+dy, t+dt)其中,I(x,y,t)是在位置(x,y)和时间t上图像的灰度值,(dx,dy)是像素点在(x,y)上的位移,dt是两帧之间的时间间隔。
在实际应用中,光流法的计算可以通过各种不同的方法来实现。
其中最常用的是基于亮度变化的约束条件和全局优化的方法。
基于亮度变化的约束条件的光流法假设相邻像素之间的亮度变化是线性的,并将亮度变化作为一个约束条件。
具体来说,它尝试通过解决以下方程组来计算像素的运动向量:∑((I_x*dX+I_y*dY+I_t))=0其中,I_x,I_y和I_t是给定像素点上的灰度梯度,dX和dY是像素在空间上的偏移量,∑代表对所有像素求和。
全局优化的方法则尝试通过最小化一个能量函数来同时估计所有像素的运动向量。
这种方法的主要思想是通过优化一个能量函数来找到整个图像中最优的运动向量分布。
最常用的能量函数是基于亮度约束和光滑性约束的二次能量函数。
对于大规模运动的物体,光流法可能会产生较大的误差。
这时可以采用金字塔算法或更复杂的方法来提高精度。
金字塔算法通过在不同的图像分辨率上进行光流计算,然后逐步递推和优化,得到更准确的结果。
总结来说,光流法通过分析图像中像素的亮度变化模式来估计物体的运动方向和速度。
光流匹配算法-回复光流匹配算法: 优化计算机视觉中的运动跟踪引言:在计算机视觉领域中,光流是指由运动物体反射的光线在图像中的移动。
通过分析这些光线的移动,我们可以获取关于物体运动和场景的有用信息。
光流匹配算法是一种常用的计算机视觉技术,用于跟踪物体运动和场景中的运动变化。
本文将深入探讨光流匹配算法的原理、应用和优化方法。
一、光流匹配算法的原理光流匹配算法基于一个基本假设:在连续两帧图像中,相邻像素之间的亮度保持不变。
根据这个假设,我们可以确定两幅图像之间的每个像素的运动矢量。
光流匹配算法通过计算每个像素的运动矢量来实现。
最常用的光流匹配算法是基于约束法的方法。
这种方法通过约束光流匹配问题来降低计算复杂度。
约束包括亮度一致性约束和光滑性约束。
亮度一致性约束要求相邻像素之间的亮度变化应该与基本假设一致。
通过计算两帧图像之间的亮度差异,我们可以确定每个像素的运动矢量。
光滑性约束是指运动矢量具有一定的空间连续性。
这个约束可以通过计算邻近像素的运动矢量来实现。
如果邻近像素的运动相似,我们可以假设当前像素的运动矢量与邻近像素的运动矢量相似。
二、光流匹配算法的应用光流匹配算法在计算机视觉中有广泛的应用。
下面列举了一些常见的应用场景:1. 目标跟踪:通过分析光流,我们可以跟踪目标物体的运动轨迹。
这在许多领域中都很有用,如智能监控、自动驾驶等。
2. 视频稳定:通过分析光流,我们可以检测和纠正视频中的抖动和晃动。
这对于提高视频质量和减少用户的观看不适感非常重要。
3. 动作识别:通过分析运动的光流,我们可以识别人体或动物的特定动作。
这对于人机交互、运动分析和健康监测等领域非常有用。
4. 姿态估计:通过分析光流,我们可以推断物体或人体的姿态和姿势。
这对于虚拟现实、增强现实和3D建模等应用非常重要。
三、光流匹配算法的优化方法光流匹配算法在实际应用中往往面临计算复杂度高和噪声敏感等问题。
为了解决这些问题,研究者们提出了许多优化方法。
光流法是比较经典的运动估计方法,本文不仅叙述简单明了,而且附代码,故收藏.在空间中,运动可以用运动场描述。
而在一个图像平面上,物体的运动往往是通过图像序列中不同图象灰度分布的不同体现的。
从而,空间中的运动场转移到图像上就表示为光流场,光流场反映了图像上每一点灰度的变化趋势。
光流可以看作带有灰度的像素点在图像平面运动产生的瞬时速度场。
下面我们推导光流方程:假设E(x,y,t)为(x,y)点在时刻t的灰度(照度)。
设t+dt时刻该点运动到(x+dx,y+dy)点,他的照度为E(x+dx,y+dy,t+dt)。
我们认为,由于对应同一个点,所以E(x,y,t) = E(x+dx,y+dy,t+dt) ——光流约束方程将上式右边做泰勒展开,并令dt->0,则得到:Exu+Eyv+Et = 0,其中:Ex = dE/dx Ey = dE/dy Et = dE/dt u = dx/dt v = dy/dt上面的Ex,Ey,Et的计算都很简单,用离散的差分代替导数就可以了。
光流法的主要任务就是通过求解光流约束方程求出u,v。
但是由于只有一个方程,所以这是个病态问题。
所以人们提出了各种其他的约束方程以联立求解。
但是由于我们用于摄像机固定的这一特定情况,所以问题可以大大简化。
摄像机固定的情形在摄像机固定的情形下,运动物体的检测其实就是分离前景和背景的问题。
我们知道对于背景,理想情况下,其光流应当为0,只有前景才有光流。
所以我们并不要求通过求解光流约束方程求出u,v。
我么只要求出亮度梯度方向的速率就可以了,即求出sqrt(u*u+v*v)。
而由光流约束方程可以很容易求到梯度方向的光流速率为V = abs(Et/sqrt(Ex*Ex+Ey*Ey))。
这样我们设定一个阈值T。
V(x,y) > T 则(x,y)是前景,反之是背景C++实现在实现摄像机固定情况的光流法时,需要有两帧连续的图像,下面的算法针对RGB24格式的图像计算光流:void calculate(unsigned char* buf){int Ex,Ey,Et;int gray1,gray2;int u;int i,j;memset(opticalflow,0,width*height*sizeof(int));memset(output,255,size);for(i=2;i<height-2;i++){for(j=2;j<width-2;j++){gray1 = int(((int)(buf[(i*width+j)*3])+(int)(buf[(i*width+j)*3+1])+(int)(buf[(i*width+j)*3+2]))*1.0/3);gray2 = int(((int)(prevframe[(i*width+j)*3])+(int)(prevframe[(i*width+j)*3+1])+(int)(prevframe[(i*width+j)*3+2]))*1.0/3);Et = gray1 - gray2;gray2 = int(((int)(buf[(i*width+j+1)*3])+(int)(buf[(i*width+j+1)*3+1])+(int)(buf[(i*width+j+1)*3+2]))*1.0/3);Ex = gray2 - gray1;gray2 = int(((int)(buf[((i+1)*width+j)*3])+(int)(buf[((i+1)*width+j)*3+1])+(int)(buf[((i+1)*width+j)*3+2]))*1.0/3);Ey = gray2 - gray1;Ex = ((int)(Ex/10))*10;Ey = ((int)(Ey/10))*10;Et = ((int)(Et/10))*10;u = (int)((Et*10.0)/(sqrt((Ex*Ex+Ey*Ey)*1.0))+0.1);opticalflow[i*width+j] = u;if(abs(u)>10){output[(i*width+j)*3] = 0;output[(i*width+j)*3+1] = 0;output[(i*width+j)*3+2] = 0;}}}memcpy(prevframe,buf,size);}///////////////////////////////////////////////////////////////////////////另一个代码//////////////////////////////////////////////////////////////////////////////WW_RETURN HumanMotion::ImgOpticalFlow(IplImage *pre_grey,IplImage *grey)/*************************************************Function:Description: 光流法计算运动速度与方向Date: 2006-6-14Author:Input:Output:Return:Others:*************************************************/{IplImage *velx = cvCreateImage( cvSize(grey->width ,grey->height),IPL_DEPTH_32F, 1 ); IplImage *vely = cvCreateImage( cvSize(grey->width ,grey->height),IPL_DEPTH_32F, 1 ); velx->origin = vely->origin = grey->origin;CvSize winSize = cvSize(5,5);cvCalcOpticalFlowLK( prev_grey, grey, winSize, velx, vely );cvAbsDiff( grey,prev_grey, abs_img );cvThreshold( abs_img, abs_img, 29, 255, CV_THRESH_BINARY);CvScalar xc,yc;for(int y =0 ;y<velx->height; y++)for(int x =0;x<velx->width;x++ ){xc = cvGetAt(velx,y,x);yc = cvGetAt(vely,y,x);float x_shift= (float)xc.val[0];float y_shift= (float)yc.val[0];const int winsize=5; //计算光流的窗口大小if((x%(winsize*2)==0) && (y%(winsize*2)==0) ){if(x_shift!=0 || y_shift!=0){if(x>winsize && y>winsize && x <(velx->width-winsize) && y<(velx->height-winsize) ) {cvSetImageROI( velx, cvRect( x-winsize, y-winsize, 2*winsize, 2*winsize));CvScalar total_x = cvSum(velx);float xx = (float)total_x.val[0];cvResetImageROI(velx);cvSetImageROI( vely, cvRect( x-winsize, y-winsize, 2*winsize, 2*winsize));CvScalar total_y = cvSum(vely);float yy = (float)total_y.val[0];cvResetImageROI(vely);cvSetImageROI( abs_img, cvRect( x-winsize, y-winsize, 2*winsize, 2*winsize));CvScalar total_speed = cvSum(abs_img);float ss = (float)total_speed.val[0]/(4*winsize*winsize)/255;cvResetImageROI(abs_img);const double ZERO = 0.000001;const double pi = 3.1415926;double alpha_angle;if(xx<ZERO && xx>-ZERO)alpha_angle = pi/2;elsealpha_angle = abs(atan(yy/xx));if(xx<0 && yy>0) alpha_angle = pi - alpha_angle ;if(xx<0 && yy<0) alpha_angle = pi + alpha_angle ;if(xx>0 && yy<0) alpha_angle = 2*pi - alpha_angle ;CvScalar line_color;float scale_factor = ss*100;line_color = CV_RGB(255,0,0);CvPoint pt1,pt2;pt1.x = x;pt1.y = y;pt2.x = static_cast<int>(x + scale_factor*cos(alpha_angle));pt2.y = static_cast<int>(y + scale_factor*sin(alpha_angle));cvLine( image, pt1, pt2 , line_color, 1, CV_AA, 0 );CvPoint p;p.x = (int) (pt2.x + 6 * cos(alpha_angle - pi / 4*3));p.y = (int) (pt2.y + 6 * sin(alpha_angle - pi / 4*3));cvLine( image, p, pt2, line_color, 1, CV_AA, 0 );p.x = (int) (pt2.x + 6 * cos(alpha_angle + pi / 4*3));p.y = (int) (pt2.y + 6 * sin(alpha_angle + pi / 4*3));cvLine( image, p, pt2, line_color, 1, CV_AA, 0 );/*line_color = CV_RGB(255,255,0);pt1.x = x-winsize;pt1.y = y-winsize;pt2.x = x+winsize;pt2.y = y+winsize;cvRectangle(image, pt1,pt2,line_color,1,CV_AA,0);*/}}}}cvShowImage( "Contour", abs_img);cvShowImage( "Contour2", vely);cvReleaseImage(&velx);cvReleaseImage(&vely);cvWaitKey(20);return WW_OK;}。
运动目标检测之Lucas-Kanade光流算法读书笔记 视觉是人类感知自身周围复杂环境最直接有效的手段之一, 而在现实生活中 大量有意义的视觉信息都包含在运动中,人眼对运动的物体和目标也更敏感,能够快速的发现运动目标。随着计算机技术、 通信技术、图像处理技术的不断发展,计算机视觉己成为目前的热点研究问题之一。 而运动目标检测是计算机视觉研究的核心课题之一, 融合了图像处理、 模式识别、人工智能、自动控制、计算机等众多领域的先进技术,在军事制导、 视觉导航、视频监控、智能交通、医疗诊断、工业产品检测等方面有着重要的实 用价值和广阔的发展前景。
一目标检测 运动目标检测 运动目标检测是指从序列图像中将运动的前景目标从背景图像中提取出来。目前,已有的运动目标检测方法按照算法的基本原理可以分为三类:背景差分法,帧间差分法和光流法。
1背景差分法 背景差分法又称背景减除法,背景差分法的原理是将当前帧与背景图像进行差分来得到运动目标区域,但是需要构建一幅背景图像,这幅背景图像必须不含运动目标,并且应该能不断的更新来适应当前背景的变化,构建背景图像的方法有很多,比较常用的有基于单个高斯模型的背景构建,基于混合高斯模型的背景构建,基于中值滤波器的背景构造,基于卡尔曼滤波器的背景构造,基于核函数密度估计的背景模型构造。
缺点:因为要求背景是静止的,所以背景的变化,场景中有很多干扰,比如场景中有树枝和叶子在风中晃动、水面的波动等等,还有照明的变化和天气的变化等都可能影响检测的结果
2帧间差分法 帧间差分法是一种通过对视频图像序列中相邻两帧作差分运算来获得运动目标轮廓的方法,它可以很好地适用于存在多个运动目标和摄像机移动的情况。当监控场景中出现异常物体运动时,帧与帧之间会出现较为明显的差别,两帧相减,得到两帧图像亮度差的绝对值,判断它是否大于阈值来分析视频或图像序列的运动特性,确定图像序列中有无物体运动。图像序列逐帧的差分,相当于对图像序列进行了时域下的高通滤波。
缺点:不能提取出对象的完整区域,只能提取出边界;同时依赖于选择的帧间时间间隔。对快速运动的物体,需要选择较小的时间间隔,如果选择不合适,当物体在前后两帧中没有重叠时,会被检测为两个分开的物体:而对慢速运动的物体,应该选择较大的时间差,如果时间选择不适当,当物体在前后两帧中几乎完全重叠时,则检测不到物体。
3光流算法 光流,它是一种运动模式,这种运动模式指的是一个物体、表面、边缘在一个视角下由一个观察者(比如眼睛、摄像头等)和背景之间形成的明显移动。光流技术,如运动检测和图像分割,时间碰撞,运动补偿编码,三维立体视差,都是利用了这种边缘或表面运动的技术。光流是空间运动物体在观测成像面上的像素运动的瞬时速度,光流的研究是利用图像序列中的像素强度的时域变化和相关性来确定各自像素位置的运动,即研究图像灰度在时间上的变化与场景中物体结构及其运动的关系。
图1 运动场与光流场对应关系图 光流算法评估了两幅图像的之间的变形,它的基本假设是体素和图像像素守恒。它假设一个物体的颜色在前后两帧没有巨大而明显的变化。基于这个思路,我们可以得到图像约束方程。不同的光流算法解决了假定了不同附加条件的光流问题。
二Lucas–Kanade算法 在计算机视觉中,Lucas–Kanade光流算法是一种两帧差分的光流估计算法。这个算法是最常见,最流行的。它由Bruce D. Lucas 和 Takeo Kanade提出。它假定在所考虑的像素的局部邻域内,本质上光流是恒定的,由此利用最小二乘法原则对邻域内所有像素求解基本光流方程。
Lucas–Kanade光流法是一种基于梯度的局部参数化光流估计方法,该算法假定在一个空间尺寸的邻域E中光流矢量是恒定的,然后使用加权最小二乘法(weighted least squares)估计光流。它计算两帧在时间t 到t + δt之间每个像素点位置的移动。 由于它是基于图像信号的泰勒级数,这种方法称为差分,这就是对于空间和时间坐标使用偏导数。
LK算法基于以下三个假设: 1)亮度恒定。 2)时间连续或者是运动是“小运动”。 3)空间一致,临近点有相似运动,保持相邻。 假设1亮度恒定的假设即为了保证其等号成立不受亮度的影响,假设2是为了保证KLT能够找到点,假设3则为以下原因假设,即对于同一个窗口中,所有的点的偏移量都相等。
图像约束方程可以写为: I (x ,y ,t ) = I (x + δx ,y + δy,t + δt ) (1) 其中,(x, y, t) 为在(x,y)位置的像素。 我们假设移动足够的小,那么对图像约束方程使用泰勒公式,我们可以得到:
(,,)(,,)IIIIxdxydytdtIxytdxdydtxyt (2)
因为移动足够小所以忽略二阶和更高阶的项。从这个方程中我们可以得到: (3)
对t求导,令,dxdyuvdtdt分别表示水平方向、垂直方向的光流速度,表示某方向的梯度,用一阶差分代替一阶微分,于是光流基本计算公式有一般形式:
XytIuIvI (4) u, v分别是I(x,y,t)的光流向量中x,y的组成。和则是图像在(x ,y ,t )这一点相应方向的差分 。
方程④有两个未知量,尚不能被解决,这也就是所谓光流算法的光圈问题。那么要找到光流向量则需要另一套解决的方案。而Lucas-Kanade算法是一个非迭代的算法。 将上式写为矩阵相乘形式:
xytuIIIv
(5)
LK光流:假设像素流在一个大小为m*m(m>1)的小窗中是一致的,那么从像素1...n , n = m^2 中可以得到下列一组方程:
(6) 图2 LK光流算法示意图 将⑥写成矩阵的形式,则有: (7) 式⑦两个个未知数但是有多于两个的方程,这个方程组自然是个超定方程,也就是说方程组内有冗余
为了解决这个超定问题,我们采用最小二乘法解Aub的向量u:
(8) 得到: 1()TTuAAAb
(9)
考虑矩阵的可逆性: 22[]xxyTxyyIIIAAIII
(10) 其中的求和是从1到n。 于是得:
(11) 加权窗口:述普通的最小二乘解对窗口内n个像素qi一视同仁。事实上,通常对于靠近中心像素p的像素更多的权重会更好。 介于此,人们使用最小二乘方程的加权版本:
(12) (13) 计算的:
(14) 权重w通常被设置为qi和p之间距离的高斯函数。 三LK光流法改进算法
1 LK方法的金字塔改进 LK方法有一个缺陷,小速度,亮度不变以及区域一致性都是较强的假设,并不很容易得到满足。如当物体运动速度较快时,假设不成立,那么后续的假设就会有较大的偏差,使得最终求出的光流值有较大的误差。 我们设邻域窗口半径为w,则光流d定义为最小化残差方程ϵ的速度: (15) 考虑物体的运动速度较大时,算法会出现较大的误差。那么就希望能减少图像中物体的运动速度。一个直观的方法就是,缩小图像的尺寸。假设当图像为400×400时,物体速度为[16 16],那么图像缩小为200×200时,速度变为[8,8]。缩小为100*100时,速度减少到[4,4]。所以在源图像缩放了很多以后,原算法又变得适用了。所以光流可以通过生成 原图像的金字塔图像,逐层求解,不断精确来求得。 假设图像的宽高每次缩放为原来的一般,共缩放了Lm层,则第0层为原图像。设已知原图的速度向量为d,则每一层的速度为
(16) 基于金字塔的光流法的大概步骤如下:现在最深层Lm中求解光流。这次计算的结果反馈给上一次Lm-1,作为该层初始时的光流值得估计g。就这样一层一层的向上反馈,直到 最高层,即原图。对于每一层L,上方程变为:
(17) 每一层的计算结果通过如下方程反馈给上一层作为初始的光流估计:
(18)
由于金字塔的缩放减小了光流值,最底层的光流估计值可以设为0,即
(19)
图3 金字塔光流示意图 2前后光流估计算法 统的光流计算方法主要是基于灰度守恒和光流场的平滑性假设,但这些假设在阴影、边界和遮挡性的地方不再成立,为此,对其进行改进。 前向-后向光流方程:
(20)
光流约束方程为:
(21)
尽管Lucas-Kanade光流法计算简单,光流估计精度较高,但它有一个致命缺点,假
定邻域Ω内各像素点光流保持恒定,而且光流计算依赖于窗口权重函数,这意味着如果在邻域Ω内存在严重违反光流约束方程的点或邻域Ω运动不连续,将使得估计的光流可靠性严重降低。为此,引入Hessian矩阵判断领域Ω内每点对于基本约束方程的“良态性”。 方程⑰分别对x和y求偏导数,可得:
(22)
写成矩阵形式,即:
(23)
定义Hessian矩阵:
(24) Hessian矩阵的条件数:
(25) 其中、分别为Hessian矩阵H的最大特征值和最小特征值,可以通过Hessian矩阵的条件数大小来判断方程(23)解的稳定性,如果Hessian矩阵的条件数很大则方程(23)