您的位置:首页 > 编程语言 > MATLAB

Matlab移动目标检测输出二值视频

2020-04-01 18:37 337 查看

老师布置了个作业,给了个交通视频,让检测出运动的物体,物体用白色标识,其他部分用黑色标识,输出视频。简单来讲就是输出二值图,运动的物体为白色。
我采用的检测物体运动的方法是帧间差分法。准确来说是二帧间差分法。二帧间差分法所得到的物体没有三振间稳定。为了去掉无关的噪点,采用中值滤波把椒盐噪点去掉。

1、这一部分的结果是保存了150张二值图片,每一步具体作用写注释里面了。
clear all;
close all;
clc;
p_num=1
mov=VideoReader(‘TST2.avi’);%读取视频
N=mov.NumberOfFrames;%读取视频帧数
tp=[];
%遍历帧
for i=2:150
frame=read(mov,i);%读取当前第i帧的图片
Pframe=read(mov,i-1);%读取第i-1帧的图片
if ndims(frame)==3%如果图片的维度是3,那么就是彩色图像
x=rgb2gray(frame);%转换成灰度图像
else
x=frame;%否则,不操作
end
if ndims(Pframe)==3%同理
y=rgb2gray(Pframe);
else
y=Pframe;
end
subplot(1,2,1);%画两个窗口
imshow(Pframe,[]);
title(sprintf(‘第%d帧’,i-1))
%差分算法
x=medfilt2(x);%中值滤波,消除椒盐噪声
y=medfilt2(y);
n=im2double(x);%将图像转化为双精度
p=im2double(y);

c=n-p;%做差
c=medfilt2(c);%中值滤波,消除椒盐噪声
t=10/256;%设置二值的阈值点

c(abs(c)>=t)=255;%如果大于阈值点,设为1
c(abs(c)<t)=0;%如果小于,设为0
c=logical(c);%将数值转化为逻辑值,即,转换成了二值

x1=Pframe(:,:,1);%将运动的部分设置为白色rgb[255,255,255]
x1(c)=255;
x2=Pframe(:,:,2);
x2(c)=255;
x3=Pframe(:,:,3);
x3(c)=255;
xc=cat(3,x1,x2,x3);  %将矩阵进行拼接,生成新的图像
%tp=[tp c];

subplot(1,2,2);
imshow(c);
title(sprintf('第%d帧',i-1))
str1='E:\大三下\csdn博客\帧差分法\二值图片\';
str2=num2str(p_num);
str3='.jpg';
save_path=[str1,str2,str3];
imwrite(c,save_path);%保存每一帧处理后的二值图片
p_num=p_num+1;

end

2、这一部分是把150张图片合成一个视频
vedio = VideoWriter(‘demo.avi’); %初始化一个avi文件
vedio.FrameRate = 15;
fpath=‘E:\大三下\csdn博客\帧差分法\二值图片’;
open(vedio);
for i=1:149 %图像序列个数
fname=strcat(num2str(i,’%d’),’.jpg’);
frame = imread([fpath,fname]);
writeVideo(vedio,frame);
end
close(vedio);

原视频gif效果


处理后的视频gif效果图
由于,我把帧率从之前30帧调到了15帧,就有一种放慢的效果

参考文献
1、https://blog.csdn.net/zxc024000/article/details/49642249?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
2、https://zhuanlan.zhihu.com/p/27077851

  • 点赞
  • 收藏
  • 分享
  • 文章举报
dandan_xt 发布了3 篇原创文章 · 获赞 2 · 访问量 133 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: