视频图像处理课,老师给了两幅静态图的目标检测matlab小代码。课后,(1)我从动态视频中提取某一帧检测其中的对象。(2)并随机读取某一段视频帧进行目标检测,将带目标检测的图像再连接成视频就形成了待检测结果的视频流。
本代码的功能:
video_det=VideoReader('Traffic_1000.avi');
vidHeight = video_det.Height;
vidWidth = video_det.Width;
%这句可以查看帧数,但如果底下有readFrame函数不能有这句,会冲突
nFrames=video_det.NumberOfFrames;
s=read(video_det,[400 800]);
rate=video_det.FrameRate;
%s就是个大小为400的4维数据,s(:,:,:,1)存放的第400帧的图
for k=1:50:400
% 我猛然间发现,这句只能从第一帧开始一个个读,并不能读你想要的某一帧
% s(k).cdata = readFrame(video_det);
%显示前一帧图像并存到mov(1)中,即第400帧图像
figure(k)
im11=s(:,:,:,k);
subplot(2,2,1);
imshow(im11);
mov(k).cdata=rgb2gray(im11);
%显示5帧后的图像存到mov(2),即第405帧图像
subplot(2,2,2);
imshow(s(:,:,:,k+5));
mov(k+1).cdata=rgb2gray(s(:,:,:,k+5));
%计算它们之间的差别
reg_im=abs(mov(k).cdata-mov(k+1).cdata)>8
subplot(2,2,3);
imshow(reg_im);
%显示目标检测框
SE = ones(5,5);
%bwmorph对二值图像进行形态学操作,
%bwmorph(BW,operation,n)应用形态学操作n次
%'dilate'利用结构ones(3)执行膨胀操作
%imerode实现图像腐蚀。Imerode(X,SE),X是待处理的图像,SE是结构元素对象
i3= bwmorph(reg_im,'dilate',9);
i3 = imerode(i3, SE);
[L, nm] = bwlabel(i3,8); %找出8连通域并标记
subplot(2,2,4);
imshow(im11);
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;
rectangle('Position', [left, top, width, height],'EdgeColor',[1,0,0]);
end
result=
end
一部分结果:
这个代码是将300到800帧做了目标检测,并把检测结果存图,并生成视频序列。
哦,我好棒!虽然搜各种语句,改了很久很久,老师也不收,和我研究方向也无关,但我也不知道为何我要在美好的周末搞这个。但我还是很棒,哈哈哈哈。
clc;
clear;
video_det=VideoReader('Traffic_1000.avi');
vidHeight = video_det.Height;
vidWidth = video_det.Width;
%这句可以查看帧数,但如果底下有readFrame函数不能有这句,会冲突
nFrames=video_det.NumberOfFrames;
s=read(video_det,[300 803]);
rate=video_det.FrameRate;
fileName='result_';
j=1;
for k=1:500
im11=s(:,:,:,k);
mov(j).cdata=rgb2gray(im11);
mov(j+1).cdata=rgb2gray(s(:,:,:,k+3));
reg_im=abs(mov(j).cdata-mov(j+1).cdata)>8;
j=j+2;
SE = ones(5,5);
i3= bwmorph(reg_im,'dilate',9);
i3 = imerode(i3, SE);
[L, nm] = bwlabel(i3,8); %找出8连通域并标记
imshow(im11);
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;
rectangle('Position', [left, top, width, height],'EdgeColor',[1,0,0]);
end
frame=getframe(gcf);
result=frame2im(frame);
strtem = strcat(fileName,int2str(k),'.','bmp');
imwrite(result,strtem);
end
dn='E:\matlab代码\目标检测';
picname=fullfile( dn, strcat('*.','bmp'));
picname=dir(picname);
aviname='detect_vedio.avi';
aviobj = VideoWriter(aviname);
open(aviobj);
for i=1:length(picname)
picdata=imread( fullfile(dn, (picname(i,1).name)));
if ~isempty( aviobj.Height)
if size(picdata,1) ~= aviobj.Height || size(picdata,2) ~= aviobj.Width
close(aviobj);
delete( aviname )
error('所有图片的尺寸要相同!!');
end
end
writeVideo(aviobj,picdata);
end
close(aviobj);