MATLAB视频运动目标检测参考源码

将视频截取成帧

fileName = 'q.avi'; %此处输入视频名称,要带后缀,注意好像只有wmv和avi格式
obj = VideoReader(fileName);
numFrames = obj.NumberOfFrames;% 帧的总数
 for k = 1 :numFrames% 读取数据
     frame = read(obj,k);
     imshow(frame);
   imwrite(frame,strcat(num2str(k),'.jpg'),'jpg');% 保存帧
End

灰度二值化图像

for i=1:numberofframe%numberofframe为图像张数
    imageName=strcat(num2str(i),'.jpg');
    I = imread(imageName);
    imggray = rgb2gray(I);%灰度化图像
    imwrite(imggray,strcat(num2str(i),'huidu.jpg'),'jpg');% 保存帧
    i2=im2bw(I);% i2是二值图像,不需要求阈值
    imwrite(i2,strcat(num2str(i),'erzhi.jpg'),'jpg');% 保存帧
end

背景差分法

 filename = '103.jpg';%读原图
    I = imread(filename);
    X = rgb2gray(I);%读,灰度原图
    filename = 'YCBJ.jpg';%读取背景图
    M = imread(filename);
    Y = rgb2gray(M);%读,灰度背景图
    Z = imabsdiff(X,Y);%两图相减
    level = graythresh(Z);
    Z = im2bw(Z,level);%二值化图
    %   膨胀腐蚀算子,相当于闭操作
    se = strel('disk',2);
    Q=imerode(Z,se);%腐蚀
    Q=imdilate(Q,se);%膨胀
    lab1='原图';    
    lab4='腐蚀膨胀后';
    subplot(221);imshow(I);title(lab1);
    subplot(222);imshow(M);title(lab2);
    subplot(223);imshow(Z);title(lab3);
subplot(224);imshow(Q);title(lab4);

三帧差分法

filename1='110.jpg';%读取前一帧
    I1 = imread(filename1);
    O = rgb2gray(I1);%读,灰度前一帧
     filename2='115.jpg';%读取中间帧图像
    I2 = imread(filename2);
    P = rgb2gray(I2);%读,灰度当前帧
    filename3='120.jpg';%读取后一帧图像
    I3 = imread(filename3);
    Q = rgb2gray(I3);%读,灰度后一帧
   A = imabsdiff(P,O);
   level1 = graythresh(A);
    A = im2bw(A,level1);%二值化前两帧差图
   subplot(131);imshow(A);
    B = imabsdiff(Q,P);
   level = graythresh(B);
    B = im2bw(B,level);%二值化后两帧差图
   
    subplot(132);imshow(B);
 for i=1:480 
        for j=1:720
              C(i,j)=A(i,j)*B(i,j);
       end
 end
 subplot(133);imshow(C);%二AB两图相与

帧差分循环读写

for i=1:numberofframe%numberofframe为帧数
    filename=strcat(num2str(i),'.jpg');
    I = imread(filename);
    X = rgb2gray(I);%读,灰度原图
    filename = 'YCBJ.jpg';
    M = imread(filename);
    Y = rgb2gray(M);%读,灰度背景图
    Z = imsubtract(Y,X);%两图相减
    level = graythresh(Z);
    Z = im2bw(Z,level);%二值化图
    %   膨胀腐蚀算子,相当于闭操作  
   imwrite(Z,strcat(num2str(i),'Chafenghou.jpg'),'jpg');% 保存帧
    end  

掩模处理

D = imread('zhan.jpg');
      %掩模处理  
       for j=1:720 
        for i=1:480
                if(j<-2.39*i+765)
                    D(i,j)=0;
                end
                if(j>0.8*i+460)
                    D(i,j)=0;
                end
                if(i<140)
                    D(i,j)=0;
                end
        end 
        end

图像对称翻转

AA=imread('b.jpg');%文件名是你自己的哦
for k=1:3
B(:,:,k)=fliplr(AA(:,:,k));%左右翻转
end
imwrite(B,'obj.jpg','jpg');% 保存帧

简单的判断摔倒

