You are on page 1of 7

Primera hoja, aquí se procederá a realizar la toma de una foto el cual se procesara y se

realizara varias opciones de procesamiento de imágenes.

Además se puede apreciar las opciones de encender capturar y apagar la cámara, las cuales se
ha configurado de la siguiente manera.
% Boton Encender camara
function pushbutton2_Callback(hObject, eventdata, handles)

global vid
set(handles.axes1,'visible','on');
axes(handles.axes1);
vid=videoinput('winvideo',1);
vid.ReturnedColorSpace='rgb';
vidRes=get(vid,'VideoResolution');
nBanda=get(vid,'NumberOfBands');
hImage=image(zeros(vidRes(2),vidRes(1),nBanda));
preview(vid,hImage);

% boton capturar.
function pushbutton3_Callback(hObject, eventdata, handles)
global vid
global BBOX

set(handles.axes2,'Visible','On');%pantalla
set(handles.popupmenu1,'Visible','On');%opciones de imagen
set(handles.pushbutton6,'Visible','On');%limpiar
set(handles.pushbutton7,'Visible','On');%procesar
foto=getsnapshot(vid);%capturar foto
facedetector=vision.CascadeObjectDetector(); %barrido de la imagen
BBOX=step(facedetector,foto);%encuentra el rostro
axes(handles.axes2);
imshow(foto);

rectangle('position',BBOX(1,:),'edgecolor','b','linewidth',2);%dibuja
recuadro
folder='D:\INFORMACION\DOCUMENTOS\MATLAB\ejemplo';
imwrite(foto,fullfile(folder,'imagen_in.jpg'));

% Botón Apagar cámara


function pushbutton4_Callback(hObject, eventdata, handles)
set(handles.axes1,'visible','off');
closepreview
fondo=imread('io.jpg');
axes(handles.axes1);
imshow(fondo);

Es importante para este proyecto el uso de variables globales ya que usaremos otra pantalla
de opciones y será requisito necesario los datos obtenidos por la primera pantalla.

También se ha hecho necesario usar funciones para llamadas a los objetos usados en la
interfaz guide del programa como son los handles.

Ya que el proyecto se basa en el análisis y procesamiento de imágenes haremos uso de un


directorio en el cual almacenaremos usuarios y estos mismos serán utilizados para realizar la
comparación de un nuevo usuario.

Tabien ofrece un botón de limpiar si la captura no es la mas optima o no se visualiza muy bien.
% boton limpiar
function pushbutton6_Callback(hObject, eventdata, handles)

logo=imread('io.jpg');
axes(handles.axes1);
imshow(logo);
axes(handles.axes2)
imshow(logo);

set(handles.pushbutton6,'Visible','off');
set(handles.popupmenu1,'Visible','off');
set(handles.pushbutton7,'Visible','off');
set(handles.edit1,'Visible','off');
En la segunda Pantalla o a la que se puede acceder mediante el botón de crear un nuevo
usuario se procede a registrar nuevos usuarios donde nos permite tomar una foto y guardar en
la base de datos mediante un nombre y este a su vez en la base de datos tomara solo un área
de trabajo en cual será tomado para las respectivas comparaciones, las dimensiones sera de
58x74
% --- boton crear usuario
function pushbutton1_Callback(hObject, eventdata, handles)

close(Registro);
BaseD

Y el botón procesar es el más importante de nuestro proyecto, ya que es aquí donde se


procese a realizar cálculos matemáticos y estadísticos para evaluar las imágenes y ver las que
más tengan un parecido con los almacenados en la base de datos.
% Procesar imágenes
function pushbutton7_Callback(hObject, eventdata, handles)
global BBOX
set(handles.pushbutton6,'Visible','On');%botón limpiar
foto=imread('ejemplo\imagen_in.jpg');
imagen_gray=rgb2gray(foto);
facedetector=vision.CascadeObjectDetector();
BBOX=step(facedetector,foto)
recorte=imcrop(imagen_gray,BBOX(1,:)); %recorta y la sobrescribe
en la actual
work_area=imresize(recorte,[74 58]); %retorna una imagen que es
scala veces el tamaño de recorte
axes(handles.axes2);
imshow(work_area);
folder='D:\INFORMACION\DOCUMENTOS\MATLAB\ejemplo';
imwrite(work_area,fullfile(folder,'area_trabajo.jpg'));

% +++++++ PROCESAMIENTO PCA++++ ANALISISI DE PROCESAMIENTO


PRINCIPAL
% Cambiamos el tamaño de las imágenes, cambiamos a escala de grises

input_dir='D:\INFORMACION\DOCUMENTOS\MATLAB\ejemplo\Banco';
image_dimensiones=[74 58];%se estableces que las medidas sera
74x58
filenames=dir(fullfile(input_dir,'*.jpg')); %lista y lee que hay
en la carpeta

% ELEMENTOS DE UNA MATRIZ Y DEFINIMOS LA MATRIZ


num_images=numel(filenames) %retorna el número de elementos en
una matriz
images=[]; %se crea una matriz, la matriz de
la imagen se pasa a un vector

for n=1:num_images %para cada imagen que este en la


