两帧之差检测运动物体【matlab】(简易)

289 阅读1分钟

回想当初学习时做的一个帧差法检测运动物体
核心程序基本流程:
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);      %找出边缘像素点