diff --git a/dia_14/FotoA.jpg b/dia_14/FotoA.jpg new file mode 100644 index 0000000..181f654 Binary files /dev/null and b/dia_14/FotoA.jpg differ diff --git a/dia_14/FotoB.jpg b/dia_14/FotoB.jpg new file mode 100644 index 0000000..3bd6e03 Binary files /dev/null and b/dia_14/FotoB.jpg differ diff --git a/dia_14/FotoC.jpg b/dia_14/FotoC.jpg new file mode 100644 index 0000000..26b568a Binary files /dev/null and b/dia_14/FotoC.jpg differ diff --git a/dia_14/FotoD.jpg b/dia_14/FotoD.jpg new file mode 100644 index 0000000..0d44eb7 Binary files /dev/null and b/dia_14/FotoD.jpg differ diff --git a/dia_14/reconocimiento_facial.py b/dia_14/reconocimiento_facial.py new file mode 100644 index 0000000..0bf3447 --- /dev/null +++ b/dia_14/reconocimiento_facial.py @@ -0,0 +1,99 @@ +""" +Reconocimiento facial + +Bibliotecas: + cmake + dlib + face-recognition + numpy + opencv-python + +""" + +import cv2 +import face_recognition as fr + +# Cargar imágenes +foto_control = fr.load_image_file('FotoD.jpg') +foto_prueba = fr.load_image_file('FotoC.jpg') + +# Nos aseguramos que el formato de la foto es rgb +# Las transformamos de BGR --> RGB +foto_control = cv2.cvtColor(foto_control, cv2.COLOR_BGR2RGB) +foto_prueba = cv2.cvtColor(foto_prueba, cv2.COLOR_BGR2RGB) + +# Localizar cara control +lugar_cara_A = fr.face_locations(foto_control)[0] +# Podríamos ver las coordenadas +# print(lugar_cara_A) + +# Codificar la cara +cara_codificada_A = fr.face_encodings(foto_control)[0] + + +# Localizar cara control +lugar_cara_B = fr.face_locations(foto_prueba)[0] + +# Codificar la cara +cara_codificada_B = fr.face_encodings(foto_prueba)[0] + +# Marcar donde está la cara con un rectángulo +# Añadimos la foto y los índices para marcar las coordenadas +# del vértice superior izquiero de la cara y el +# del vértice inferior derecho. +# Anadimos el color del rectangulo en verde +# y el borde +cv2.rectangle( + foto_control, + (lugar_cara_A[3], lugar_cara_A[0]), + (lugar_cara_A[1], lugar_cara_A[2]), + (0, 255, 0), + 2 +) + +cv2.rectangle( + foto_prueba, + (lugar_cara_B[3], lugar_cara_B[0]), + (lugar_cara_B[1], lugar_cara_B[2]), + (0, 255, 0), + 2 +) + + +# Realizar comparación +# El método espera recibir una lista. +# Como tenemos un único objecto lo ponemos entre corchetes +# para que piense que es una lista de un solo objeto. +# El tercer valor es la torelancia de distancia de comparación +resultado = fr.compare_faces([cara_codificada_A], cara_codificada_B) +# print(resultado) + + +# Medida de la distancia de comparación +# por defecto es 0.6 el valor para admitir coincidencia con True +# Esto nos indica lo cerca que está +distancia = fr.face_distance([cara_codificada_A], cara_codificada_B) +# print(distancia) + + +# Mostrar resultado con texto +# Los parámetros son la imagén, el texto a introducir, +# la ubicación del texto, la fuente, la escala, +# el color y el grosor +cv2.putText( + foto_prueba, + f'{resultado} {distancia.round(2)}', + (50, 50), + cv2.FONT_HERSHEY_COMPLEX, + 1, + (0, 255, 0), + 2 +) + + +# Mostrar imágenes +cv2.imshow('Foto Control', foto_control) +cv2.imshow('Foto Prueba', foto_prueba) + +# Las imágenes se cierran, se necesitan mantener el programa abierto +cv2.waitKey(0)