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