1.算法理论概述
车辆跟踪是计算机视觉领域中的一个重要问题,它在交通监控、智能交通系统、自动驾驶等领域具有广泛的应用。本文介绍一种基于帧差法和形态学处理的车辆跟踪算法,通过对视频帧进行帧差法处理,检测出运动目标(车辆),然后利用形态学处理对目标进行形态学运算,实现车辆的跟踪和轨迹的提取。该算法具有较高的实时性和准确性,适用于不同场景的车辆跟踪任务。
该算法的主要步骤如下:
第一步:视频帧获取
从视频数据源获取连续的视频帧,作为输入数据。
第二步:帧差法处理
对相邻的两帧图像进行帧差法处理,得到运动目标图像。帧差法是一种简单有效的运动目标检测方法,它基于连续帧之间的像素变化来检测运动目标。具体步骤如下:
a) 将当前帧和上一帧图像进行灰度转换,得到灰度图像I(t)和I(t-1)。
b) 计算两帧图像之间的差异图像diff = |I(t) - I(t-1)|。
c) 对差异图像进行二值化处理,得到二值化图像BW,其中大于阈值的像素点标记为1,表示运动目标,其他像素点标记为0,表示背景。
第三步:形态学处理
利用形态学处理对二值化的运动目标图像进行处理,进一步优化目标的检测结果。形态学处理是基于图像形状的一组操作,包括腐蚀、膨胀、开运算和闭运算等操作。具体步骤如下:
a) 对二值化图像进行膨胀操作,以填充运动目标的空洞和连接断裂的目标,得到膨胀后的图像Dilate。
b) 对膨胀后的图像进行腐蚀操作,去除小的噪声点,得到腐蚀后的图像Erode。
c) 对腐蚀后的图像进行闭运算,以填充运动目标的小孔,得到闭运算后的图像Close。
d) 对闭运算后的图像进行连通区域分析,提取出目标的轮廓和中心点。
第四步:车辆跟踪与轨迹提取
根据形态学处理得到的目标轮廓和中心点,进行目标的匹配和跟踪。根据目标的运动信息,可以实现车辆的跟踪和轨迹的提取。
帧差法处理
差异图像diff的计算公式为:diff = |I(t) - I(t-1)|
二值化处理
二值化图像BW的计算公式为:
BW(i,j) = 1, if diff(i,j) > 阈值
BW(i,j) = 0, if diff(i,j) ≤ 阈值
膨胀操作
膨胀后的图像Dilate的计算公式为:
Dilate(i,j) = max(BW(i-k:i+k, j-k:j+k)), 其中k为结构元素的大小
腐蚀操作
腐蚀后的图像Erode的计算公式为:
Erode(i,j) = min(BW(i-k:i+k, j-k:j+k)), 其中k为结构元素的大小
闭运算
闭运算后的图像Close的计算公式为:
Close = Erode ⊕ Dilate,其中⊕表示形态学闭运算操作
目标跟踪
目标的跟踪可以通过目标匹配算法实现,例如最邻近匹配算法或卡尔曼滤波算法。跟踪结果可以用目标的中心点坐标表示。
2.算法运行软件版本
MATLAB2013b
3.算法运行效果图预览
4.部分核心程序
%Step2:背景的提取
%level越大,背景提取的越精确,通过序列平均法来求背景,所以对于背景的获取,
%我们采用的是前面车辆较少的视频
%在实际中,我们一般统计低峰期的平均值,所以这里我们使用01.AVI
[Obj2,frameNum_Original2] = get_AVI('avi\01.AVI');
[back_ground,back1] = get_background(Obj2,frameNum_Original2);
% Step3:视屏预处理
% Step3:视屏预处理
frameNum = frameNum_Original;
pixel = vedio_op(Obj,frameNum);
% Step4:汽车捕获
% Step4:汽车捕获
[bw,L2,L3,bws,L,pixel2] = get_car(pixel,frameNum,back_ground);
%显示捕获后的汽车结果。
implay(pixel2);
% %车数目的计算,为了防止图像处理过程中的误差,一般我们选取图层中的合适位置进行统计车辆
% %一般选取离摄像头近的区域
% %检测车的数量
% %检测车的密度。测试总数量/测试总时间
% %计算每秒中通过车子数目。即车流密度。
% [num_car,num_p] = car_number(pixel,frameNum,L2);
%检测车的数量
rows = size(L3,1); %240
cols = size(L3,2); %320
Length = size(L3,3);
area=0;
TotalPic=0;
for i =1:Length
TotalPic=car_information(bws(:,:,i),cols,rows,0.5);
if isempty(TotalPic)==0
area(1:length(TotalPic(4,:)),i)=TotalPic(4,:);
end
end
num(1:size(area,2))=0;
for i = 1:size(area,2)
for j = 1:size(area,1)
if area(j,i)>100
num(i) = num(i) + 1;
else
num(i) = num(i);
end
end
end
areas =sort(area(:,i));
[Carnum,v]=max(num)