课程设计
平台:Matlab App designer
功能实现:运动目标跟踪
目的:
1.Matlab代码编写能力进阶;
2.学会利用Matlab GUI设计图形交互界面,开发有趣的应用;
演示:
1.运动目标跟踪演示,通过前后两帧的图像对减,像素差大于判断阈值的则认为是存在运动物体的。再利用形态学处理得到运动目标位置信息,并用红框在原视频中框出运动。
2.换个多运动目标的视频试试:
这里可以看到,某些时间段内乌龟被区分成了两个物体。这是因为前后两帧对减后乌龟的中间部分像素差低于判断阈值导致的,虽然不影响对运动目标的跟踪,但是若要判断运动目标数量,则可能会出现问题。一种解决方法是减低判断阈值。还有一种解决办法就是用每一帧去减背景帧,但是这种方法只适用于背景固定不动的场景,比如监控视频等。在我们的方法中采用的是前后两帧对减,缺点是可能造成目标的多判,优点是对背景稍微变动的视频也能表现出较好的运动目标跟踪效果。
代码示例:
实现目标跟踪的关键程序段:
%差分阀值,用来区分前后两帧图片到底有没有不同的阈值
threshold=16;
%从第一帧开始遍历到倒数第二帧,每一帧与后一帧做差分运算
for p=1:app.frameNum-1
originalPic1=app.I(:,:,:,p);%读取第p帧,原始图像1
originalPic2=app.I(:,:,:,p+1);%读取第p+1帧,原始图像2
imshow(originalPic2,'parent',app.UIAxes);%
% 平滑
H = fspecial('gaussian',7,3);
originalPic1 = imfilter(originalPic1,H,'same');
originalPic2 = imfilter(originalPic2,H,'same');
originalPic_gray1=rgb2gray(originalPic1);%rgb转灰度图1
originalPic_gray2=rgb2gray(originalPic2);%rgb转灰度图2
diff=app.xxx(originalPic_gray2,originalPic_gray1);%差分数值
idiff=diff<threshold; %判断与差分阈值的大小,小于差分阈值则为1,大于差分阈值则为0
%逻辑图像处理
idiff_pro=medfilt2(idiff);%中值滤波去噪
idiff_pro=filter2(fspecial('average',1),idiff_pro);%均值滤波去噪
idiff_pro=~idiff_pro;%这边再取反一下,变成大于差分阈值则为1,小于差分阈值则为0
% 移除小对象 小区域肯定是噪声 (根据图像大小而定,参考值10-30)
idiff_pro= bwareaopen(idiff_pro,20);
% 图像闭运算,先膨胀后腐蚀操作, 连接邻近区域以及去除中间空点
se = strel('disk',11);
idiff_pro = imclose(idiff_pro,se);
imshow(idiff_pro,'parent',app.UIAxes_2);%
%标记最大边界,只跟踪视频中变化最大的区域
img_reg=regionprops(idiff_pro,'area','boundingbox');%获取有差分的所有区域的位置信息。
for ii=1:length(img_reg)
originalPic2= insertShape(originalPic2,'Rectangle',img_reg(ii).BoundingBox,'Color','red','LineWidth',2);
end
imshow(originalPic2,'parent',app.UIAxes_3)
pause(0.01)
end