MATLAB_图像/视频目标检测

视频图像处理课,老师给了两幅静态图的目标检测matlab小代码。课后,(1)我从动态视频中提取某一帧检测其中的对象。(2)并随机读取某一段视频帧进行目标检测,将带目标检测的图像再连接成视频就形成了待检测结果的视频流。


本代码的功能:

  • 读取AVI视频,并提取某些帧
  • 显示结果为左上某一帧,右上对比帧,左下两帧差异,右下目标检测结果
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);

猜你喜欢

转载自blog.csdn.net/yamgyutou/article/details/106456148