BJ=imread('YCBJ.jpg');%   读取有物体彩色图片
fileName = '6.avi'; 
obj = VideoReader(fileName);
numFrames = obj.NumberOfFrames;% 帧的总数
for k = 1 :numFrames% 读取数据     
T = read(obj,k);
A=imsubtract(BJ,T);
level = graythresh(A);
B = im2bw(A,level);%二值
 for j=1:720 
        for i=1:480
                if(j<-2.39*i+765)
                    B(i,j)=0;
                end
                if(j>0.8*i+460)
                     B(i,j)=0;
                end
                if(i<140)
                     B(i,j)=0;
                end
                
        end 
 end   
 %  imwrite(B,strcat(num2str(k),'.jpg'),'jpg');% 保存帧
 figure(1);
 imshow(B);
[bwl,ln]=bwlabel(B,8); 
STATS=regionprops(bwl,'Area');
a=0;
for n=1:ln
 if(STATS(n).Area>500)
     abc=(bwl==n);
    [c,r]=find(abc==1);
    a=a+1;
                xbegin=min(r);
                ybegin=min(c);
                xlength=max(r)-xbegin;
                ylength=max(c)-ybegin;
                p=ylength/xlength;
          if(p<=1) 
           hold on
           rectangle('Position',[xbegin,ybegin,xlength,ylength],'EdgeColor','R','linewidth',3);
           hold off
          end
 end
  end   
end

改善后的判断摔倒

BJ=imread('YCBJ.jpg');%   读取有物体彩色图片
fileName = '13.wmv'; 
obj = VideoReader(fileName);
numFrames = obj.NumberOfFrames;% 帧的总数
H=zeros(1,1);
S=zeros(1,1);
for k = 1:numFrames% 读取数据     
T = read(obj,k);
A=imsubtract(BJ,T);
level = graythresh(A);
B = im2bw(A,level);%二值
 
 for j=1:720 
        for i=1:480                
                if(i<140)
                     B(i,j)=0;
                end
        end 
 end   
 
 %  imwrite(B,strcat(num2str(k),'.jpg'),'jpg');% 保存帧
 figure(1);
 imshow(T);
[bwl,ln]=bwlabel(B,8); 
STATS=regionprops(bwl,'Area');
a=0;
for n=1:ln
 if(STATS(n).Area>50)
     abc=(bwl==n);
    [c,r]=find(abc==1);
                xbegin=min(r);
                ybegin=min(c);
                xlength=max(r)-xbegin;
                ylength=max(c)-ybegin;
                p=ylength/xlength;
              
          if(p<=1) 
                 x=max(c);
       y = 39.916*x-10881;
             y1=y*0.8566;
            y2=y*1.1434;
             if(STATS(n).Area<y2&&STATS(n).Area>y1) 
                 a=a+1;
               
                H(k,a)=max(c);
           S(k,a)=STATS(n).Area;
           hold on
           rectangle('Position',[xbegin,ybegin,xlength,ylength],'EdgeColor','R','linewidth',3);
           hold off
         end
   end
  end 
end
End

将目标区域值存入矩阵数据分析

BJ=imread('YCBJ.jpg');%   读取有物体彩色图片
fileName = '1.avi'; 
obj = VideoReader(fileName);
numFrames = obj.NumberOfFrames;% 帧的总数
H=zeros(1,1);
S=zeros(1,1);
for k = 1:numFrames% 读取数据     
T = read(obj,k);
A=imsubtract(BJ,T);
level = graythresh(A);
B = im2bw(A,level);%二值
 imshow(B);
%  imwrite(B,strcat(num2str(k),'.jpg'),'jpg');% 保存帧
[bwl,ln]=bwlabel(B,8); 
STATS=regionprops(bwl,'Area');
a=0;
for n=1:ln
     if(STATS(n).Area>400)
     abc=(bwl==n);
    [c,r]=find(abc==1);
    a=a+1;
                H(k,a)=max(c);%将联通区域底部坐标放到矩阵H中
           S(k,a)=STATS(n).Area;%将联通区域面积坐标放到矩阵S中
     end
end
   end  

猜你喜欢

转载自blog.csdn.net/zuoan1993/article/details/132747995