移动物体检测与跟踪算法的实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
移动物体检测与跟踪算法的实现
移动物体检测算法已经在带LCD 的Intel XScale 270平台上实现,效果如下图所示。
这个界面是在Linux操作系统下利用QT库采用C++开发的。如果在MicroBlaze上移植Linux成功的话,可能会出现不能支持QT的情况,那我们将舍弃用QT做出来的控制界面,而将图像视频直接显示在VGA显示器上。
接下来我将介绍一下实现这个效果我们所采用的算法和程序的流程:
一、算法
1、基于灰度图像的检测算法
为了完成实时目标检测,需要一系列的操作,所以就需要对目标的特征进行提取,包括目标的形状和颜色分布。由于人体是非刚性的,外在的障碍物和自身的噪声可能给建立唯一的模型带来困难。为了减小这些影响我们把摄像头观察点放置在人群的正上方,这样几乎不会有重叠的现象而且每个目标占用图像的面积很小。
我们采用基于灰度直方图的方法简化目标模型,由于系统只需识别出有物体的存在并进行跟踪,所以要求的精度不需要很高,因此在该系统只识别人体的大体外形及所处的位置而忽略身体的细节部分,使算法更加简化。为了突出目标本文采用相邻帧差法去除不变的部分(比如背景、身体的一些部分),通过分析剩下的部分我们可以定位目标所在的位置。简单的帧差法并不足以达到检测的精度,这里采用相差后图像的水平和垂直投影完成检测功能。
下面给出这个算法的过程:
(1) 相邻图像相差后得到M*N的图像I,如图1所示。非零的那些像素大部分是头部的运动边缘,通过对差分图的分析就可以定位运动目标。
图1 相邻帧相减后的图像
(2) 求出差分图像I 的水平及垂直投影分别用H 和V 表示。如图2显示了两相邻帧和差分后的水平投影值的分布。
水平投影的计算如下:
1()(,)N j V i I i j ==∑ 1,2,....
,i N = (1)
图2 两相邻帧以及差分后的水平投影
从图中可以很明显地看出,在人体头部周围跟随两个峰值。这里我们利用这个特征来检测定位目标。为了最小化噪声的扰动和摄像机抖动的影响我们采用对V 进行中值滤波来保持边缘并滤除孤立脉冲噪声和胡椒噪声。
(3) 如果运动物体存在,那么在向量V 中肯定存在具有足够多的灰度值大于分割阈值的像素点的段。我们将图像I 分成n 个域(n 就是段数),每一个域都位于相应段的中心并且具有一定的宽度。那么这就检测出具有n 个运动目标。
(4) 假设每个域有一组纵向目标。对每个域进行水平投影得到(1,2,3,...,)i H i n =然后进行中值滤波,如果在第i 个域中存在m 个目标,那么在i H 中一定具有m 个显著的值(峰值)。再进行中值滤波并且利用另外一个阈值将域中的一组目标分割开。这样就得
图3 目标分割
到了当前帧中可能的目标的坐标值,然后用外接矩形画出运动目标的边界,如图3所示。
以上使用的阈值具有很大的范围,但是它们的成分大体是固定的。通过系统训练和结果分析我们发现了阈值T 和图象的平均灰度值之间具有如图4所示的关系。因此,系统引进通过连续帧的平均灰度值表述的阈值自适应模型。
图4 阈值与平均灰度值的关系
2、基于一个新的评价函数的跟踪算法
在图像帧中可能发生目标的出现和消失,这就需要将最近检测到的目标和以前检测过的目标进行匹配。基于模板匹配的算法被广泛采用但是它们的搜索空间会随图像大小和模板的增大而急剧增大。所以较难达到实时处理的目的,而且也不可能在人群中提取到所有的模板。这里采用一种新的基于颜色直方图的算法,认为同一物体的直方图是在帧间是相对不变的。但是这种方法忽视了自身的误差,因此还需要做相应地处理来尽可能减小误差的影响。
该系统采用改进的一种新的评估函数来解决匹配问题。此算法将最近相邻算法、速度相关性和单一化灰度直方图结合在一起。
由于帧间的时间间隔很短,所以人体特征如质心、边界矩形和速度不会发生突然地变化,在实验中我们得到了质心位移的上限λ。假设,x y V V 分别表示某物体水平方向和垂直方向的速度,那么用[,],[,]T T cx cy sx sy Vc v v Vs v v ==分别表示在第K 帧的第C 个目标和第K+1帧的第S 个目标。两向量规格化的关系(,,)c s R k V V 定义为
(,,),/(||||||||)c s c s c s R k V V V V V V =<> (2)
其中,Vc Vs <>表示内积,,T cx sx cy sy Vc Vs Vc Vs v v v v <>=⋅=⋅+⋅。||||c V 、||||s V 分别表示向量,Vc Vs 的模。
根据施瓦兹不等式有0(,,)1c s R k V V ≤≤。
帧间物体的彩色直方图相对稳定而且在检测处理过程中本文关注的是加了边界的那些区域,然后计算它们的灰度直方图。这里关心的是所有灰度值的一小部分而其中的大部分都不关心,于是为减轻处理的负担简化后的直方图H 是必须的。
这里采用了第K 帧的第C 个目标和第K+1帧的第S 个目标灰度直方图的相似度计算,匹配程度的计算公式如下:
00(,,)min((),())/()w w s c c
i i G k S C H i H i H i ===∑∑ (3)
设d(C,S)表示它们之间的欧几里得距离,建立一个新的评价函数如下:
(,,)(,,)(,,)(1)min((,))/(,)F k S C R k S C G k S C d i j d S C αβαβ=⋅+⋅+--⋅ (4) 其中(,)d i j 表示两帧间任意两目标之间的欧几里得距离,,αβ的取值都在0到1之间。这样就将三个重要特征联合在一起作为匹配规则对运动目标进行跟踪。下面给出跟踪算法的流程:
(1) 所有在第一帧中出现的目标都标记为新目标,并且为了以后的匹配为每个目标建立一条空链。
(2) 当接收到第k 帧图像时,计算当前帧第j 个可能目标(1j m ≤≤,m 表示当前帧中出现的目标数)和以前检测过的第i 个目标(1i n ≤≤,n 表示以前检测过的总的目标数)之间的G(k,S,C)和(,)d i j 。
① 如果第j 个可能目标具有最大的G(k,S,C)且满足(,)d i j λ≤,就把这个目标认为时第i 个目标的后续,它们属于同一个物体,并且将它添加到相应的链中同时标记为已匹配。
② 如果所有以往检测到的目标都满足(,)d i j λ>,那么就认为第i 个目标在第k 帧没有后续。这暗示这个目标已经在视窗范围之外或者暂时静止不动。如果链的长度超过给定的值就进行一次统计。
被噪声淹没的目标即使在视窗范围内可能也会检测不到,但我们不能停止对它的跟踪,这里我们采用名为“等待N 帧重新匹配”的算法:如果在当前帧没有发现以前检测到的目标,我们不立即将它丢弃,接着处理接下来的N 帧,如果该目标在接下来的N 帧中都没有检测到,那么就放弃对它的跟踪,并且清除相应的链表同时进行计数,否则,恢复跟踪处理。
(3) 如果所有的目标都匹配并且都做过已匹配标记,意味着所有可能的目标都和以前检测到的目标有联系。如果存在没有做过已匹配标记的目标,那么为该目标新建一条空链。
(4) 接收第K+1帧图像,重复第(2)(3)步,直到图像采集结束。
二、 程序流程
(1) 系统类图
系统实现由前台界面显示、后台的图像处理、目标检测和跟踪计数部分组成,完成这一系统本文定义了MainWin 、Process 、Tracker 、Target 四个类:
①MainWin 类:如图5所示,该类利用Qt 图形库绘制主界面,在控件img(QImage)上实时显示处理后的视频。主界面如下图所示。Qt 中消息映射是通过“消息—槽”的机制实现,在这里时间信号每50毫秒触发timeoutslot() 函数,timeoutslot 调用Process 的InputNewFrame 方法检测和跟踪目标,也就是说每秒处理20帧图像。主界面的布局如图4