diff --git a/dia_14/Empleados/Cosmo Kramer.jpg b/dia_14/Empleados/Cosmo Kramer.jpg new file mode 100644 index 0000000..43caf73 Binary files /dev/null and b/dia_14/Empleados/Cosmo Kramer.jpg differ diff --git a/dia_14/Empleados/Elaine Benes.jpg b/dia_14/Empleados/Elaine Benes.jpg new file mode 100644 index 0000000..691b44b Binary files /dev/null and b/dia_14/Empleados/Elaine Benes.jpg differ diff --git a/dia_14/Empleados/Federico Garay.jpg b/dia_14/Empleados/Federico Garay.jpg new file mode 100644 index 0000000..806663a Binary files /dev/null and b/dia_14/Empleados/Federico Garay.jpg differ diff --git a/dia_14/Empleados/George Constanza.jpg b/dia_14/Empleados/George Constanza.jpg new file mode 100644 index 0000000..190f317 Binary files /dev/null and b/dia_14/Empleados/George Constanza.jpg differ diff --git a/dia_14/Empleados/Jerry Seinfeld.jpg b/dia_14/Empleados/Jerry Seinfeld.jpg new file mode 100644 index 0000000..74f20a3 Binary files /dev/null and b/dia_14/Empleados/Jerry Seinfeld.jpg differ diff --git a/dia_14/asistencia.py b/dia_14/asistencia.py new file mode 100644 index 0000000..ea24f4a --- /dev/null +++ b/dia_14/asistencia.py @@ -0,0 +1,185 @@ +""" +Programa dia 13 - Asistente virtual + +Bibliotecas: + cmake + dlib + face-recognition + numpy + opencv-python + +""" + +import os +import cv2 +import face_recognition as fr +import numpy +from datetime import datetime + +# Crear base de datos +ruta = 'Empleados' +mis_imagenes = [] +# Obtener nombres de las fotos +nombre_empleados = [] +# Nombres con la extensión .jpg +lista_empleados = os.listdir(ruta) + + +# Cargar imágenes con loop +for nombre in lista_empleados: + + # Leer la imagen + imagen_actual = cv2.imread(f'{ruta}/{nombre}') + + # Añadimos las coordenadas de la imagen en una nueva lista + mis_imagenes.append(imagen_actual) + + # Añadimos tan solo el nombre del empleado + nombre_empleados.append(os.path.splitext(nombre)[0]) + +# Mostrar lista creada +print(nombre_empleados) + + +def codificar(imagenes): + """ Codificar las imágenes """ + # Crear una lista nueva + lista_codificada = [] + + # Loop para procesar las imágenes + for imagen in imagenes: + # Pasar imágenes a RGB + imagen = cv2.cvtColor(imagen, cv2.COLOR_BGR2RGB) + + # Codificar + codificado = fr.face_encodings(imagen)[0] + + # Agregar a la lista codificada + lista_codificada.append(codificado) + + # Devolver lista codificada que se ha procesado + return lista_codificada + + +def registrar_ingresos(persona): + """ Recoger los datos de las capturas """ + + # Creamos el fichero registro.csv con Nombre, Hora + # Aquí lo abrimos para leer + f = open('registro.csv', 'r+') + # Hacemos un listado con las líneas del fichero + lista_datos = f.readlines() + # Lista vacía para almacenar los registros + nombres_registro = [] + + for linea in lista_datos: + # leemos separando por comas + ingreso = linea.split(',') + # Añadimos a la lista + nombres_registro.append(ingreso[0]) + + if persona not in nombres_registro: + + # Determinamos la hora actual + ahora = datetime.now() + # Le damos formato a la hora + string_ahora = ahora.strftime('%H:%M:%S') + + # Escribimos la persona + f.writelines(f'\n{persona}, {string_ahora}') + + +# Llamar a la función +lista_empleados_codificada = codificar(mis_imagenes) + + +# Mostrar número de imágenes codificadas en la función +# print(len(lista_empleados_codificada)) + + +# Tomar una imágen de cámara web +captura = cv2.VideoCapture(0) + +# Configuración de la captura para Linux +captura.set(cv2.CAP_PROP_FRAME_WIDTH, 1280) +captura.set(cv2.CAP_PROP_FRAME_HEIGHT, 1024) +sleep = 'sleep 3' +os.system(sleep) +captura.set(cv2.CAP_PROP_EXPOSURE, -8.0) + +# Leer la imágen de la cámara +# El método read() arroja dos elementos: +# - Si se ha podido realizar la captura +# - Devuelve la imágen +exito, imagen = captura.read() + +if not exito: + print('No se pudo tomar la captura') +else: + # Primero intentamos reconocer la cara en captura + cara_captura = fr.face_locations(imagen) + + # Codificar la cara capturada + cara_captura_codificada = fr.face_encodings(imagen, cara_captura) + + # Busquemos coincidencias entre las imágenes capturadas + # y la lista de imágenes de empleados + for caracodif, caraubic in zip(cara_captura_codificada, cara_captura): + # Comparación + coincidencias = fr.compare_faces(lista_empleados_codificada, caracodif) + + # Distancias de comparación + distancias = fr.face_distance(lista_empleados_codificada, caracodif) + + # La distancia menor de la lista "distancias" + # será la que indique el parecido más cercano + print(distancias) + + # Buscar el valor mínimo y añadir a variable + indice_coincidencia = numpy.argmin(distancias) + + # Mostrar coincidencias si las hay + if distancias[indice_coincidencia] > 0.6: + texto = 'No coincide' + + else: + + # Buscar el nombre del empleado encontrado + texto = nombre_empleados[indice_coincidencia] + + # Crear rectangulo cara + y1, x2, y2, x1 = caraubic + cv2.rectangle( + imagen, + (x1, y1), + (x2, y2), + (0, 255, 0), + 2 + ) + # Crear rectangulo verde de texto + cv2.rectangle( + imagen, + (x1, y2 - 35), + (x2, y2), + (0, 255, 0), + cv2.FILLED + ) + + # Crear texto + cv2.putText( + imagen, + texto, + (x1 + 6, y2 - 6), + cv2.FONT_HERSHEY_COMPLEX, + 0.6, + (255, 255, 255), + 2 + ) + + registrar_ingresos(nombre) + + # Mostrar la imagen obtenida por la cámara + cv2.imshow('Imagen web', imagen) + + # Mantener la ventana abierta + cv2.waitKey(0) diff --git a/dia_14/registro.csv b/dia_14/registro.csv new file mode 100644 index 0000000..7a707f3 --- /dev/null +++ b/dia_14/registro.csv @@ -0,0 +1,2 @@ + +Nombre, Hora