1 简介
当前,随着经济与社会的不断发展,各领域对智能视频监控系统的要求越来越高,而视频图像的运动检测与跟踪也是其核心问题之一,是我国研究的主要领域,它不仅可以应用在军事和工业上,也可以应用到公共场合、码头、银行以及交通系统车辆检测等系统中。本文主要研究基于光流场的视频车辆检测与跟踪技术,主要工作包括: 1.受外界环境以及摄像机等因素的影响,采集的视频图像往往受各种噪声影响,这会降低光流法检测运动目标的准确度。因此在检测运动目标之前,需要对图像进行图像平滑预处理,包括中值滤波、均值滤波、动态滤波三种去噪方法。 2.运动目标检测的关键就是要把目标物体提取出来,即将目标物体从复杂的背景中分离出来。传统的目标检测方法首先要提取出静态背景图像,然后将序列图像与背景图像相比较以提取目标物体,这种方法数据处理量较大。本文主要介绍基于Horn-Schunk算法、Lucas-Kanade算法、块匹配算法和基于相位的方法。通过实验表明H-S算法、L-K算法能够有效检测出运动目标,然而都存在一定的优劣性。 3.运动目标跟踪采用Horn-Schunk算法,通过实验仿真有效实现了运动目标跟踪,实验证明这种方法减少了数据处理量,能够满足现实中对目标物体实时跟踪的需要。
2 部分代码
clear all
videofile = 'viptraffic.avi';
info = mmfileinfo(videofile);
cols=info.Video.Width;
rows=info.Video.Height;
hReader = vision.VideoFileReader(videofile,...
'ImageColorSpace', 'RGB',...
'VideoOutputDataType', 'single');
hFlow = vision.OpticalFlow( ...
'OutputValue', 'Horizontal and vertical components in complex form', ...
'ReferenceFrameDelay', 3,...
'Method','Horn-Schunck');
hMean1 = vision.Mean;
hMean2 = vision.Mean('RunningMean', true);
hFilter = vision.MedianFilter;
hClose = vision.MorphologicalClose('Neighborhood', strel('line',5,45));
hBlob = vision.BlobAnalysis(...
'CentroidOutputPort', false,...
'AreaOutputPort', true, ...
'BoundingBoxOutputPort', true,...
'OutputDataType', 'double', ...
'MinimumBlobArea', 250,...
'MaximumBlobArea', 3600,...
'MaximumCount', 80);
hErode = vision.MorphologicalErode('Neighborhood', strel('square',2));
hShape1 = vision.ShapeInserter(...
'BorderColor', 'Custom', ...
'CustomBorderColor', [0 1 0]);
hShape2 = vision.ShapeInserter(...
'Shape','Lines', ...
'BorderColor', 'Custom', ...
'CustomBorderColor', [255 255 0]);
hText = vision.TextInserter(...
'Text', '%4d',...
'Location', [1 1], ...
'Color', [1 1 1],...
'FontSize', 12);
sz = get(0,'ScreenSize');
pos = [(sz(3)-4*(cols+75))/2, (sz(4)-rows)/2 cols+60 rows+80];
hVideo1 = vision.VideoPlayer('Name','Original Video','Position',pos);
pos(1) = pos(1)+cols+75;
hVideo2 = vision.VideoPlayer('Name','Motion Vector','Position',pos);
pos(1) = pos(1)+cols+75;
hVideo3 = vision.VideoPlayer('Name','Thresholded Video','Position',pos);
pos(1) = pos(1)+cols+75;
hVideo4 = vision.VideoPlayer('Name','Results Video','Position',pos);
[xpos,ypos]=meshgrid(1:5:cols,1:5:rows);
xpos=xpos(:);
ypos=ypos(:);
locs=sub2ind([rows,cols],ypos,xpos);
while ~isDone(hReader)
pause(0.3);
frame = step(hReader);
gray = rgb2gray(frame);
flow = step(hFlow, gray);
lines = [xpos, ypos, xpos+20*real(flow(locs)), ypos+20*imag(flow(locs))];
vector = step(hShape2, frame, lines);
magnitude = flow .* conj(flow);
threshold = 0.5 * step(hMean2, step(hMean1, magnitude));
carobj = step(hFilter, magnitude >= threshold);
carobj = step(hClose, step(hErode, carobj));
[area, bbox] = step(hBlob, carobj);
grow=22;
idx = bbox(:,1) > grow;
ratio = zeros(length(idx), 1);
ratio(idx) = single(area(idx,1))./single(bbox(idx,3).*bbox(idx,4));
flag = ratio > 0.4;
count = int32(sum(flag));
bbox(~flag, :) = int32(-1);
result = step(hShape1, frame, bbox);
result(grow:grow+1,:,:) = 1;
result(1:15,1:30,:) = 0;
result = step(hText, result, count);
step(hVideo1, frame);
step(hVideo2, vector);
step(hVideo3, carobj);
step(hVideo4, result);
end
release(hReader);
3 仿真结果
4 参考文献
[1]刘涛. 基于光流场的视频车辆检测与跟踪算法研究与应用. (Doctoral dissertation, 武汉科技大学).
部分理论引用网络文献,若有侵权联系博主删除。
5 MATLAB代码与数据下载地址
见博客主页