Curso-lenguaje-python/python-total/doc_curso/14_controlador_asistencia/101asistencia.py
Manuel Vergara f4e9797c4b Restructure content and add notes from HolaMundo
Signed-off-by: Manuel Vergara <manuel@vergaracarmona.es>
2023-05-20 09:36:26 +02:00

103 lines
2.9 KiB
Python

from cv2 import cv2
import face_recognition as fr
import os
import numpy
from datetime import datetime
# crear base de datos
ruta = 'Empleados'
mis_imagenes = []
nombres_empleados = []
lista_empleados = os.listdir(ruta)
for nombre in lista_empleados:
imagen_actual = cv2.imread(f'{ruta}/{nombre}')
mis_imagenes.append(imagen_actual)
nombres_empleados.append(os.path.splitext(nombre)[0])
print(nombres_empleados)
# codificar imagenes
def codificar(imagenes):
# crear una lista nueva
lista_codificada = []
# pasar todas las imagenes a rgb
for imagen in imagenes:
imagen = cv2.cvtColor(imagen, cv2.COLOR_BGR2RGB)
# codificar
codificado = fr.face_encodings(imagen)[0]
# agregar a la lista
lista_codificada.append(codificado)
# devolver lista codificada
return lista_codificada
# registrar los ingresos
def registrar_ingresos(persona):
f = open('registro.csv', 'r+')
lista_datos = f.readlines()
nombres_registro = []
for linea in lista_datos:
ingreso = linea.split(',')
nombres_registro.append(ingreso[0])
if persona not in nombres_registro:
ahora = datetime.now()
string_ahora = ahora.strftime('%H:%M:%S')
f.writelines(f'\n{persona}, {string_ahora}')
lista_empleados_codificada = codificar(mis_imagenes)
# tomar una imagen de camara web
captura = cv2.VideoCapture(0, cv2.CAP_DSHOW)
# leer imagen de la camara
exito, imagen = captura.read()
if not exito:
print("No se ha podido tomar la captura")
else:
# reconocer cara en captura
cara_captura = fr.face_locations(imagen)
# codificar cara capturada
cara_captura_codificada = fr.face_encodings(imagen, cara_captura)
# buscar coincidencias
for caracodif, caraubic in zip(cara_captura_codificada, cara_captura):
coincidencias = fr.compare_faces(lista_empleados_codificada, caracodif)
distancias = fr.face_distance(lista_empleados_codificada, caracodif)
print(distancias)
indice_coincidencia = numpy.argmin(distancias)
# mostrar coincidencias si las hay
if distancias[indice_coincidencia] > 0.6:
print("No coincide con ninguno de nuestros empleados")
else:
# buscar el nombre del empleado encontrado
nombre = nombres_empleados[indice_coincidencia]
y1, x2, y2, x1 = caraubic
cv2.rectangle(imagen, (x1, y1), (x2, y2), (0, 255, 0), 2)
cv2.rectangle(imagen, (x1, y2 - 35), (x2, y2), (0, 255, 0), cv2.FILLED)
cv2.putText(imagen, nombre, (x1 + 6, y2 - 6), cv2.FONT_HERSHEY_COMPLEX, 1, (255, 2555, 255), 2)
registrar_ingresos(nombre)
# mostrar la imagen obtenida
cv2.imshow('Imagen web', imagen)
# mantener ventana abierta
cv2.waitKey(0)