基于帧差法和形态学处理的行驶车辆跟踪算法matlab仿真

发布时间 2023-09-16 23:10:54作者: 简简单单做算法

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:背景的提取
%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)