from tkinter import * from tkinter import ttk from tkinter import messagebox from sympy import li from PIL import Image,ImageTk import cv2 import numpy as np import os import imutils from matplotlib.pyplot import gray from itertools import count #---------Ventana principal--------- ventana = Tk() ventana.title('Bienvenido') ventana.geometry("1200x630") frame=Frame(ventana) frame.pack() #---------Ventana de Registro------- imagen2=Image.open("C:/Users/Lenovo/Documents/Proyectos/Proyectos Python/Reconocimiento facial LBPH/fondoRegistro.gif") imagenRegistro=ImageTk.PhotoImage(imagen2) def registro(): #----------Mensaje de alerta---------------- def enviar(): alertaEnviar=messagebox.askokcancel("ATENCION","Para registrar un usuario es necesario acceder a la camara. \n Estas de acuerdo?") if alertaEnviar==True: #------------Script de registro facial----------- #--------Se ejecuta el script que crea una carpeta con tu nombre # -------y captura los rostros necesarios nombre=entryNombre.get() rutaBase = 'C:/Users/Lenovo/Documents/Proyectos/Proyectos Python/Reconocimiento facial LBPH/base_de_datos_LBPH_funciones' carpetaPersonal = rutaBase + '/' + nombre if not os.path.exists(carpetaPersonal): print('Carpeta creada: ',carpetaPersonal) os.makedirs(carpetaPersonal) camara= cv2.VideoCapture(0) modeloClasificador = cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_frontalface_default.xml') count=0 while True: (ret,ventana) = camara.read() if ret==False: break #Si no obtenemos ninguna lectura de alguna camara por defaul, con esto no tendremos problemas o errores ventana = cv2.flip(ventana,1) ventana = imutils.resize(ventana, width=640) #redimencionamos la imagen de la ventana gray= cv2.cvtColor(ventana, cv2.COLOR_BGR2GRAY) #la colocamos en escala de grises auximagen = ventana.copy() #creamos una copia de la imagen del rostro caras = modeloClasificador.detectMultiScale(gray, 1.1, 15) #aplicamos a gray el detector multicascada for(x,y,w,h) in caras: cv2.rectangle(ventana, (x,y),(x+w, y+h), (255,0,0),2) #marcamos los rostros con un cuadrado rostro = auximagen[y:y+h,x:x+w] #tomamos el puro rostro sin el cuadrado delimitador rostro = cv2.resize(rostro,(150,150),interpolation=cv2.INTER_CUBIC) #redimensionamos el rostro a 150x150 cv2.imwrite(carpetaPersonal + '/rostro_{}.jpg'.format(count),rostro) #nombramos ese fotograma con el nombre rostro y el numero del contador y lo agregamos en la carpeta del usuario count = count + 1 #aumentamos el contador cada fotograma nuevo cv2.imshow('Capturando rostro', ventana) key= cv2.waitKey(10) if key == 27 or count >=50: break camara.release() cv2.destroyAllWindows() #--------Menu de ventana de advertencia-------- usuarioNuevo=messagebox.askyesnocancel("LISTO","Perfil almacenado. \n Registrar un usuario mas??") if usuarioNuevo==True: registro() ventanaRegistro.destroy() if usuarioNuevo==False: #----------Script de entrenamiento------------ messagebox.showinfo("Proceso de entrenamiento",'Entrenando... dame un minuto...') rutaBase = 'C:/Users/Lenovo/Documents/Proyectos/Proyectos Python/Reconocimiento facial LBPH/base_de_datos_LBPH_funciones' usRegistrados = os.listdir(rutaBase) etiquetas = [] #declaramos una variable donde se almacenaran las etiquetas dependiendo la persona datosRostros = [] #declaramos una variable donde se almacenaran las imagenes de los rostros contador = 0 #iniciamos un contador for nombreDir in usRegistrados: carpetaPersonal = rutaBase + '/' + nombreDir for fileName in os.listdir(carpetaPersonal): etiquetas.append(contador) datosRostros.append(cv2.imread(carpetaPersonal+'/'+fileName,0)) image = cv2.imread(carpetaPersonal+'/'+fileName,0) contador = contador + 1 ### comienzo del entrenamiento del modelo #crear el algoritmo "LBPH" reconocedor_facial = cv2.face.LBPHFaceRecognizer_create() #entrenando el reconocedor facial reconocedor_facial.train(datosRostros, np.array(etiquetas)) #almacenando el entrenamiento para no volver a entrenar cada vez que se ejecute. reconocedor_facial.write('entrenamiento_facial_LBPH.xml') messagebox.showinfo("Proceso de entrenamiento",'Modelo almacenado exitosamente...') if usuarioNuevo==None: ventana.destroy() else: ventanaRegistro.destroy() ventana.destroy() #----------Configuracion de la ventana de registro------- ventanaRegistro=Toplevel() ventanaRegistro.title("REGISTRAR") ventanaRegistro.geometry("626x357") nombre=StringVar #imagenRegistro=PhotoImage(file="C:/Users/Lenovo/Documents/Proyectos/Proyectos Python/Reconocimiento facial LBPH/fondo.gif") imagenFondoRegistro=Label(ventanaRegistro,image=imagenRegistro).grid(row=0,column=0,columnspan=2,rowspan=3) labelRegistro=Label(ventanaRegistro,text="Se registrará un nuevo usuario, \n favor de llenar los campos solicitados",font=("System",17)).grid(row=0,column=0,padx=1,pady=1,columnspan=3) labelNombre=Label(ventanaRegistro,text="Nombre:",font=("System",15)).grid(row=1,column=0) entryNombre=Entry(ventanaRegistro,textvariable=nombre) entryNombre.grid(row=1,column=1) botonEnviar=Button(ventanaRegistro,text="Enviar",font=("System",14),width=10,height=2,command=enviar).grid(row=2,column=0,padx=1,pady=1,columnspan=2) ventanaRegistro.mainloop() #---------Funcion de Script Identificar----------- def identificar(): messagebox.showinfo("Identificacion","Comenzará el proceso de identificacion \n Colocate frente a la camara") ## cargamos la direccion de la base de datos donde estan las imagenes para tomar los nombres de los usuarios rutaBase = 'C:/Users/Lenovo/Documents/Proyectos/Proyectos Python/Reconocimiento facial LBPH/base_de_datos_LBPH_funciones' carpetas_us= os.listdir(rutaBase) #volvemos a crear el modelo reconocedor_facial= cv2.face.LBPHFaceRecognizer_create() #leemos el modelo de entrenamiento que creamos reconocedor_facial.read('entrenamiento_facial_LBPH.xml') #sera un reconocimiento en streaming camara= cv2.VideoCapture(0) #cargamos el modelo para identificar rostros modeloClasificador = cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_frontalface_default.xml') while True: (ret,ventana) = camara.read() if ret==False: break #Si no obtenemos ninguna lectura de alguna camara por defaul, con esto no tendremos problemas o errores ventana = cv2.flip(ventana,1) gray= cv2.cvtColor(ventana, cv2.COLOR_BGR2GRAY) #la colocamos en escala de grises auximagen = gray.copy() #creamos una copia de la imagen del rostro caras = modeloClasificador.detectMultiScale(gray,1.1,15) #aplicamos a gray el detector multicascada for(x,y,w,h) in caras: rostro = auximagen[y:y+h,x:x+w] #tomamos el puro rostro sin el cuadrado delimitador rostro = cv2.resize(rostro,(150,150),interpolation=cv2.INTER_CUBIC) #redimensionamos el rostro a 150x150 result = reconocedor_facial.predict(rostro) cv2.putText(ventana,'{}'.format(result),(x,y-3),1,1.3,(255,0,0),1,cv2.LINE_AA) ################## if result[1] < 70: cv2.putText(ventana,'{}'.format(carpetas_us[result[0]]),(x,y-25),2,1.1,(0,255,0),1,cv2.LINE_AA) #si es menor a 70 el valor de prediccion mostramos la etiqueta cv2.rectangle(ventana, (x,y),(x+w,y+h),(0,255,0),2) else: cv2.putText(ventana,'Desconocido',(x,y-20),2,0.8,(0,0,255),1,cv2.LINE_AA) cv2.rectangle(ventana, (x,y),(x+w,y+h),(0,0,255),2) cv2.imshow('Identificacion facial',ventana) key= cv2.waitKey(10) if key == 27: break camara.release() cv2.destroyAllWindows() messagebox.showinfo("Adios","Fué un placer atenderte \n ¡¡¡Hay nos vidrios!!!") #---------Menu principal------------ imagen=PhotoImage(file="C:/Users/Lenovo/Documents/Proyectos/Proyectos Python/Reconocimiento facial LBPH/fondo.gif") imagenInicio=Label(frame,image=imagen).grid(row=0,column=0,columnspan=2,rowspan=4) labelBienvenida=Label(frame,text="Bienvenido al sistema \n de seguridad facial",font=("System",30)).grid(row=0,column=0,padx=1,pady=1,columnspan=2) botonRegistro=Button(frame,text="Registrar Usuarios",font=("System",14),width=18,height=3,command=registro).grid(row=2,column=0,padx=1,pady=30) botonIdentificar=Button(frame,text="Identificar Usuarios",font=("System",14),width=18,height=3,command=identificar).grid(row=2,column=1,padx=1,pady=30) ventana.mainloop()