项目场景:matlab视频图片动态目标检测
问题描述:
<本次编写的视频动态目标检测采用的算法很简单,主要就是通过对比视频中两个不同时刻的图片帧之间的做差来判断出移动物体的大概位置,由于方法很简易,也带来很大的问题,比如此方法是对比两个不同帧的差值来判断位置,那么如果物体不动,我们视频相机移动则相对来说视频中的物体全部处于移动变化,显然就让我们的这个检测的方法暴露出致命缺陷,当然缺陷还有很多,下面直接上程序。
Objvideo = VideoReader('E:\DigitalImage\目标检测\video.mp4');%读取视频
vidHeight = Objvideo.Height;%获取视频参数
vidWidth = Objvideo.Width;
nFrames = Objvideo.NumberOfFrames;%获取视频帧数
vidFrames = read(Objvideo);%读取视频全部的帧
for k=1:nFrames-3%获取间隔的两帧进行对比
img1 = vidFrames(:,:,:,k);
img=img1;
img2 = vidFrames(:,:,:,k+3);
img1 = rgb2gray(img1);%灰度化,并计算两张图片的差别
img2 = rgb2gray(img2);
bwimg = abs(img1-img2)>8;%二值图像
SE = ones(3,3);%先腐蚀再膨胀,消除一些细微影响
bwimg = imerode(bwimg, SE);
bwimg = bwmorph(bwimg,'dilate',9);
[L, nm] = bwlabel(bwimg,8); %找出8连通域并标记
imshow(img);
for i=1:nm%绘制移动目标的方框
[r,c] = find(L == i);
left = min(c);
right = max(c);
top = min(r);
buttom = max(r);
width = right - left + 1;
height = buttom -top + 1;
if width>20 || height>20%去除微小物体的检测
rectangle('Position', [left, top, width, height],'EdgeColor',[1,0,0]);
end
end
fileName='E:\DigitalImage\目标检测\img\result_';%保存框出移动物体的图片,如果不是在matlab路径下,一定要给出具体的路径,否则出现无权限打开文件
frame=getframe(gcf);
strtem = strcat(fileName,int2str(k),'.','jpg');
imwrite(frame.cdata,strtem);
end
WriterObj = VideoWriter('E:\DigitalImage\目标检测\result_video','MPEG-4');%如果不是在matlab路径下,一定要给出具体的路径,否则出现无权限打开文件
open(WriterObj);%合成新的移动物体检测视频
for k=1:nFrames-3
strtem = strcat(fileName,int2str(k),'.','jpg');
frame = imread(strtem);
writeVideo(WriterObj,frame);
end
close(WriterObj);
实验结果部分图片:![在这里插入图片描述](https://img-blog.csdnimg.cn/20201019184616767.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0NTYzNDkz,size_16,color_FFFFFF,t_70#pic_center)