diff --git a/Consultas/1.png b/Consultas/1.png new file mode 100644 index 0000000..b599384 Binary files /dev/null and b/Consultas/1.png differ diff --git a/Consultas/12.png b/Consultas/12.png new file mode 100644 index 0000000..fad1cd5 Binary files /dev/null and b/Consultas/12.png differ diff --git a/Consultas/19.png b/Consultas/19.png new file mode 100644 index 0000000..6c5f533 Binary files /dev/null and b/Consultas/19.png differ diff --git a/Consultas/25.png b/Consultas/25.png new file mode 100644 index 0000000..028511b Binary files /dev/null and b/Consultas/25.png differ diff --git a/Consultas/47.png b/Consultas/47.png new file mode 100644 index 0000000..7168f6d Binary files /dev/null and b/Consultas/47.png differ diff --git a/Consultas/68.png b/Consultas/68.png new file mode 100644 index 0000000..8264568 Binary files /dev/null and b/Consultas/68.png differ diff --git a/Consultas/77.png b/Consultas/77.png new file mode 100644 index 0000000..6fb26ad Binary files /dev/null and b/Consultas/77.png differ diff --git a/Consultas/81.2.png b/Consultas/81.2.png new file mode 100644 index 0000000..0736d62 Binary files /dev/null and b/Consultas/81.2.png differ diff --git a/Consultas/81.png b/Consultas/81.png new file mode 100644 index 0000000..c24a295 Binary files /dev/null and b/Consultas/81.png differ diff --git a/Consultas/91.png b/Consultas/91.png new file mode 100644 index 0000000..6f13c18 Binary files /dev/null and b/Consultas/91.png differ diff --git a/Consultas/92.png b/Consultas/92.png new file mode 100644 index 0000000..5ba1f97 Binary files /dev/null and b/Consultas/92.png differ diff --git a/Consultas/A.jpg b/Consultas/A.jpg new file mode 100644 index 0000000..a8bf219 Binary files /dev/null and b/Consultas/A.jpg differ diff --git a/Consultas/B.jpg b/Consultas/B.jpg new file mode 100644 index 0000000..4140662 Binary files /dev/null and b/Consultas/B.jpg differ diff --git a/Consultas/C.jpg b/Consultas/C.jpg new file mode 100644 index 0000000..1c59fe1 Binary files /dev/null and b/Consultas/C.jpg differ diff --git a/Consultas/joaco.JPG b/Consultas/joaco.JPG new file mode 100644 index 0000000..e4c499a Binary files /dev/null and b/Consultas/joaco.JPG differ diff --git a/Consultas/joaco2.jpg b/Consultas/joaco2.jpg new file mode 100644 index 0000000..2c312dd Binary files /dev/null and b/Consultas/joaco2.jpg differ diff --git a/EyesSimple.m b/EyesSimple.m new file mode 100644 index 0000000..cee1461 --- /dev/null +++ b/EyesSimple.m @@ -0,0 +1,29 @@ +function [xCLE,yCLE,xCRE,yCRE]= EyesSimple(rostro) + + RightEye = vision.CascadeObjectDetector('RightEyeCART','MergeThreshold',4); + BB=step(RightEye,rostro); + + %OJO IZQUIERDO + xLE=BB(1,1); + yLE=BB(1,2); + aLE=BB(1,3); + lLE=BB(1,4); + %Coordenadas del punto medio del ojo izquierdo + xCLE=xLE+(aLE/2); + yCLE=yLE+(lLE/2); + + %OJO DERECHO + xRE=BB(2,1); + yRE=BB(2,2); + aRE=BB(2,3); + lRE=BB(2,4); + %Coordenadas del punto medio del ojo derecho + xCRE=xRE+(aRE/2); + yCRE=yRE+(lRE/2); + + imshow(rostro); + + rectangle('Position',[xLE,yLE,aLE,lLE],'LineWidth',1,'LineStyle','-','EdgeColor','b'); + rectangle('Position',[xRE,yRE,aRE,lRE],'LineWidth',1,'LineStyle','-','EdgeColor','b'); + +end \ No newline at end of file diff --git a/calcularSimilitud.m b/calcularSimilitud.m new file mode 100644 index 0000000..f631b80 --- /dev/null +++ b/calcularSimilitud.m @@ -0,0 +1,35 @@ +%OJO que cuando no tienen relaciones en comun, toma como distancia 0. + +function distancia = calcularSimilitud(metricasObjConsulta, metricasObjX) + %la distancia que usamos es la distancia eucleadiana + i=1; + sumDeCuadrados=0; + contador=0; + largoVector = length(metricasObjConsulta); + %al ser dos vectores de igual tamaño, recorremos mientras uno se + %termina + while i<=length(metricasObjConsulta) + %Chequea si las metricas de la consulta son certeras + %Si son erroneas, tienen un valor de -1) + if ((metricasObjConsulta(i) == -1) || (metricasObjX(i) == -1)) + contador = contador + 1; + end + if ((metricasObjConsulta(i) >= 0) && (metricasObjX(i) >= 0)) + %acumulamos el cuadrado de la diferencia entre caracteristicas + sumDeCuadrados=sumDeCuadrados + ((metricasObjConsulta(i) - metricasObjX(i))^2); + i=i+1; + else + i=i+1; + end + end + + if contador < (largoVector/2) + distancia = sumDeCuadrados; + + else + distancia = 10000; + end + %distancia = sqrt (sumDeCuadrados); + %esta distancia indica la simitud entre el Obj1 y Obj2 segun sus + %metricas +end diff --git a/cargarImagenes.m b/cargarImagenes.m new file mode 100644 index 0000000..edade61 --- /dev/null +++ b/cargarImagenes.m @@ -0,0 +1,32 @@ +%Toma una ruta como entrada,carga todas las imagenes de la ruta, calcula +%las relaciones de cada una, y las carga en la base de datos + +function cargarImagenes(ruta,cantImagenes) +%Concexion con Base de datos en postgres +dbhost = 'localhost:5432'; +dbname = 'bbddRostros'; +dbuser = 'postgres'; +dbpass = 'joaco'; +dbdriver = 'C:\Users\Joaco\Downloads\jdk\PostgreSQLDriver\postgresql-9.2-1002.jdbc4'; +dburl = sprintf('jdbc:postgresql://%s/%s',dbhost,dbname); +conn = database(dbname,dbuser,dbpass,dbdriver,dburl) ; + + for i=1:cantImagenes + direccion =strcat(ruta,int2str(i),'.png'); + rostro = imread(direccion); + relRostro=relaciones(rostro); + + for j=1:10 + if j==1 + cadena =num2str(relRostro(j)); + else + cadena = strcat(cadena,',',num2str(relRostro(j))); + end + end + cadI=int2str(i); + sql= strcat('INSERT INTO "relaciones" (id,relacion[1],relacion[2],relacion[3],relacion[4],relacion[5],relacion[6],relacion[7],relacion[8],relacion[9],relacion[10]) VALUES (',cadI,',',cadena,')'); + exec( conn, sql); + + end + +end \ No newline at end of file diff --git a/chequearBoca.m b/chequearBoca.m new file mode 100644 index 0000000..675bb20 --- /dev/null +++ b/chequearBoca.m @@ -0,0 +1,26 @@ +%LR=largoRostro +%AR=altoRostro +%XB=ValorEnXDeLaBoca +%YB=ValorENYDeLaBoca + +function resultado = chequearBoca(LR,AR,XB,YB) + resultado=0; + %El primer pixel comienza en la izquiera y va hacia la derecha + %La boca en un rostro se ubica en la segunda columna, tomando + % 3 columnas totales (columna media) + AnchoCadaColumna=LR/3; + XInicialColumnaBoca=AnchoCadaColumna; + XFinalColumnaBoca=2*AnchoCadaColumna; + %El primer pixel comienza desde arriba y va hacia abajo + %La boca se ubica en la ultima fila (fila 3) dividiendo el + %rostro en 3 filas de arriba hacia abajo + AlturaCadaFila=AR/3; + YInicialFilaBoca=2*AlturaCadaFila; + YFinalFilaBoca=3*AlturaCadaFila; + %Chequeo de cuadrantes + if (XInicialColumnaBoca < XB) && (XFinalColumnaBoca > XB) + if ( YInicialFilaBoca < YB) && (YFinalFilaBoca > YB) + resultado= 1; + end; + end; +end \ No newline at end of file diff --git a/chequearNariz.m b/chequearNariz.m new file mode 100644 index 0000000..6125d06 --- /dev/null +++ b/chequearNariz.m @@ -0,0 +1,26 @@ +%LR=largoRostro +%AR=altoRostro +%XN=ValorEnXDeNariz +%YN=ValorENYDeNariz + +function resultado=chequearNariz(LR,AR,XN,YN) + resultado = 0; + %El primer pixel comienza en la izquiera y va hacia la derecha + %La nariz en un rostro se ubica en la tercer columna, tomando + % 5columnas totales (columna media) + AnchoCadaColumna=LR/5; + XInicialColumnaNariz=2*AnchoCadaColumna; + XFinalColumnaNariz=3*AnchoCadaColumna; + %El primer pixel comienza desde arriba y va hacia abajo + %La nariz se ubica en la tercer fila dividiendo el rostro en 4 filas + AlturaCadaFila=AR/4; + YInicialFilaNariz=2*AlturaCadaFila; + YFinalFilaNariz=3*AlturaCadaFila; + %Chequeo de cuadrantes para nariz + if (XInicialColumnaNarizXN) + if (YInicialFilaNarizYN) + resultado= 1; + end; + end; +end + diff --git a/consulta.m b/consulta.m new file mode 100644 index 0000000..520ef35 --- /dev/null +++ b/consulta.m @@ -0,0 +1,40 @@ +function resultado = consulta(rutaConsulta,cantParecidos) +relacionesAuxiliar = []; +imagenConsulta = imread(rutaConsulta); +relConsulta = relaciones(imagenConsulta); +%conexion con base de datos +dbhost = 'localhost:5432'; +dbname = 'bbddRostros'; +dbuser = 'postgres'; +dbpass = 'joaco'; +dbdriver = 'C:\Users\Joaco\Downloads\jdk\PostgreSQLDriver\postgresql-9.2-1002.jdbc4'; +dburl = sprintf('jdbc:postgresql://%s/%s',dbhost,dbname); +conn = database(dbname,dbuser,dbpass,dbdriver,dburl) ; +e = exec( conn, 'SELECT relacion[1],relacion[2],relacion[3],relacion[4],relacion[5],relacion[6],relacion[7],relacion[8],relacion[9],relacion[10] FROM relaciones' ); +e = fetch(e); + +cantidadRostrosEnBBDD = size(e.Data,1); +for j=1:cantidadRostrosEnBBDD + for i=1:10 + relacionesAuxiliar(i) = cell2mat( e.Data(j,i)); + + end; + + distancia = calcularSimilitud(relacionesAuxiliar, relConsulta); + relacionesAuxiliar=[]; + lista(j) = distancia; + +end; + + [minimos]=encontrar(lista,cantParecidos); + resultado=[lista,minimos]; + + %[minimo,indice] = min(lista); + %resultado=[lista,minimo,indice]; + %figure,imshow(rutaConsulta); + %direccionRostro = strcat('./Sistema V2/SistemaV2_BBDD/BBDD_Destino/',int2str(indice),'.png'); + %figure,imshow(direccionRostro); + +end + + diff --git a/dist.m b/dist.m new file mode 100644 index 0000000..8ece84c --- /dev/null +++ b/dist.m @@ -0,0 +1,4 @@ +function distance = dist(x1,y1,x2,y2) +distance=sqrt( ((x2-x1)^2 ) + ((y2-y1)^2)); + +end \ No newline at end of file diff --git a/encontrar.m b/encontrar.m new file mode 100644 index 0000000..14a52cb --- /dev/null +++ b/encontrar.m @@ -0,0 +1,25 @@ +%Esta funcion toma como entrada la lista de diferencias entre la base de +%datos y la consulta (lista) y la cantidad de imagenes mas parecidas que +%quiere devolver + +function resultado= encontrar(lista,cantMinim) +listaMinimos=minim(lista,cantMinim); +posiciones=[]; +i=1; +j=1; + while length(posiciones) < length(listaMinimos) + res = find(lista == listaMinimos(j)); + for t=1:length(res) + if length(posiciones) < length(listaMinimos) + posiciones(i)=res(t); + i=i+1; + + end + j=j+1; + + + end + resultado=[listaMinimos,posiciones]; +end + + diff --git a/eyesV2.m b/eyesV2.m new file mode 100644 index 0000000..aa20cdc --- /dev/null +++ b/eyesV2.m @@ -0,0 +1,86 @@ + +%Toma como entrada el rostro(previamente recortado) y las coordenadas del punto medio de la nariz, en base a esto +%compara todos los ojos encontrados tanto derechos como izquierdos y se +%queda con el que tenga mas "sentido", midiendo la distancia entre cada uno +%de estos al punto medio de la nariz. +%Agrega el chequeo de ojos, cuando se evalua la condicion de distancias +%entre ojos y nariz +function [xCREfinal,yCREfinal,xCLEfinal,yCLEfinal] = eyesV2(rostro,xCN,yCN) +ancho=size(rostro,1); +alto=size(rostro,2); +%Para chequear despues si encontro buenos ojos +xCREfinal=0; +yCREfinal=0; +xCLEfinal=0; +yCLEfinal=0; +i=1; +j=1; +correcto=0; +correcto2=0; + + + + while (correcto==0) && (j < 16) + LeftEye = vision.CascadeObjectDetector('LeftEyeCART','MergeThreshold',j); + LE=step(LeftEye,rostro); + + j=j+1; + limit=size(LE,1); + + + + while (limit) > 0 && (correcto==0) + xLE=LE(limit,1); + yLE=LE(limit,2); + aLE=LE(limit,3); + lLE=LE(limit,4); + limit=limit-1; + + + %Coordenadas del punto medio del ojo izquierdo + xCLE=xLE+(aLE/2); + yCLE=yLE+(lLE/2); + + while (correcto2==0) && (i < 16) + + RightEye = vision.CascadeObjectDetector('RightEyeCART','MergeThreshold',i); + RE=step(RightEye,rostro); + i=i+1; + limit2=size(RE,1); + while (limit2) > 0 && (correcto2==0) + xRE=RE(limit2,1); + yRE=RE(limit2,2); + aRE=RE(limit2,3); + lRE=RE(limit2,4); + limit2=limit2-1; + + + + %Coordenadas del ojo derecho + xCRE=xRE+(aRE/2); + yCRE=yRE+(lRE/2); + if (dist(xCRE,yCRE,xCN,yCN) - dist(xCLE,yCLE,xCN,yCN) < 3) %&& (xCRE > (ancho/2)) && (xCLE < (ancho/2)) + xCREfinal=xCRE; + yCREfinal=yCRE; + xCLEfinal=xCLE; + yCLEfinal=yCLE; + correcto=1; + correcto2=1; + + + end + end + end + + + + end + end +end + + + + + + + diff --git a/leftEyeV3.m b/leftEyeV3.m new file mode 100644 index 0000000..97b8388 --- /dev/null +++ b/leftEyeV3.m @@ -0,0 +1,42 @@ +%ANDA PERFECTO PARA LAS IMAGENES ESTANDARIZADAS +%Entra como parametro el rostro (previamente recortado) y devuelve las +%coordendas del punto medio del ojo derecho.Itera para encontrar el +%ojo derecho con mejor precision. + +function [xCLEFinal,yCLEFinal] = leftEyeV3(rostro) +%ancho y alto del rostro para hacer el recorte del ojo izquierdo +ancho=size(rostro,1); +alto=size(rostro,2); +%parametros para el imcrop +%REC=[0,0,ancho/2,alto/2]; +%rostro2=imcrop(rostro,REC); + +xCLEFinal=0; +yCLEFinal=0; + + correcto=0; +i=1; + while correcto==0 && i<16 + RightEye = vision.CascadeObjectDetector('LeftEye','MergeThreshold',i); + BB=step(RightEye,rostro); + lim=size(BB,1); + i = i+1; + while lim > 0 && correcto==0 + xLE=BB(lim,1); + yLE=BB(lim,2); + aLE=BB(lim,3); + lLE=BB(lim,4); + lim=lim-1; + %Coordenadas del punto medio del ojo derecho + xCLE=xLE+(aLE/2); + yCLE=yLE+(lLE/2); + if (xCLE < ancho/2) && (yCLE < alto/2) + xCLEFinal = xCLE; + yCLEFinal = yCLE; + correcto=1; + end + end + end +end + + diff --git a/minim.m b/minim.m new file mode 100644 index 0000000..50aeb85 --- /dev/null +++ b/minim.m @@ -0,0 +1,33 @@ +%Esta funcion toma como entrada un vector de valores y la cantdad de +%valores mas chios que se quieren obtener, y se obtienen los n valores mas +%pequeños + +function minimos = minim(vector,cantMinimos) + + for j=1:cantMinimos + + + minimos(j)=vector(1); + + for i=1: length(vector) + + if minimos(j)> vector(i) + minimos(j)=vector(i); + end + end + pos=find(vector== minimos(j)); + vector(pos(1))=[]; + %for k=1:length(pos) + %vector(pos(k))=[]; + %end + end + %PARA QUE DEVUELVE CON TODAS LAS ITERACIONES BORRAR EL ULTIMO FOR Y + %DEJAR vector(pos(1))=[]; + + +end + + + + + diff --git a/mouthV2.m b/mouthV2.m new file mode 100644 index 0000000..02b1aa0 --- /dev/null +++ b/mouthV2.m @@ -0,0 +1,38 @@ +%Entra como parametro el rostro (previamente recortado) y devuelve las +%coordendas del punto medio de la boca detectada.Itera para encontrar la +%boca con mejor precision. +function [xCMFinal,yCMFinal,anchoMouth] = mouthV2(rostro) +ancho=size(rostro,1); +alto=size(rostro,2); +%Para despue chequear si encontro o no una buena boca +xCMFinal=0; +yCMFinal=0; +anchoMouth=-1; + +for i = 4 : 32 + MouthDetect = vision.CascadeObjectDetector('Mouth','MergeThreshold',i); + BB=step(MouthDetect,rostro); + lim=size(BB,1); + for j = 1:lim + %Calculo el punto medio para cada una de las filas del BB de cada + %iteracion de precision + xM=BB(j,1); + yM=BB(j,2); + aM=BB(j,3); + lM=BB(j,4); + xCM=xM+(aM/2); + yCM=yM+(lM/2); + + if chequearBoca(ancho,alto,xCM,yCM) == 1 + + xCMFinal=xCM; + yCMFinal=yCM; + anchoMouth = aM; + + + end + end + +end + +end \ No newline at end of file diff --git a/noseV2.m b/noseV2.m new file mode 100644 index 0000000..da60be3 --- /dev/null +++ b/noseV2.m @@ -0,0 +1,37 @@ +%Entra como parametro el rostro (previamente recortado) y devuelve las +%coordendas del punto medio de la nariz detectada.Itera para encontrar la +%boca con mejor precision. + +function [xCNFinal,yCNFinal, anchoNose] = noseV2(rostro) +ancho=size(rostro,1); +alto=size(rostro,2); +xCNFinal=0; +yCNFinal=0; +anchoNose=-1; + +for i= 4 : 32 +NoseDetect = vision.CascadeObjectDetector('Nose','MergeThreshold',i); +BB=step(NoseDetect,rostro); +lim=size(BB,1); + for j = 1:lim + + xN=BB(j,1); + yN=BB(j,2); + aN=BB(j,3); + lN=BB(j,4); + + %Coordenadas del punto medio de la nariz + xCN=xN+(aN/2); + yCN=yN+(lN/2); + + if chequearNariz(ancho,alto,xCN,yCN) == 1 + xCNFinal= xCN; + yCNFinal=yCN; + anchoNose=aN; + + end + end +end + + +end \ No newline at end of file diff --git a/recortador.m b/recortador.m new file mode 100644 index 0000000..60dfbe7 --- /dev/null +++ b/recortador.m @@ -0,0 +1,9 @@ +function recortador(rutaOrigen,cantImagenes) + + +for i=1:cantImagenes + direccion =strcat(rutaOrigen,int2str(i),'.jpg'); + + A=recortarRostro(direccion); + imwrite(A, strcat(int2str(i),'.png'),'png'); +end; \ No newline at end of file diff --git a/recortarRostro.m b/recortarRostro.m new file mode 100644 index 0000000..fbd2f15 --- /dev/null +++ b/recortarRostro.m @@ -0,0 +1,8 @@ +function imagenRecortada=recortarRostro(A) +imagen = imread(A); +face=vision.CascadeObjectDetector('FrontalFaceCART'); +BB=step(face,imagen); + + imagenRecortada = imcrop(imagen,BB); + +end \ No newline at end of file diff --git a/relaciones.m b/relaciones.m new file mode 100644 index 0000000..5fe8ac2 --- /dev/null +++ b/relaciones.m @@ -0,0 +1,94 @@ + + +function relacionesFaciales = relaciones (rostro) + +distancias=vectorizar(rostro); + +%Descomposicion en componentes del vector de distancias +distNM=distancias(1); +distNLE=distancias(2); +distNRE=distancias(3); +distMLE=distancias(4); +distMRE=distancias(5); +distLERE=distancias(6); +anchoNose=distancias(7); +anchoMouth=distancias(8); + +%Calculo las relaciones entre las medidas calculadas + +%Relacion NarizBoca - NarizOjoIzquierdo +if distNM == -1 ||distNLE == -1 +relNMNLE=-1; +else +relNMNLE=distNM/distNLE; +end + +%Relacion NarizBoca - NarizOjoDerecho +if distNM == -1 ||distNRE == -1 +relNMNRE=-1; +else +relNMNRE=distNM/distNRE; +end + +%Relacion NarizOjoIzquierdo - NarizOjoDerecho +if distNLE == -1 ||distNRE == -1 +relNLENRE=-1; +else +relNLENRE=distNLE/distNRE; +end + +%Relacion BocaOjoIzquierdo - BocaOjoDerecho +if distMLE == -1 ||distMRE == -1 +relMLEMRE=-1; +else +relMLEMRE=distMLE/distMRE; +end + +%Relacion OjoIzquierdoOjoDerecho - NarizOjoIzquierdo +if distLERE == -1 ||distNLE == -1 +relLERENLE=-1; +else +relLERENLE=distLERE/distNLE; +end + +%Relacion OjoIzquierdoOjoDerecho - NarizOjoDerecho +if distLERE == -1 ||distNRE == -1 +relLERENRE=-1; +else +relLERENRE=distLERE/distNRE; +end + +%Relacion anchoMouth - OjoIzquierdoOjoDerecho +if anchoMouth == -1 ||distLERE == -1 +relMouthLERE=-1; +else +relMouthLERE=anchoMouth/distLERE; +end + +%Relacion anchoNose - OjoIzquierdoOjoDerecho +if anchoNose == -1 || distLERE == -1 +relNoseLERE=-1; +else +relNoseLERE=anchoNose/distLERE; +end + +%Relacion anchoMouth - NarizBoca +if anchoMouth == -1 || distNM == -1 +relMouthNM=-1; +else +relMouthNM=anchoMouth/distNM; +end + + +%Relacion anchoNariz - NarizBoca +if anchoNose == -1 || distNM == -1 +relNoseNM=-1; +else +relNoseNM=anchoNose/distNM; +end + + + +relacionesFaciales =[relNMNLE,relNMNRE,relNLENRE,relMLEMRE,relLERENLE,relLERENRE,relMouthLERE,relNoseLERE,relMouthNM,relNoseNM]; + +end \ No newline at end of file diff --git a/rightEyeV3.m b/rightEyeV3.m new file mode 100644 index 0000000..33bfb16 --- /dev/null +++ b/rightEyeV3.m @@ -0,0 +1,43 @@ +%ANDA PERFECTO PARA LAS IMAGENES ESTANDARIZADAS +%Entra como parametro el rostro (previamente recortado) y devuelve las +%coordendas del punto medio del ojo derecho.Itera para encontrar el +%ojo derecho con mejor precision. + +function [xCREFinal,yCREFinal] = rightEyeV3(rostro) +%ancho y alto del rostro para hacer el recorte del ojo derecho +ancho=size(rostro,1); +alto=size(rostro,2); +%parametros para el imcrop +%REC=[ancho/2,0,ancho/2,alto/2]; +%rostro2=imcrop(rostro,REC); +%ancho y alto del recorte del ojo derecho +%ancho2=size(rostro2,1); +%alto2=size(rostro2,2); +xCREFinal=0; +yCREFinal=0; +correcto=0; +i=1; + while correcto==0 && i<16 + RightEye = vision.CascadeObjectDetector('RightEye','MergeThreshold',i); + BB=step(RightEye,rostro); + lim=size(BB,1); + i = i+1; + while lim > 0 && correcto==0 + xRE=BB(lim,1); + yRE=BB(lim,2); + aRE=BB(lim,3); + lRE=BB(lim,4); + lim=lim-1; + %Coordenadas del punto medio del ojo derecho + xCRE=xRE+(aRE/2); + yCRE=yRE+(lRE/2); + if (xCRE > ancho/2) && (yCRE < alto/2) + xCREFinal = xCRE; + yCREFinal = yCRE; + correcto=1; + end + end + end +end + + diff --git a/vectorizar.m b/vectorizar.m new file mode 100644 index 0000000..4f76478 --- /dev/null +++ b/vectorizar.m @@ -0,0 +1,130 @@ +%Esta funcion toma como entrada un rostro (detectado previamente), y calcula el vector con los +%valoes de las caracteristicas propias de la imagen + +function distancias = vectorizar(rostro) +%Coordenadas del punto medio de la nariz +[xN,yN,anchoNose]=noseV2(rostro); + +%Coordendas del punto medio de la boca +[xM,yM,anchoMouth]=mouthV2(rostro); + +%Coordenadas del punto medio de las cejas / Ver despues si sirve evaluar esto +%[xC,yC]=cejas(rostro); + +%Coordenadas de los puntos medios de los ojos, pasandole como parametro el +%rostro recortado y los puntos medio de la nariz para tomar referencia. +%[xRE,yRE,xLE,yLE]=eyesV2(rostro,xN,yN); + +%Esta es otra alternativa simple de calcular los ojos +%[xLE,yLE,xRE,yRE] = EyesSimple(rostro); + + +%Coordenadas del punto del ojo izquierdo (uso eyes) +[xLE,yLE]=leftEyeV3(rostro); + + +%Coordenadas del punto del ojo derecho (uso eyes) +[xRE,yRE]=rightEyeV3(rostro); + +%-------------------------------------------------------------------------- +%Distancia entre el punto medio de la boca y el punto medio de la nariz + +if (xN == 0 && yN == 0) || (xM == 0 && yM == 0) + + distNM = -1; +else + + distNM=dist(xN,yN,xM,yM); + +end + +%-------------------------------------------------------------------------- + +%Distancia entre el punto medio de la ceja y el punto medio de la nariz + +%distNC=dist(xN,yN,xC,yC); + +%Distancia entre el punto medio de la ceja y el punto medio de la boca +%distMC=dist(xC,yC,xM,yM); + +%-------------------------------------------------------------------------- +%Distancia entre el ojo izquierdo y el punto medio de la nariz + +if (xLE == 0 && yLE == 0) || (xN == 0 && yN == 0); + + distNLE = -1; +else + + distNLE=dist(xLE,yLE,xN,yN); + +end + +%-------------------------------------------------------------------------- + +%-------------------------------------------------------------------------- +%Distancia entre el ojo derecho y el punto medio de la nariz +if (xRE == 0 && yRE == 0) || (xN == 0 && yN == 0); + + distNRE = -1; +else + + distNRE=dist(xRE,yRE,xN,yN); + +end + +%-------------------------------------------------------------------------- + + +%-------------------------------------------------------------------------- +%Distancia entre el ojo izquierdo y el punto medio de la boca +if (xLE == 0 && yLE == 0) || (xN == 0 && yN == 0); + + distMLE = -1; +else + + distMLE=dist(xLE,yLE,xN,yN); + +end + +%-------------------------------------------------------------------------- + + + +%-------------------------------------------------------------------------- +%Distancia entre el ojo derecho y el punto medio de la boca +if (xRE == 0 && yRE == 0) || (xM == 0 && yM == 0); + + distMRE = -1; +else + + distMRE=dist(xRE,yRE,xM,yM); + +end + +%-------------------------------------------------------------------------- + +%Distancia entre ojos +if (xLE == 0 && yLE == 0) || (xRE == 0 && yRE == 0); + + distLERE = -1; +else + + distLERE=dist(xLE,yLE,xRE,yRE); + +end + + + + +%Vector con las caracteristicas propias de cada rostro +distancias=[distNM,distNLE,distNRE,distMLE,distMRE,distLERE, anchoNose, anchoMouth]; + + +%imshow(rostro);hold on; +%plot(xRE,yRE,'or','LineWidth',2,'MarkerSize',5); +%plot(xLE,yLE,'or','LineWidth',2,'MarkerSize',5); +%plot(xN,yN,'or','LineWidth',2,'MarkerSize',5); +%plot(xM,yM,'or','LineWidth',2,'MarkerSize',5); + + +end \ No newline at end of file