Curso-lenguaje-python/dia_14/reconocimiento_facial.py

100 lines
2.4 KiB
Python
Raw Normal View History

"""
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)