一.车速、车流量检测对车速、车流量的检测需要用多幅连续的动态图像。
1.运动车辆检测车速与车流量检测的前提是要从图像中准确提取出运动车辆。
提取运动车辆一般都是用差分法,常用的有背景差分法和帧间差分法。
背景差分是从图像中选取一帧作为背景帧,通过将当前帧与背景帧图像差分来判断是否有运动车辆;背景差分的主要问题是背景的更新,因为随着时间的变化,静态的背景也会发生改变,所以需要实时地对背景图像更新,现在已经有比较成熟的自适应背景更新算法来解决这一问题。
帧间差分法是通过将当前帧与上一帧图像差分来判断是否有运动车辆;帧差分法可以去除背景图像使保留下来的部分全为运动车辆的图像。
但用这种方法当两帧间有重叠部分时重叠部分无法检测出来,使运动目标出现断裂,给后续的处理带来不便。
因此本系统宜采用背景差分并应用自适应背景更新算法来动态更新背景。
2.背景差分中背景更新算法背景差分的关键是要能保证背景图像的准确性,简单而又常用的自适应背景更新算法有以下两种:A.基于帧间像素灰度变化的背景更新算法基于帧间像素灰度变化的背景更新算法在具体处理上也可细分为很多种,但都大同小异。
这种方法需要先提取出一幅初始的背景图像,可以简单地将第一帧图像作为初始背景图像,也可以将前N帧图像的中值或均值作为初始背景图像。
对于背景图像的更新,设B k-1(i,j)为原(i,j)处的原背景图像,B k(I,j)为更新后的背景图像,I k(i,j)为当前实际图像。
得到目标二值图像:其中T为选取的阀值,应该根据图像的变化动态来选取。
对背景的更新公式为:a为原来的背景在更新后的背景中所占比例,占主要的部分。
或者用以下公式:B k(i,j)=B k-1(i,j)+c(1-M k(I,j))+dM k(I,j)((I k(i,j)-B k-1(I,j))c为主更新因子,对应静态图像部分;d为从更新因子,对应运动目标部分,C>>d。
具体采用哪种公式应根据调试结果来定。
B.基于像素灰度区间分布的背景更新算法这种方法类似于统计直方图。
对于单像素其值在0~255间,可以将其分为N 个区间,每个区间范围为(0<1<N)。
每个每一个区间定义两个参数:区间均值u和区间计数值s k。
u k是属于该区间的所有象素值的加权平均;s k是象素值属于该区间的所有图像序列的总数。
区间均值是随着图像序列的更新而更新。
在计算时,当前帧的数据比之前的数据所占的权重更大,为此引入衰减因子e,之前的数据所占比重按e速率衰减。
e越小,衰减得越快。
假设当前帧为第n帧,则第k个区间的均值u k的更新公式为:如果象素值落入第k个区间则更新u k,否则u k保持不变。
为了使得背景估计模型能够更好的跟踪背景的变化,同时也是s k不至于一直累加增大,引入了区间计数值的衰减因子,降低历史信息的影响。
定义区间计数衰减因子为f,当前图像象素值对区间计数值的贡献是1,而前一帧图像象素值对区间计数值的贡献是f,以此类推,这样就降低了历史信息的影响。
假设当前帧为第n帧,定义第k个区间的计数值s k的更新公式为:定义了u k、s k后,首先判断当前象素点所属区间k,然后更新u k、s k,找出各区间中s k的最大值,将具有最大s k值的区间u k作为该像素的背景值。
上述两种方法中第一种更适合背景变化较快的场合,而第二种则适合背景变化较慢的场合,具体采用哪种算法可以根据调试的实际效果来定。
3.虚拟检测线法提取车速、车流量虚拟检测线法就是在图像中选取检测区域,在该区域中检测运动车辆。
所有在前面的用背景差分检测运动车辆部分做好了后,这部分就非常简单。
首先需要在整个图像中选取一个虚拟的检测区域,一般选择水平于图像中下部的区域作为检测区域,因为在此位置可以在一定程度上避免前车遮挡后车的问题。
检测区域不宜过大也不宜过小,最后选择检测区域高度为普通车长,宽度为车道的宽度。
然后,在检测区域内设置若干条虚拟线用于检测,虚拟线的数目可以根据实际的需要给出。
虚拟线少,检测的速度快,但是容易产生误判;虚拟线多会降低检测速度,但是增强了检测结果的准确性。
一条虚拟线就是一行像素。
在虚拟线的设置中有一点值得注意,因为路标通常标在车道的正中央,有可能出现检测器穿过路标的现象。
一般来说,路标都是比较醒目的,与路面的灰度反差较大。
在这种情况下有可能会出现误判,所以尽量不要使虚拟线和路标有交集。
车流量的提取只需要在自适应更新背景的前提下,用背景差分法来检查虚拟检测区内是否有车辆通过,有车辆通过是则进行计数,然后用在一段时间内检测出的车辆数除以时间即可得到车流量。
车速的检测也是通过检测虚拟检测区内有无车辆来实现。
由于我们设置的虚拟检测区的图像窗口是和时间的道路位置一一对应的,因此可以知道虚拟检测区所对应的实际道路的物理长度与宽度,其中长度s即为车辆通过该虚拟检测去所走的实际路程,而车辆进入该虚拟检测区的帧数m与车辆离开虚拟检测区的帧数n的差(m-n)即是车辆通过路程s所对应的时间,从而可以算出车辆的车速。
二.车辆排队长度、交通密度检测对车辆排队长度与交通密度的检测只需要单幅静态图像。
这部分首先要从图像中将车道从其他背景中提取出来,图像中的像素与实际的位置是一一对应的,所以可以在调试时手动设置图像的工作窗口,将其设置在实际的车道内,非工作窗口部分处理图像时不做处理。
车辆排队长度的检测是以道路与车辆的在图像中的灰度值不同为基础,通过将工作窗口内的图像作二值化处理,将图像分割成若干的黑色区域与白色区域。
通过选取合适的阀值,二值化后可以将图像中车辆的轮廓部分变为1即黑色,而其他部分为0即白色,从而在一幅静态图像中将车辆和道路分割开,通过计算工作窗口中黑色区域个数即可得到车辆排队长度信息。
车辆排队数除以道路长度即得到交通密度。
进行二值化处理时选取合适的阀值是处理结果好坏的关键。
比较常用的是Ostu自动阀值分割算法。
OTSU算法也称最大类间差法,有时也称之为大津算法,被认为是图像分割中阈值选取的最佳算法,计算简单,不受图像亮度和对比度的影响,因此在数字图像处理上得到了广泛的应用。
它是按图像的灰度特性,将图像分成背景和前景两部分。
背景和前景之间的类间方差越大,说明构成图像的两部分的差别越大,当部分前景错分为背景或部分背景错分为前景都会导致两部分差别变小。
因此,使类间方差最大的分割意味着错分概率最小。
设灰度图像灰度级是L,则灰度范围为[0,L-1],利用OTSU算法计算图像的最佳阈值为:t = Max[w0(t) * (u0(t) - u)2 + w1(t) * (u1(t) - u)2)]其中:当分割的阈值为t时,w0为背景比例,u0为背景均值,w1为前景比例,u1为前景均值,u为整幅图像的均值。
使以上表达式值最大的t,即为分割图像的最佳阈值。
以下是用Ostu算法提取图像阀值的C语言程序具体函数的实现,系统设计时可以作为参考:int otsuThreshold(IplImage *frame){int width = frame->width;int height = frame->height;int pixelCount[GrayScale];float pixelPro[GrayScale];int i,j,pixelSum = width * height, threshold = 0;uchar* data = (uchar*)frame->imageData;for(i = 0; i < GrayScale; i++){pixelCount[i] = 0;pixelPro[i] = 0;}for(i = 0; i < height; i++) //统计灰度级中每个像素在整幅图像中的个数{for(j = 0;j < width;j++){pixelCount[(int)data[i * width + j]]++;}}for(i = 0; i < GrayScale; i++) //计算每个像素在整幅图像中的比例{pixelPro[i] = (float)pixelCount[i] / pixelSum;}float w0, w1, u0tmp, u1tmp, u0, u1, u, deltaTmp, deltaMax = 0;for(i = 0; i < GrayScale; i++) //遍历灰度级[0,255]{w0 = w1 = u0tmp = u1tmp = u0 = u1 = u = deltaTmp = 0;for(j = 0; j < GrayScale; j++){if(j <= i) //背景部分{w0 += pixelPro[j];u0tmp += j * pixelPro[j];}else //前景部分{w1 += pixelPro[j];u1tmp += j * pixelPro[j];}}u0 = u0tmp / w0;u1 = u1tmp / w1;u = u0tmp + u1tmp;deltaTmp = w0 * pow((u0 - u), 2) + w1 * pow((u1 - u), 2);if(deltaTmp > deltaMax){deltaMax = deltaTmp;threshold = i;}}return threshold; }。