%这个程序是对一段avi视频进行人脸检测,要求背景比较简单,
%因为把膨胀腐蚀的部分去掉了,所以实时性还不错,下面的图片是取的其中的某一帧。
clear all;
clc;
close all;
avi = aviread('1.avi');
video={avi.cdata};
L=length(video);
aviobj = avifile('E:\program\video_face\newmovie');
aviobj.Quality = 100;
aviobj.compression='None';
%for a = 1:length(video) %总循环
for a = 1:(L/4) %总循环
M=video{a};
%imshow(M);hold on;
I=double(M);
[hue,s,v]=rgb2hsv(I);
segment=zeros(size(I(:,:,1)));
im=zeros(size(I(:,:,1)));
face=zeros(size(I(:,:,1)));
cb = 0.148* I(:,:,1) - 0.291* I(:,:,2) + 0.439 * I(:,:,3) + 128;
cr = 0.439* I(:,:,1) - 0.368* I(:,:,2) - 0.071 * I(:,:,3) + 128;
[w,h]=size(I(:,:,1));
for i=1:w
for j=1:h
if 140<=cr(i,j) & cr(i,j)<=165 & 140<=cb(i,j) & cb(i,j)<=195 & 0.01<=hue(i,j) & hue(i,j)<=0.1
segment(i,j)=1;
else
segment(i,j)=0;
end
end
end
im(:,:,1)=I(:,:,1).*segment(:,:);
im(:,:,2)=I(:,:,2).*segment(:,:);
im(:,:,3)=I(:,:,3).*segment(:,:);
skin_region=segment;
bw_face=rgb2gray(im);
bw_face=bwboundaries(bw_face);
bw_face_sz=size(bw_face);
for k=1:bw_face_sz(1)
bnd=bw_face{k};
rb2=double(max(bnd));
lt2=double(min(bnd));
if (max(rb2-lt2)>20)
% rectangle('Position',[lt2(2)左列,lt2(1)上行,rb2(2)-lt2(2)宽,rb2(1)-lt2(1)高],'EdgeColor','g'); %画矩形
%rectangle('Position',[lt2(2),lt2(1),rb2(2)-lt2(2),rb2(1)-lt2(1)],'EdgeColor','g');
j=lt2(2):rb2(2);M(lt2(1),j,1)=0;M(rb2(1),j,1)=0;
i=lt2(1):rb2(1);M(i,lt2(2),1)=0;M(i,rb2(2),1)=0;
j=lt2(2):rb2(2);M(lt2(1),j,2)=200;M(rb2(1),j,2)=200;
i=lt2(1):rb2(1);M(i,lt2(2),2)=200;M(i,rb2(2),2)=200;
j=lt2(2):rb2(2);M(lt2(1),j,3)=140;M(rb2(1),j,3)=140;
i=lt2(1):rb2(1);M(i,lt2(2),3)=140;M(i,rb2(2),3)=140;
end
end
%imshow(M);
aviobj = addframe(aviobj,uint8(M));
end %总循环结束
aviobj=close(aviobj);
mov = aviread('E:\program\video_face\newmovie');
movie(mov);