资源简介

运动目标检测在计算机视觉,图像处理,模式识别等多领域有着广泛的应用,经历了多年的研究和探索,针对运动目标检测的算法层出不穷,我们也积累了许多相关的算法。但是我们还远没有完成对这个充满挑战的领域的探索。本文对运动目标检测的技术进行了一定的研究,实现了基于canny算子和光流法相结合的运动目标检测方法。为了能够准确把握这个行业的动态,本文首先介绍了运动目标检测的三大经典方法:背景相减法,帧差法,光流法。同时比较了各自的优缺点。帧差法具有易实现,计算量小的优点,但是却无法准确的检测出运动目标的完整轮廓。光流法具有对不断运动的运动目标进行目标检测,但是它却有很大的计算量,同时对噪声也比较敏感。为了可以对运动目标进行更好的识别,我们提出了边缘检测算子与光流法相结合的新方法。在对多种边缘检测算子进行了了解之后,我们确定了利用canny算子进行边缘检测,并且结合光流法进行运动目标检测的方法。在用canny算子检测出运动物体边缘之后,借助光流法计算出物体的运动场,同时结合最大类间方差法分辨出运动目标和背景,接着将物体的边缘信息和物体的运动信息进行融合,最后运用数学形态学的方法对结果进行处理,得到最终的运动目标。通过实验,我们发现该方法既克服了帧差法不能准确检测出运动物体轮廓,和光流法抗噪声能力差的缺点,可以准确检测运动目标,对运动目标具有更好的检测效果

资源截图

代码片段和文件信息

clear all
videofile=‘people.avi‘;%读取视频文件
%videofile=‘carreco.avi‘;
%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‘545));
%创建BLOB分析对象,用于从视频中分割汽车
hblob=vision.BlobAnalysis;
hblob.CentroidOutputPort=false; 
hblob.AreaOutputPort=true;
hblob.BoundingBoxOutputPort=true;
hblob.OutputDataType=‘double‘;
hblob.MinimumBlobArea=250;
hblob.MaximumBlobArea=3600;
hblob.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);
%psos(1)=pos(1)+cols+5;
psos(1)=pos(1)+cols+15;%行数加上15个像素,实际上那个是在进行平移
hvideo2=vision.VideoPlayer(‘Name‘‘Motion Vector‘‘Position‘pos);
pos(1)=pos(1)+cols+15;
hvideo3=vision.VideoPlayer(‘Name‘‘Thresholded Video‘‘Position‘pos);
pos(1)=pos(1)+cols+15;
hvideo4=vision.VideoPlayer(‘Name‘‘Result Video‘‘Position‘pos);

%从视频中检测追踪汽车
%显示光流矢量像素点
[xposypos]=meshgrid(1:5:cols1:5:rows);%grid 网格,坐标方格
xpos=xpos(:);
ypos=ypos(:);
locs=sub2ind([rowscols]yposxpos);

%循环处理视频每一帧,直到文件结束
while ~isDone(hreader)
    pause(0.3);
frame=step(hreader);
gray=rgb2gray(frame);

%计算光流场矢量,返回一个复数矩阵,分别代表每个像素点的U,V
%光流基本方程,dit(I)+It=0;
flow=step(hflowgray);%就算阶跃响应,实际上是在计算光流失量
%绘制光流图系统默认每隔5行5列选择一个像素点,绘制他的光流图,20表示将光流幅值放大20倍,lines 每行对应一条曲线,
lines=[xposyposxpos+20*real(flow(locs))ypos+20*imag(flow(locs))];
%将光流矢量添加到视频帧上
vector=step(hshape2framelines);%实际上就是求取一个阶跃响应
magnitude=flow.*conj(flow);%conj求取复数的共轭
threshold=0.5*step(hmean2step(hmean2magnitude));
carobj=step(hfiltermagnitude>=threshold);
carobj=step(hclosestep(herodecarobj));
[areabbox]=step(hblobcarobj);
grow=30;
idx=bbox(:1)>grow;
ratio=zeros(length(idx)1);
ratio(idx)=single(area(idx1))./single(bbox(idx3).*bbox(idx4));
flag=ratio>0.45;

count=int32(sum(flag));
%count=count+1;
%bbox(~flag:)=int32(-1);
result=step(hshape1framebbox);
result(grow:grow+1::)=1;
result(1:151:30:)=0;
result=step(htextresultcount);

%显示处理结果
step(hvideo1frame);
step(hvideo2vector);
step(hvideo3car

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2018-10-10 15:39  源码\
     文件        3441  2016-05-23 14:56  源码\optical.m
     目录           0  2018-10-10 15:39  演示\
     文件    16820240  2016-05-16 11:04  演示\9420.exe
     文件          64  2018-10-10 16:34  说明.txt
     目录           0  2018-10-10 15:38  需求\
     文件       45568  2018-10-12 13:38  需求\4-毕业论文(设计)任务书 -基于canny算子和光流法的运动目标检测算法实现.doc

评论

共有 条评论