一个可以用来做人脸检测的视频帧间差分代码

时间长了,也不知道原作者是谁了,先帖子在这里


% mov=aviread('2.avi');%读取视频帧,视频格式为[1*100]Struct
% temp=size(mov); %temp=[1 100]
% fnum=temp(2);   %fnum=100
%
% for i=1:fnum,
%    strtemp=strcat(int2str(i),'.','JPG');
%    imwrite(mov(i).cdata(:,:,:),strtemp);
% end  %从视频中提出每一帧图像


o=3;
e='.jpg';

for i=1:20
   
    u=o-1;v=o-2;
   
    m=int2str(o);
    n=int2str(u);
    h=int2str(v);
   
    s=strcat(m,e);       %%把字符串b与m连接后在连接e得到图像文件存储的位置
    m=imread(s);         %%从S处把图像读取出来
    m=rgb2gray(m);       %%将图像M灰度化
   

    s=strcat(n,e);       %%把字符串b与m连接后在连接e得到图像文件存储的位置
    n=imread(s);         %%从S处把图像读取出来
    n=rgb2gray(n);       %%将图像M灰度化
   
    s=strcat(h,e);       %%把字符串b与m连接后在连接e得到图像文件存储的位置
    h=imread(s);         %%从S处把图像读取出来
    h=rgb2gray(h);       %%将图像M灰度化
   

 
    m=medfilt2(m,[3,3]); %%中值滤波
    n=medfilt2(n,[3,3]); %%中值滤波
    h=medfilt2(h,[3,3]); %%中值滤波

    q=im2double(m);      %%将图像数组转换为double型
    w=im2double(n);      %%将图像数组转换为double型
    g=im2double(h);      %%将图像数组转换为double型
   

   
    c=q-w;j=w-g;    %作帧差
    th=10/255;      %设定阈值
    se90=strel ('line',3,90);se0=strel ('line',3,0);%构造结构元素

    %第一帧间差
    k=find(abs(c)>=th);
    c(k)=1;
    k=find(abs(c)     c(k)=0; 
    se=strel('diamond',5);
    c=bwareaopen(c,15);        %删除小面积对象
    %c=bwmorph(c,'close');     %形态学闭运算
    %c=imdilate(c,[se90,se0]);   %膨胀运算
    c=imdilate(c,se); %膨胀运算
    %c=bwmorph(c,'close');    %形态学闭运算
    %c=bwareaopen(c,50);      %删除小面积对象

   
    %第二帧间差
    k=find(abs(j)>=th);
    j(k)=1;
    k=find(abs(j)     j(k)=0;
    j=bwareaopen(j,15);         %删除小面积对象
    %j=bwmorph(j,'close');       %形态学闭运算
    %j=imdilate(j,[se90,se0]);   %膨胀运算
    j=imdilate(j,se); %膨胀运算
    %j=bwmorph(j,'close');       %形态学闭运算
    %j=bwareaopen(j,50);         %删除小面积对象


    c=c&j;
    %c=imerode(c,[se90,se0]);   %腐蚀运算
    a=c;b=c;d=c;f=c;
   

    [m,n]=size(c);
    %%行扫描填充
    for i=1:m
        for j=1:n-1
            if a(i,j)>0
                a(i,j+1)=1;      
            end
        end
    end
    for i=1:m
        for j=n:-1:2
            if b(i,j)>0
                b(i,j-1)=1;
            end
        end
    end

    th=a&b;

   
    %%列扫描填充
    for i=1:n
        for j=1:m-1
            if d(j,i)>0
                d(j+1,i)=1;      
            end
        end
    end
    for i=1:n
        for j=m:-1:2
            if f(j,i)>0
                f(j-1,i)=1;
            end
        end
    end

    td=d&f;
 
    c=th&td;
    
    figure,imshow(c);
    o=o+1;
end

你可能感兴趣的:(其他)