这段时间,本人主要对视频前景提取算法进行了学习,在此写下学习笔记~希望与各位看客多交流学习(本学习笔记部分来自我的三位师弟的调研报告~由于保密隐私,不在此公开,但是非常感谢三位师弟~),好下面进入正题
前景是图像或视频场景中可见性、显著性更强的部分。前景检测,即在视频中识别感兴趣区域或识别运动目标(前景)和静态部分(背景)的过程。它是运动分析、视频监控的关键步骤,也是最基础和底层的步骤。前景检测结果的效果直接关系到后续分析与应用处理的性能的好坏。前景检测在计算机视觉中应用广泛,是计算机视觉与模式识别领域的一个研究热点和前沿课题。常用的前景检测算法有:帧差法、背景建模法、光流法、平均背景法、背景非参数估计、前景建模法等。而传统的目标跟踪算法如camshift、meanshift、粒子滤波等可能不适用于前景检测
前景检测原理框图如下图所示。一般来说,在输入视频图像之后,可以根据采用的前景检测算法的需要对图像进行预处理。同样,在前景检测之后,也可以根据需要再对图像做相应的后处理。
前景检测的目标是在相对静态的背景之下检测出相对动态的前景目标。但是实际应用场景中因为光照条件的复杂性,摄像机的曝光性能的制约,以及背景并不是理想的静态所以区分出前景和背景是相当困难的事情。详细来说,存在以下几种难题:
- 背景的变化:包括光线强度的变化、背景中物体的变化、阴影等。场景中光线强度的变化会使得其中的图像也发生变化,可能使得这些变化部分被误检为前景目标。背景中可能存在摇曳的树枝、波动的水面这样类似的背景的位置变化。阴影甚至也可能因为与背景的不相似而被误判为前景目标。
- 遮挡:场景中可能会出现目标被其他物体全部或者部分遮挡的情况,会对前景的提取造成一定程度的干扰。例如,树木、车辆、路灯、阴影等的遮挡。
- 前景目标的非时间连续性运动:前景目标有时是最开始就出现在画面中的,而有时又是中途进入画面的。前景目标有时还会静止或者离开画面。当这样的情况发生时,都会给背景建模的质量带来一定的影响。
- 实时性要求:前景检测是基础步骤,一般的应用当中还需要许多其他后续步骤,所以采用的前景算法要求具有较好的实时性。
本博文针对帧差、背景建模、光流法三种常用的算法进行对比分析。
1、帧差法
帧间差分法是将视频流中相邻两帧或相隔几帧图像的两幅图像像素值相减,并对相减后的图像进行阈值化来提取图像中的运动区域。帧间差分法是通过对视频序列中连续的两帧图像进行差分运算来获得运动目标区域的方法。
1.1 二帧差法
设为第k帧图像,为第帧图像,两帧图像的差:
接着对两帧差值二值化:
T为二值化选取时的阈值,可根据经验选取T,若选取过大,则检测的目标可能出现较大的空洞甚至漏检,若T选取过小,将会出现噪声。二帧差法的流程图如下图所示:
帧间差分法检测目标的具体流程:
(1)利用(1.11)求出差分后的图像;
(2)对差分后的图像进行二值化,若差分图像的亮度大于T,则判定该像素为前景点,否则为背景点;
(3)对二值化后的图像进行形态学滤波来衰减噪声;
(4)进行连通性分析。采用二帧差法得到的运动内部可能存在一些空洞,需要进行连通性处理。常用的办法是先计算某一连通区的面积,如果其面积大于事先设定的阈值,那么判定此区域为运动前景,否则为噪声。
1.2 三帧差法
三帧差法是先对图像进行两帧差分,再对两帧差分后的图像进行“与”运算,从而可以得到两个差分图像的相同区域,避免了两帧差中检测出的目标被拉长拉高的现象。三帧差分的原理图如下图所示:
设是图像序列中相邻两帧图像和的差,是图像序列中相邻两帧图像和的差,通过选择合适的阈值对差分图像进行二值化,将差分图像序列转化为二值图像序列,将相与可得到最后的运动目标三帧差分法可用如下式子进行描述:
其中即为最后的运动目标;表示“与”运算。
算法优缺点分析:
二帧差法
优点:
①目标匀速运动,得到的物体运动目标会比较一致;
②对视觉场内的光线逐步变化不敏感;
③易于进行实时处理;
缺点:
①目标加速或减速运动,检测的目标存在多检或漏检即对目标运动方式敏感;
②对静止的物体无法检测;
③不能提取出对象的完整区域,容易产生空洞的检测;
三帧差法
优点:
①对动态检测比较灵敏;
②对随机噪声具有很好的抑制作用;
③ 对目标移动速度较快具有很好的检测效果;
缺点:
①差分图像的检测阈值需要手动设定;
②物体移动速度较慢时容易丢失轮廓;
③空洞仍然存在
帧间差分法检测到的区域大小受物体的运动速度制约:对快速运动的物体,需要选择较小的时间间隔,如果选择不合适,当物体在前后两帧中没有重叠时,会被检测为两个分开的物体;对于慢速运动的物体,应该选择较大的时间差,如果时间选择不适当,当物体在前后两帧中几乎完全重叠时,则检测不到物体。
帧间差分法检测的目标不完整,内部含有“空洞”,这是因为运动目标在相邻帧之间的位置变化缓慢,目标内部在不同帧图像中相重叠的部分很难检测出来。不能完全提取所有相关的特征像素点,也不能得到运动目标的完整轮廓,只能得到运动区域的大致轮廓;
三帧差分法利用视频序列两帧之间运动目标位置差别很小的前提条件,引入上一帧与当前帧作差,然后将差值和下一帧与当前帧的差值作一个“与”运算,则基于此时运动目标变化区域的灰度值设定灰度检测门限可以较准确地得到运动目标在视频图像中的位置,以此为据,提取运动目标。这样可有效解决前后帧的遮挡问题,并克服了帧间差分法的不足之处。
三帧差法减少“双影”现象(物体运动过快时会发生)的原因:二帧差法中连续两帧图像差分之后出现2个影子,而三帧差法是采用上一帧与当前帧作差,将差值和下一帧与当前帧差值去做一个“与”运算,两个差值取交集后就可以得到真正的那个影子。
在运动目标检测中,无论是使用二帧差法还是使用三帧差法,其对阈值的选取十分重要,阈值选取的好坏将直接决定检测目标效果的好坏,
算法 | 优点 | 缺点 |
一维OTSU算法 | 计算速度快,自适应强 | 抗噪能力差,没有考虑图像像素点间的关系,不能很有效地对含噪图像进行处理 |
二维OTSU算法 | 抗噪能力强,图像分割效果好,自适应能力很好 | 时间复杂度较高,计算速度较慢 |
一维交叉熵阈值分割 | 计算速度较快,图像分割效果较好 | 只考虑图像各像素点地灰度信息,抗噪能力较差 |
二维交叉熵阈值分割 | 抗噪能力最强,图像分割效果最好,自适应能力很好 | 时间复杂度最高,计算速度最慢 |
帧差法实现代码:
#include<iostream>
#include<opencv2\core\core.hpp>
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
VideoCapture capture = VideoCapture("666666.avi");
if (!capture.isOpened())
{
cout << "didn't find this video" << endl;
system("pause");
}
Mat previousFrame, previousFrameF;//定义float用于做减运算
Mat frame, frameF;
Mat currentFrame, currentFrameF;
int frameNum = 0;
capture >> frame;
while (1)
{
capture >> frame;
if (frame.empty())
{
break;
}
frameNum++;
if (frameNum == 1)//第一帧先进行初始化
{
previousFrame.create(frame.size(), CV_8UC1);
currentFrame.create(frame.size(), CV_8UC1);
previousFrameF.create(frame.size(), CV_32FC1);
currentFrameF.create(frame.size(), CV_32FC1);
frameF.create(frame.size(), CV_32FC1);
}
if (frameNum >= 2)
{
cvtColor(frame, currentFrame, CV_BGR2GRAY);
currentFrame.convertTo(frameF, CV_32FC1);
previousFrame.convertTo(previousFrameF, CV_32FC1);
//做差求绝对值
absdiff(frameF, previousFrameF, currentFrameF);
currentFrameF.convertTo(currentFrame, CV_8UC1);
//阈值化处理
threshold(currentFrame, currentFrame, 30, 255, CV_THRESH_BINARY);
}
//把当前帧保存作为下一次处理的前一帧
cvtColor(frame, previousFrame, CV_BGR2GRAY);
//输出显示图像
if (frameNum == 6)
{
imwrite("第6帧.png", currentFrame);
}
if (frameNum == 26)
{
imwrite("第26帧.png", currentFrame);
}
if (frameNum == 66)
{
imwrite("第66帧.png", currentFrame);
}
if (frameNum == 106)
{
imwrite("第106帧.png", currentFrame);
}
if (frameNum == 266)
{
imwrite("第266帧.png", currentFrame);
}
if (frameNum == 629)
{
imwrite("第629帧.png", currentFrame);
}
imshow("shipin", frame);
imshow("qianjing", currentFrame);
waitKey(26);
}
return 0;
}
结果截图:
2、背景建模
2.1平均背景建模
2.2混合高斯模型(GMM/MOG)
2.3(MOG2)
2.4 CODEBOOK
2.5 ViBe
2.6 一个背景建模的库BgsLibrary
3、光流法
首先给出光流法理论背景
1.什么是光流法
光流(optical flow)是空间运动物体在观察成像平面上的像素运动的瞬时速度。光流法是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对应关系,从而计算出相邻帧之间物体的运动信息的一种方法。通常将二维图像平面特定坐标点上的灰度瞬时变化率定义为光流矢量。
2.光流的物理意义
一般而言,光流是由于场景中前景目标本身的移动、相机的运动,或者两者的共同运动所产生的。当人的眼睛观察运动物体时,物体的景象在人眼的视网膜上形成一系列连续变化的图像,这一系列连续变化的信息不断“流过”视网膜(即图像平面),好像一种光的“流”,故称之为光流。光流表达了图像的变化,由于它包含了目标运动的信息,因此可被观察者用来确定目标的运动情况。下图展示的便是三维空间内物体的运动在二维成像平面上的投影。得到的是一个描述位置变化的二维矢量,但在运动间隔极小的情况下,我们通常将其视为一个描述该点瞬时速度的二维矢量,称为光流矢量。
3.光流场
在空间中,运动可以用运动场描述,而在一个图像平面上,物体的运动往往是通过图像序列中不同图像灰度分布的不同体现的,从而,空间中的运动场转移到图像上就表示为光流场(optical flow field)。光流场是一个二维矢量场,它反映了图像上每一点灰度的变化趋势,可看成是带有灰度的像素点在图像平面上运动而产生的瞬时速度场。它包含的信息即是各像点的瞬时运动速度矢量信息。研究光流场的目的就是为了从序列图像中近似计算不能直接得到的运动场。光流场在理想情况下,光流场对应于运动场。
光流法基本原理
1.基本假设条件(三个基本假设)
(1)亮度恒定不变。即同一目标在不同帧间运动时,其亮度不会发生改变。这是基本光流法的假定(所有光流法变种都必须满足),用于得到光流法基本方程;
(2)时间连续或运动是“小运动”。即时间的变化不会引起目标位置的剧烈变化,相邻帧之间位移要比较小。同样也是光流法不可或缺的假定。
(3)保持空间一致性。即同一子图像的像素点具有相同的运动。
2.基本约束方程
考虑一个像素I(x,y,t)在第一帧的光强度(其中t代表其所在的时间维度)。它移动了 (dx,dy)的距离到下一帧,用了dt时间。因为是同一个像素点,依据上文提到的第一个假设我们认为该像素在运动前后的光强度是不变的,即:
将上式右端进行泰勒展开,得:
其中ε代表二阶无穷小项,可忽略不计。再将(2)代人(1)后同除dt,可得:
设u,v分别为光流分别为沿X轴与Y轴的速度矢量,得:
令分别表示图像中像素点的灰度沿X,Y,T方向的偏导数。
综上,式(3)可以写为:
其中,均可由图像数据求得,而即为所求光流矢量。
约束方程只有一个,而方程的未知量有两个,这种情况下无法求得u和v的确切值。这种不确定性称为“孔径问题”。此时需要引入另外的约束条件,从不同的角度引入约束条件,导致了不同光流场计算方法。按照理论基础与数学方法的区别把它们分成四种:基于梯度(微分)的方法、基于匹配的方法、基于能量(频率)的方法、基于相位的方法和神经动力学方法。
如上图所示,假设有两张图片。如何计算H到I中像素点之间的运动?显然,对于H中特定的橡素点,应该在I图片中对应位置的周围来寻找像数值一致或者接近一致的橡素点。当世界足够小时,偏移量近似等于偏移速率。
光流法用于目标检测的原理:给定图像中的每个橡素点赋予一个速度矢量,这样就形成了一个运动矢量场。在某一特定时刻,图像上的点与三维物体上的点一一对应,这种对应关系可以
补充说明:通过最小二乘法获得光流场这是比较容易理解的,但问题是,如何获得像素强度值是一个关于图像坐标x、y以及时间(第几帧)t的函数。在opencv中应该是经过输入函数calcOpticalFlowFarneback()的第一、第二个参数(前后两帧图片)求得的,但是具体如何求I应该查看opencv源码可以找出来(本人目前还不知道具体如何求出,如有读者知晓,请不吝赐教?)
3.几种光流估计算法的简介
1) 基于梯度的方法
基于梯度的方法又称为微分法,它是利用时变图像灰度(或其滤波形式)的时空微分(即时空梯度函数)来计算像素的速度矢量。
由于计算简单和较好的结果,该方法得到了广泛应用和研究。典型的代表是Horn-Schunck算法与Lucas-Kanade(LK)算法。
Horn-Schunck算法在光流基本约束方程的基础上附加了全局平滑假设,假设在整个图像上光流的变化是光滑的,即物体运动矢量是平滑的或只是缓慢变化的。
基于此思想,大量的改进算法不断提出。Nagel采用有条件的平滑约束,即通过加权矩阵的控制对梯度进行不同平滑处理;Black和Anandan针对多运动的估计问题,提出了分段平滑的方法。
2) 基于匹配的方法
基于匹配的光流计算方法包括基于特征和区域的两种。
基于特征的方法不断地对目标主要特征进行定位和跟踪,对目标大的运动和亮度变化具有鲁棒性。存在的问题是光流通常很稀疏,而且特征提取和精确匹配也十分困难。
基于区域的方法先对类似的区域进行定位,然后通过相似区域的位移计算光流。这种方法在视频编码中得到了广泛的应用。然而,它计算的光流仍不稠密。另外,这两种方法估计亚像素精度的光流也有困难,计算量很大。
3)基于能量的方法
基于能量的方法又称为基于频率的方法,在使用该类方法的过程中,要获得均匀流场的准确的速度估计,就必须对输入的图像进行时空滤波处理,即对时间和空间的整合,但是这样会降低光流的时间和空间分辨率。基于频率的方法往往会涉及大量的计算,另外,要进行可靠性评价也比较困难。
4)基于相位的方法
基于相位的方法是由Fleet和Jepson提出的,Fleet和Jepson最先提出将相位信息用于光流计算的思想。当我们计算光流的时候,相比亮度信息,图像的相位信息更加可靠,所以利用相位信息获得的光流场具有更好的鲁棒性。基于相位的光流算法的优点是:对图像序列的适用范围较宽,而且速度估计比较精确,但也存在着一些问题:第一,基于相位的模型有一定的合理性,但是有较高的时间复杂性;第二,基于相位的方法通过两帧图像就可以计算出光流,但如果要提高估计精度,就需要花费一定的时间;第三,基于相位的光流计算法对图像序列的时间混叠是比较敏感的。
5)神经动力学方法
神经动力学方法是利用神经网络建立的视觉运动感知的神经动力学模型,它是对生物视觉系统功能与结构比较直接的模拟。
尽管光流计算的神经动力学方法还很不成熟,然而对它的研究却具有极其深远的意义。随着生物视觉研究的不断深入,神经方法无疑会不断完善,也许光流计算乃至计算机视觉的根本出路就在于神经机制的引入。神经网络方法是光流技术的一个发展方向。
3.稠密光流与稀疏光流
除了根据原理的不同来区分光流法外,还可以根据所形成的光流场中二维矢量的疏密程度将光流法分为稠密光流与稀疏光流两种。
-
稠密光流
稠密光流是一种针对图像或指定的某一片区域进行逐点匹配的图像配准方法,它计算图像上所有的点的偏移量,从而形成一个稠密的光流场。通过这个稠密的光流场,可以进行像素级别的图像配准。
Horn-Schunck算法以及基于区域匹配的大多数光流法都属于稠密光流的范畴。
图(4) 基于区域匹配方法生成稠密光流场图例
由于光流矢量稠密,所以其配准后的效果也明显优于稀疏光流配准的效果。但是其副作用也是明显的,由于要计算每个点的偏移量,其计算量也明显较大,时效性较差。
-
稀疏光流
与稠密光流相反,稀疏光流并不对图像的每个像素点进行逐点计算。它通常需要指定一组点进行跟踪,这组点最好具有某种明显的特性,例如Harris角点等,那么跟踪就会相对稳定和可靠。稀疏跟踪的计算开销比稠密跟踪小得多。
上文提到的基于特征的匹配方法是典型的属于稀疏光流的算法。
图(5) 基于特征匹配方法生成稀疏光流场图例
Lucas-Kanade(LK)光流法
LK光流法于1981年提出,最初是用于求稠密光流的,由于算法易于应用在输入图像的一组点上,而成为求稀疏光流的一种重要方法。
LK光流法在原先的光流法两个基本假设的基础上,增加了一个“空间一致”的假设,即所有的相邻像素有相似的行动。也即在目标像素周围m×m的区域内,每个像素均拥有相同的光流矢量。以此假设解决式 Ixu+Iyv+It=0 无法求解的问题。
-
LK光流法约束方程
在一个小邻域内,LK光流法通过对下式的加权平方和最小化来估计光流矢量
(x,y∈Ω)W2xIxu+Iyv+It2 (6)
上式中W2是一个窗口权重函数,该函数使得邻域中心的加权比周围的大。对于Ω内的n个点X1⋯Xn,设
(7)
令A=(∇IX1,…,∇I(Xn))T,即A=IxX1IyX1IxX2IxX2⋮⋮IxXnIxXn
令W=diag(WX1,…W(Xn)),即W=W(X1)0000W(X2)00⋮⋮⋱⋮000W(Xn)
令b=-∂I(X1)∂t,…,∂I(Xn)∂tT,即b=ItX1ItX2⋮ItXn
故上面方程的解可由最小二乘法得到:
ATW2AV=ATW2b
最后得:
V=(ATW2A)-1ATW2b
通过结合几个邻近像素点的信息,LK光流法通常能够消除光流方程里的多义性。而且,与逐点计算的方法相比,LK方法对图像噪声不敏感。
-
金字塔LK光流法
LK算法的约束条件即:小速度,亮度不变以及区域一致性都是较强的假设,并不很容易得到满足。如当物体运动速度较快时,假设不成立,那么后续的假设就会有较大的偏差,使得最终求出的光流值有较大的误差。图像金字塔可以解决这个问题。
考虑物体的运动速度较大时,算法会出现较大的误差。那么就希望能减少图像中物体的运动速度。一个直观的方法就是,缩小图像的尺寸。假设当图像为400×400时,物体速度为[16 16],那么图像缩小为200×200时,速度变为[8,8]。缩小为100*100时,速度减少到[4,4]。所以在源图像缩放了很多以后,原算法又变得适用了。所以光流可以通过生成 原图像的金字塔图像,逐层求解,不断精确来求得。简单来说上层金字塔(低分辨率)中的一个
像素可以代表下层的两个。
图(6) 缩小图像尺寸对光流法带来的影响
1)算法步骤简介
a.首先,对每一帧建立一个高斯金字塔,最低分辨率图像在最顶层,原始图片在底层。
b.计算光流。从顶层(Lm层)开始,通过最小化每个点的邻域范围内的匹配误差和,得到顶层图像中每个点的光流。
假设图像的尺寸每次缩放为原来的一半,共缩放了Lm层,则第0层为原图像。设已知原图的位移为d,则每层的位移为:
c.顶层的光流计算结果(位移情况)反馈到第Lm-1层,作为该层初始时的光流值的估计g。
d.这样沿着金字塔向下反馈,重复估计动作,直到到达金字塔的底层(即原图像)。
(准确值=估计值+残差) “残差”即本算法的关键对于每一层L,每个点的光流的计算都是基于邻域内所有点的匹配误差和最小化。
为了更好地理解金字塔LK光流法,下图简单展示了算法的实现过程:
图(7) 金字塔LK算法
2)一些实现细节
金字塔的构建
-
利用低通滤波器平滑图像
-
对平滑图像进行间隔采样,生成金字塔图像,每一层图像的高度与宽度均是下一层的二分之一。
金字塔跟踪
首先,从顶层开始计算金字塔最顶层图像上的光流。然后,根据最顶层(Lm-1) 光流的计算结果估计次顶层光流的初始值,再计算次顶层图像上光流的精确值。最后,根据次上层光流的计算结果估计下一层(Lm-2) 光流的初始值,计算其精确值后再反馈到下一 层,直至计算出最底层 的原始图像的光流。
-
初始化顶层图像光流矢量估计值为0.
-
邻域内所有像素点的匹配误差和记为:
-
对其进行求导,得:
-
对B(x+vx,y+vy)进行泰勒展开:
-
导数公式可转化为:
-
带入-It=Ax,y-Bx,y=δI与∇I=∂B∂x,∂B∂yT得:
定义:
有
-
最终得光流矢量最优解为:
观察G与b的组成,可知δI其实是两帧同层图像灰度之间的差值。而Ix,Iy分别是图像在该点处梯度的x方向分量与y方向分量。
根据δI与Ix,Iy求得空间梯度 矩阵G和b。以此得到Lm层图像的最佳光流dLm。
迭代过程
将上层图像得到的光流矢量累加值传递到下一层做为初始值,即:
可以看出,最终光流值就是所有层光流矢量的叠加。
最后我们可以总结一下使用金字塔图像计算光流的好处,它对于每一次光流的都会保持很小,但是最终计算出来的光流可以进行放大然后累计。所以利用相对较小的邻域窗口就可以处理较大的像素运动。
基于光流的运动目标检测算法
基于光流运动目标检测是在对摄像机采集到的图像序列进行重采样和去噪预处理后,利用光流法计算出各点的光流值,得出各点的光流场。然后对光流场进行阈值分割,区分出前景与背景,得到清运动目标区域。一般还会再采用形态学滤波中的开、闭运算滤除孤立噪声点,最后经过区域连通便可识别出目标区域并统计其特征信息。流程图如下:
计算输入图像的光流场 |
对光流场进行阀值分割 |
形态学滤波 开、闭运算 |
光流场区域分割 |
| |
|
|
实现原理
使用光流法进行前景检测是是基于这样一个认识:
如果图像中没有运动目标,则光流矢量在整个图像区域是连续变化的。当图像中有运动物体时,目标和背景存在着相对运动。运动物体所形成的速度矢量必然和背景的速度矢量有所不同,如此便可以计算出运动物体的位置。
图(3)现实场景的可视化光流场
通过观察上图我们可以看到,发生运动的物体的光流矢量与背景光流矢量之间存在差异。使用阀值分割可以将整幅图片的光流矢量分成两个部分,即区分出背景与前景。阀值的选取可以使用最大类间方差法(大津算法)来确定。它是按图像的灰度特性,将图像分成背景和目标两部分。背景和目标之间的类间方差越大,说明构成图像的2部分的差别越大,当部分目标错分为背景或部分背景错分为目标都会导致两部分差别变小。因此,使类间方差最大的分割意味着错分概率最小。
光流场经过阈值分割后,有一些独立的点或者有凹区域,影响了运动目标的提取。可先利用开运算,去除那些光流值与结构元素不相吻合的凹区域,同时保留那些相吻合的凹区域。然后,利用形态学滤波的闭运算,填充凹区域。
通过前面的处理,一帧图像中可能的目标区域已经成为一个可以连成一体的区域,采用合理的区域连通合并和分割技术来找出最终的目标区域。
光流法的优缺点
优点
光流法的优点在于它无须了解场景的信息,就可以准确地检测识别运动日标位置,且在摄像机处于运动的情况下仍然适用。
而且光流不仅携带了运动物体的运动信息,而且还携带了有关景物三维结构的丰富信息,它能够在不知道场景的任何信息的情况下,检测出运动对象。
缺点
光流法的适用条件,即两个基本假设,在现实情况下均不容易满足。
假设一:亮度恒定不变。
但是实际情况是光流场并不一定反映了目标的实际运动情况,如图,所示。图中,光源不动,而物体表面均一,且产生了自传运动,却并没有产生光流图中,物体并没有运动,但是光源与物体发生相对运动,却有光流产生。因此可以说光流法法对光线敏感, 光线变化极易影响识别效果。
假设二:小运动。
前文也有提到,现实情况下较大距离的运动也是普遍存在的。因此当需要检测的目标运动速度过快是,传统光流法也不适用。
孔径问题
观察上图(a)我们可以看到目标是在向右移动,但是由于“观察窗口”过小我们无法观测到边缘也在下降。LK算法中选区的小邻域就如同上图的观察窗口,邻域大小的选取会影响到最终的效果。当然,这是针对于一部分稀疏光流算法而言,属于稠密光流范畴的算法一般不存在这个问题。
但是稠密光流法的显著缺点主要体现在,计算量大,耗时长,在对实时性要求苛刻的情况下并不适用。
总结
对于光流法来说,时效性与精确性难以兼得。
在对于运动场景和目标无有效认知,运动模型难以预测、目标特征无法确定的情况下,若使用光流法构建稠密光流场,并且使用金字塔算法补充对于大幅度运动的检测精度,无论是应用于前景检测还是目标跟踪都能起到不错的效果,能够较高的检测精度。但是显而易见,这样的算法复杂度很高,计算量十分巨大,时效性极差。
相反,若结合特征检测算法,针对特征点构建稀疏光流场,能够极大提高算法的执行效率。但是相对的,由于稀疏光流场所能获得的场景运动信息过少,检测精度与准确性难以保证。
此外,光流法理论的基础建立在同一物体亮度恒定的假设上,现实中较难完全满足,这也是光流法的一大不足之处。