100 lines
2.4 KiB
Python
100 lines
2.4 KiB
Python
|
"""
|
||
|
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)
|