Anda di halaman 1dari 4

% reconocimiento de rostros

%1) cambiar el tamao de todas las fusiones se enfrenta a N*N


%2) eliminar el promedio
%3) crear la matriz A de caras cada fila N*N tamao total de A es (N*N) * N
%4) calcular la media cara
%5) normaliza: quitar el promedio de cara la matriz A
%6) calcular la matriz de covarianza c A' * A, tamao C es M*M
%7) Calcular valores propios y vectores propios, para calcular los eigen
%8) calcular la combinacin lineal de cada rostro original
%9) dado nuevo proyecto de cara a cara y eigen la distancia de computo a

clear all, close all;clc;


N=50 ; %Tamao de la imagen
M=6 ; % Numero de rostros 6
scrsz = get(0,'ScreenSize');
ancho = scrsz (3);
alto = scrsz (4);
ancho=round(ancho/3);
alto=round(alto/2)-40;
%% cargar las imagenes y redimensionar

%diana
diana = imread('eigen/diana.jpg', 'jpg');
diana=rgb2gray(diana);
diana=imresize(diana,[N N] );
figure('position',[10 alto ancho alto])
subplot(2,3,1),imshow(diana,'Initialmagnification','fit');title('diana')

%felipe
felipe = imread('eigen/felipe.jpg', 'jpg');
felipe=rgb2gray(felipe);
felipe=imresize(felipe,[N N] );
subplot(2,3,2),imshow(felipe,'Initialmagnification','fit');title('felipe')

%gian
gian = imread('eigen/gian.jpg','jpg');
gian=rgb2gray(gian);
gian=imresize(gian,[N N] );
subplot(2,3,3),imshow(gian,'Initialmagnification','fit');title('gian')

%guli
guli = imread('eigen/guli.jpg','jpg');
guli=rgb2gray(guli);
guli=imresize(guli,[N N] );
subplot(2,3,4),imshow(guli,'Initialmagnification','fit');title('guli')

%marcia
marcia = imread('eigen/marcia.jpg','jpg');
marcia=rgb2gray(marcia);
marcia=imresize(marcia,[N N] );
subplot(2,3,5),imshow(marcia,'Initialmagnification','fit');title('marcia')

%rene
rene = imread('eigen/rene.jpg','jpg');
rene=rgb2gray(rene);
rene=imresize(rene,[N N] );
subplot(2,3,6),imshow(rene,'Initialmagnification','fit');title('rene')
pause(2)
%% paso1 concatenar imagenesNxNxN

MC(:,:,1)=diana;
MC(:,:,2)=felipe;
MC(:,:,3)=gian;
MC(:,:,4)=guli;
MC(:,:,5)=marcia;
MC(:,:,6)=rene;

st.names = {'diana','felipe','gian','guli','marcia','rene'};
st.data{1} = diana;
st.data{2} = felipe;
st.data{3} = gian;
st.data{4} = guli;
st.data{5} = marcia;
st.data{6} = rene;

%% paso 2 : calculo de rostros promedio


avImg=zeros(N);
figure('position',[ancho alto ancho alto])
for k=1:M
st.data{k} = im2single(st.data{k}); %convierte de imagen de intensidad
avImg =avImg + (1/M)*st.data{k}; %acumula la imagen y el promedio
subplot(2,3,k),imshow(avImg,'Initialmagnification','fit');title(['promedio con
',st.names{k}] );
pause(1)
end
pause(2)
%% paso 3: resta del promedio a cada una de las imagenes
% normalizacion (remueve los promedios)
for k=1:M
st.dataAvg{k} = st.data{k} -avImg;
end
z =[ st.dataAvg{1} st.dataAvg{2} st.dataAvg{3}; st.dataAvg{4} st.dataAvg{5}
st.dataAvg{6}];
ZC(:,:,1)=st.dataAvg{1};
ZC(:,:,2)=st.dataAvg{2};
ZC(:,:,3)=st.dataAvg{3};
ZC(:,:,4)=st.dataAvg{4};
ZC(:,:,5)=st.dataAvg{5};
ZC(:,:,6)=st.dataAvg{6};
figure('position',[(2*ancho) alto ancho
alto]),imshow(z,'Initialmagnification','fit');title(['resta del promedio']);
pause(3)
%% paso3.2: calculo de autovectores matriz de covarianza
%generar vector A = [img1(:) img2(:)... imgM(:) ];
A = zeros(N*N,M); % (N*N)*M 2500*4
for k=1:M
A(:,k) = st.dataAvg{k}(:);
end
% matris de covarianza de pequea dimension (transpuesta)
C = A'*A;
%figure(6),imagesc (C);title('covarianza')

%% vectores eigen en pequeas dimensiones


[ Veigvec,Deigval ] = eig(C);% v M*M e M*M unicamente diagonal de 4 valore eigen
%eigen face en largas dimensiones A*veigvec es un vector eigen de C largo
Vlarge = A*Veigvec; %2500*M*M*M =2500 *M
%redimensiona el eigen face
eigenfaces=[];
for k=1:M
c = Vlarge(:,k);
eigenfaces{k} = reshape(c,N,N);
end
x=diag(Deigval);
[xc,xci]=sort(x,'descend');% el valor mas largo eigenval en orden mayor a menor
z = [ eigenfaces{xci(1)} eigenfaces{xci(2)} eigenfaces{xci(3)};
eigenfaces{xci(4)} eigenfaces{xci(5)} eigenfaces{xci(6)}];
figure('position',[10 10 ancho alto]),
imshow(z,'Initialmagnification','fit');title(['eigenfaces']);
pause(3)
% Patron de reconocimiento

nsel=6 % seleccion de eigen faces


for mi=1:M %numero de imagenes
for k=1:nsel %eigen face para numero de coeficiente
wi(mi,k) = sum(A(:,mi) .* eigenfaces{xci(k)}(:));
end
end

%% Prueba de reconocimiento
% Clasificador de una nueva imagen
%Carpeta de trabajo C:\Users\Felipe\Documents\MATLAB\eigen
testFaceMic = imread('eigen/guli1.jpg','jpg');
testFaceMic = rgb2gray(testFaceMic);
testFaceMic = imresize(testFaceMic,[N N]);
testFaceMic = im2single(testFaceMic);
%testFaceMic = st.data{1}; test

%% reconocimiento por camara


%video1=videoinput('winvideo',1,'YUY2_320x240');
%info1=imaghwinfo('winvideo',1);
%video1.BayerSensorAlignment='grbg';
%set(video1, 'selectedSourceName', ' input1')
%preview(video1)
%pause(2)
%s=getsnashot (video1);
%s=rgb2gray(s);
%imwrite(s,'eigen/camara.jpg','jpg');
%closepreview(video1)
%testFaceMic = imresize(s, [N N]);
%testFaceMic = im2single(testFaceMic);

figure('position',[ancho 7 ancho alto]),


imshow(testFaceMic,'Initialmagnification','fit');title(['imagen a analizar']);
pause(3)
Aface = testFaceMic(:)-avImg(:); % normalizacion de rostros

for tt=1:nsel
wface(tt) = sum(Aface.* eigenfaces{xci(tt)} (:)) ;
end
% calcule la distancia
for mi=1:M
fsumcur=0;
for(tt=1:nsel)
fsumcur = fsumcur + (wface(tt) -wi(mi,tt)).^2;
end
diferencia(mi) = sqrt( fsumcur);
%disp(['La diferencia con ',st.names{mi}, ' es: ',num2str(diferencia(mi))])
end
[val in]=min(diferencia);
figure('position',[4*ancho 10 ancho alto]),imshow(st.data{in}),title(['la imagen
corresponde a ']);