回想当初学习时做的一个帧差法检测运动物体
核心程序基本流程:
1.VideoReader读取视频文件
2.获取视频长度
3.构建循环
4.读取连续两帧
5.计算运动的四个边界点
6.画出当前帧
7.在当前帧中绘制框
demo:
mov=VideoReader('traffic.avi'); %读取视频文件
N=mov.NumFrames; %读取视频长度
%%
figure
for i=1:N-1
frame=read(mov,i+1);
Pframe=read(mov,i); % 读取第一帧视频帧
subplot(1,2,1)
imshow(Pframe);
[Xmin,Ymin,Xmax,Ymax]=FrameDiff(frame,Pframe); %输出运动目标的四个边界点
subplot(1,2,2)
imshow(Pframe); %画出当前帧
rectangle('position',[Xmin,Ymin,Xmax-Xmin,Ymax-Ymin],'edgecolor','g'); %画出跟踪框
FrameDiff
FrameDiff的操作流程:
1.前后两帧图像灰度化
2.中值滤波去噪
3.图像均衡化
4.将图像转化为图像双精度
5.检测帧差
6.中值滤波
7.设置帧差阈值
8.转化为逻辑阵
9.找出边缘像素点
function [Xmin,Ymin,Xmax,Ymax]=FrameDiff(frame,Pframe)
%%
x=rgb2gray(frame);
y=rgb2gray(Pframe); %前后两帧图像灰度化
%%
x=medfilt2(x);
y=medfilt2(y);%中值滤波去噪
%%
x = histeq(x);
y = histeq(y);% 图像均衡化
%%
n=im2double(x);
p=im2double(y); %将图像转化为图像双精度
%%
c=n-p; %检测帧差
c=medfilt2(c); %中值滤波
t=80/256; %设置帧差阈值
c(abs(c)>=t)=255;
c(abs(c)<t)=0;
c=logical(c); %将c转为逻辑阵
[a,b]=find(c>0);
Xmax=max(b);
Xmin=min(b);
Ymax=max(a);
Ymin=min(a); %找出边缘像素点