carpeta
filename=fullfile(input_dir,filenames(n).name);%se selecciona la
imagen
img1=imread(filename); %se lee las imagenes
img1=im2double(img1); %doble precision reescalar los
datos
img=imresize(img1, [74 58]); % retorna una imagen que es escala
veces el tamaño
img=img(:,:,1);

if n==1
images=zeros(prod(image_dimensiones),num_images); % se
establece el vector contenedor
end
images(:,n)=img(:); %se guarda en un vector correspondiente
end

% Hallamos el promedio de las imagenes++++++++++++++++++++++++++++

mean_face=mean(images,2); %obtiene media o promedio de


los vectores
rep=repmat(mean_face,1,num_images); %devuelve un vector de n
copias

%normalizamos+++++++++++++++++++++++++++++++++++++++++++++++++++++

normalizar=images-rep; %sustrae la informacion mas


importante

% Hallamos la matriz de covarianza+++++++++++++++++++++++++++++++


%calculamos los vectores propios de la matriz de covarianza
[evectors,score,evalues]=princomp(images'); % calcula los
eigenvectors,acore
num_eigenvectors=30; % se limita a 30 el número de los eigenvectors
evectors=evectors(:,1:num_eigenvectors);

features=evectors'*normalizar; % se proyectan las imágenes dentro


% de un sub espacio para generar {vectores característicos } matriz
de
% media 0

input_work=imread('ejemplo\area_trabajo.jpg');
input_work=imresize(input_work,[74 58]); %se adapta el area de
trabajo
input_work=im2double(input_work);% realiza la comparacion

% calcular la similaridad de la entrada con cada una imagen de la


% carpeta en base a la distancia euclidiana inversa
feature_vec=evectors'*(input_work(:)-mean_face);% vector
caracteristico
similarity_score=arrayfun(@(n)1/(norm(features(:,n)-
feature_vec)),1:num_images)
% encuentra la imagen con mayor similitud

[match_score,match_1x]=max(similarity_score); % devuelve los


elementos más grandes de la matriz
similarity_score*100
match_score*100

% condiciones para la imagen

if match_score>=0.5 % mayor a 0.5


foto_gan=filenames(match_1x).name;
foto_win=imread(foto_gan);
foto_win=imresize(foto_win, image_dimensiones);
axes(handles.axes2);
imshow(foto_win);

%++++++++++++++++++++++++++++++++++++++++

texto=sprintf('La mayor semejanza es con la imagen %s de la base de


datos con un score de %s',foto_gan,match_score);
set(handles.edit1,'String',texto);
set(handles.edit1,'Visible','On');

% en el caso de que no esté registrado incognito

else
foto_=imread('incognito.jpg');
axes(handles.axes1);
imshow(foto_);
texto=sprintf('La semejanza es mínima, esta persona no esta
registrada');
set(handles.edit1,'String',texto);
set(handles.edit1,'Visible','On');
end

En la siguiente pantalla se mostrará la configuración de registro de nuevos usuarios.


Aquí se ha añadido un botón de abrir imagen el cual, tiene la función de buscar imágenes
ingresar usuarios a la base de datos desde una imagen correspondiente a un usuario.

Esto se puede dar a la necesidad de registrarse si el usuario no tiene una cámara y cuente con
fotos capturadas por otros dispositivos.

% --- Boton abrir imagen


function pushbutton9_Callback(hObject, eventdata, handles)

global BBOX
global work_area
[filename path] = uigetfile(('*.jpg'),'Abrir Imagen')
if isequal(filename,0)
return
else
folder='D:\INFORMACION\DOCUMENTOS\MATLAB\ejemplo';
foto=imread(strcat(path,filename));
imwrite(foto,fullfile(folder,'imagen_in.jpg'));%sobre escribe a la
foto
facedetector=vision.CascadeObjectDetector();
BBOX=step(facedetector,foto);
set(handles.axes5,'Visible','On');%pantalla
axes(handles.axes5);
imshow(foto)
rectangle('position',BBOX(1,:),'edgecolor','b','linewidth',3)
set(handles.text3,'Visible','On');%static nombre
set(handles.text4,'Visible','On');%static codigo
set(handles.edit1,'Visible','On');%text edit1
set(handles.edit2,'Visible','On');%text edit2
set(handles.pushbutton20,'Visible','On');% guardar

imagen_gray=rgb2gray(foto);
recorte=imcrop(imagen_gray,BBOX(1,:));
work_area=imresize(recorte,[74 58]);
end
Y también el botón de guardar este es muy importante ya que es aquí donde se dan uso a las
variables globales anterior mente mencionada, este botón toma la información obtenida por
las otras opciones y procede a guardar en la base de datos.
boton guardar
function pushbutton20_Callback(hObject, eventdata, handles)

global work_area
global BBOX
folder='D:\INFORMACION\DOCUMENTOS\MATLAB\ejemplo\Banco';
nombre=get(handles.edit1,'String');

if isempty(nombre)
msj=questdlg('Ingrese nombre de Usuario','Mensaje','OK','OK');%
question dialogo
if strcmp (msj,'OK')%%compara los espacios de cadena ok y ok
return;
end
end
nombre=char(nombre); %concatena cadena horizontal
name=strcat(nombre,'.jpg')
imwrite(work_area,fullfile(folder,name));
msj=questdlg('Se guardo correctamente','Mensaje','Ok','Ok');
close(BaseD);
Registro;

You might also like