├── requeriments.txt ├── archivos de prueba ├── amigos.jpg ├── listaPermitidos.py ├── prueba FaceTracking.py ├── prueba smartLab.py └── control-access-experimental.py ├── .gitignore ├── README.md ├── fbrecog.py └── control-access.py /requeriments.txt: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /archivos de prueba/amigos.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/futurelabmx/FaceRecognition/master/archivos de prueba/amigos.jpg -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Compilados # 2 | 3 | *.class 4 | *.dll 5 | *.pyc 6 | 7 | # paquetes # 8 | 9 | *.zip 10 | *.dmg 11 | *.rar 12 | 13 | # Generados por el sistema operativo # 14 | 15 | .DS_Store 16 | .Trashes 17 | .Thumbs.db 18 | 19 | # No datos sensibles # 20 | 21 | credentials.py 22 | 23 | # directorios # 24 | 25 | /__pycache__/* 26 | 27 | # imagenes # 28 | 29 | *.jpg -------------------------------------------------------------------------------- /archivos de prueba/listaPermitidos.py: -------------------------------------------------------------------------------- 1 | class flabianos: 2 | """ Lista de invitados a la cena del señor en el laboratorio """ 3 | 4 | def __init__(self): 5 | self.Invitados=['Luis Sustaita','Ricardo Mirón Torres', 6 | 'Aldo Fernando Olmeda','Paco López Ortiz','Oliver A. López', 7 | 'MD Diaz','Cristofer Nava','Miguel Aguirre','Polo A. Ruiz','Rodolfo Ferro', 8 | 'Juan Manuel Rocha',' Ernesto Ramírez de Sancristobal', 9 | 'Adolfo Ramírez de Sancristobal','Omar Jair Purata Funes'] 10 | 11 | def TuSiTuNo(self,EllosSi): 12 | for person in EllosSi: 13 | if person in self.Invitados: 14 | print('Bienvenido {}'.format(person)) 15 | else: 16 | print('Lo siento, aun no trais el omnitrix') 17 | -------------------------------------------------------------------------------- /archivos de prueba/prueba FaceTracking.py: -------------------------------------------------------------------------------- 1 | import cv2 2 | i=0 3 | #cargamos la plantilla e inicializamos la webcam: 4 | 5 | face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') 6 | cap = cv2.VideoCapture(0) 7 | 8 | while(True): 9 | #leemos un frame y lo guardamos 10 | ret, img = cap.read() 11 | 12 | #convertimos la imagen a blanco y negro 13 | gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 14 | 15 | #buscamos las coordenadas de los rostros (si los hay) y 16 | #guardamos su posicion 17 | faces = face_cascade.detectMultiScale(gray, 1.3, 5) 18 | 19 | #Dibujamos un rectangulo en las coordenadas de cada rostro 20 | for (x,y,w,h) in faces: 21 | cv2.rectangle(img,(x,y),(x+w,y+h),(125,255,0),2) 22 | i+=1 23 | if i>5: 24 | cv2.imwrite('save1.jpg', img) 25 | else: 26 | cv2.imwrite('save2.jpg', img) 27 | 28 | break 29 | 30 | #Mostramos la imagen 31 | cv2.imshow('img',img) 32 | 33 | #con la tecla 'q' salimos del programa 34 | if cv2.waitKey(1) & 0xFF == ord('q'): 35 | break 36 | cap.release() 37 | cv2.destroyAllWindows() 38 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # flab-smartLab 2 | 3 | fbrecog: An unofficial python wrapper for the Facebook face recognition endpoint 4 | ### fbrecog is a python wrapper that uses Facebook's face recognition to recognize faces in pictures. 5 | ## How-To: 6 | 7 | 1. Install fbrecog from pip 8 | `pip install fbrecog` 9 | 2. Now simply import the recognize method from fbrecog module 10 | `from fbrecog import recognize` 11 | 3. The recognize method takes 4 input args and returns an array of recognitions. 12 | 4. To get the access token simply go to https://developers.facebook.com/tools/explorer and get a user access token with *user_photos*, *publish_actions* and *user_posts* permissions. 13 | 5. Get your Facebook cookie and fb_dtsg token as follows: 14 | 15 | * Go to your Facebook profile. 16 | 17 | * Open chrome dev tools by `Right Click > Inspect` 18 | 19 | * Upload any picture. As it gets uploaded monitor the Network tab for 'dpr?' endpoint. 20 | 21 | * Click on it. Scroll down to *Request Header*. Copy the entire cookie string. 22 | 23 | * Scroll further down to *Form Data*. Copy the value of fb_dtsg parameter. 24 | 25 | 6. Call the recognize method with the following parameters. 26 | 27 | ```python 28 | from fbrecog import FBRecog 29 | 30 | photo = 'xxxx.jpg' # Insert your image file path here 31 | access_token = '#######' # Insert your access token obtained from Graph API explorer here 32 | cookie = '###' # Insert your cookie string here 33 | fb_dtsg = '###' # Insert the fb_dtsg parameter obtained from Form Data here. 34 | # Instantiate the recog class 35 | recog = FBRecog(access_token, cookies, fb_dtsg) 36 | # Recog class can be used multiple times with different paths 37 | print(recog.recognize(path)) 38 | 39 | # Call recognize_raw to get more info about the faces detected, including their positions 40 | pprint(recog.recognize_raw(path), indent=2) 41 | 42 | ``` 43 | -------------------------------------------------------------------------------- /archivos de prueba/prueba smartLab.py: -------------------------------------------------------------------------------- 1 | #Para dibujar rectangulos y nombres sobre las caras 2 | from PIL import Image, ImageDraw, ImageFont 3 | 4 | #Insert your access token obtained from Graph API explorer here 5 | TOKEN='xxxx' 6 | 7 | # Insert your cookie string here 8 | COOKIE='xxxx' 9 | 10 | # Insert the fb_dtsg parameter obtained from Form Data here. 11 | FB_DTSG='xxxx' 12 | 13 | # Insert your image file path here 14 | photo='xxxx.jpg' 15 | 16 | #Open the image 17 | img=Image.open(photo) 18 | 19 | #Pasamos la imagen a dibujo para operar sobre ella 20 | draw=ImageDraw.Draw(img) 21 | 22 | #Configuramos los parametros de la fuente para poner el nombre de cada cara 23 | #ImageFont.truetype(FUENTE,TAMAÑO) 24 | font=ImageFont.truetype('arial.ttf',20) 25 | 26 | w,h=img.size #Obtenemos las dimensiones de la foto para despues redimensionar las medidas obtenidas del wrapper 27 | 28 | #An unofficial python wrapper for the Facebook face recognition endpoint 29 | from fbrecog import FBRecog 30 | 31 | # Instantiate the recog class 32 | recog = FBRecog(TOKEN, COOKIE, FB_DTSG) 33 | 34 | # Recog class can be used multiple times with different paths 35 | #print(recog.recognize(photo)) 36 | 37 | #print('-'*40) 38 | # Call recognize_raw to get more info about the faces detected, including their positions 39 | #print(recog.recognize_raw(photo)) 40 | 41 | # Call recognize_raw to get info about the positions of the face for draw an square 42 | faces = recog.recognize_raw(photo) 43 | 44 | # Recorremos todas las caras reconocidas 45 | for face in faces: 46 | #Obtenemos las caracteriticas de cada reconocimiento 47 | name=face['recognitions'] 48 | 49 | if name: 50 | #Imprime el nombre de usuario del rostro detectado 51 | #print('name: '+name[0]['user']['name']) 52 | 53 | #La foto que se sube a fb tiene un tamaño de 100x100 (miniatura), por lo tanto, 54 | #las coordenadas del centro de los rostros detectados estan de acuerdo a esa resolucion. 55 | #La foto original tiene una medida variable, las coordenadas originales no encajarian con 56 | #las obtenidas de FB, para ajustar esto se propone 57 | #una sencilla regla de 3 para reescalar las coordenadas. 58 | 59 | #Se calcula la nueva posicion de la coordenada x con la medida del largo de la imagen original (w) 60 | posx=face['x']*w/100 61 | 62 | #Se calcula la nueva posicion de la coordenada y con la medida del alto de la imagen original (h) 63 | posy=face['y']*h/100 64 | 65 | #Dibujamos sobre la imagen un texto con el nombre de usuario 66 | #draw.text((coordenada_en_x,coordenada_en_y),texto,fill=color_del_texto,font=fuente_de_la_letra) 67 | draw.text((posx,posy),name[0]['user']['name'],fill='blue',font=font) 68 | 69 | #Para dibujar un rectangulo sobre el rostro tambien hay que escalar las medidas del alto y ancho del rostro detectado 70 | #(face['width']*w/100) y (face['height']*h/100) 71 | 72 | #Dibujamos un rectangulo sobre el rostro 73 | draw.rectangle(((posx+(face['width']*w/100)/2,posy+(face['height']*h/100)/2),(posx-(face['width']*w/100)/2,posy-(face['height']*w/100)/2)),fill=None,outline='red') 74 | 75 | img.save('reconocidos.jpg') 76 | -------------------------------------------------------------------------------- /fbrecog.py: -------------------------------------------------------------------------------- 1 | from facepy import GraphAPI 2 | import requests 3 | import json 4 | 5 | 6 | class FBRecog(object): 7 | 8 | API_URL = "https://www.facebook.com/photos/tagging/recognition/?dpr=1" 9 | 10 | def __init__(self, access_token, cookies, fb_dtsg): 11 | self.access_token = access_token 12 | self.cookies = cookies 13 | self.fb_dtsg = fb_dtsg 14 | self.headers = {'x_fb_background_state': '1', 15 | 'origin': 'https://www.facebook.com', 16 | 'accept-encoding': 'gzip, deflate, lzma', 17 | 'accept-language': 'en-US,en;q=0.8', 18 | 'user-agent': 'FBRecog/API', 19 | 'content-type': 'application/x-www-form-urlencoded', 20 | 'accept': '*/*', 21 | 'referer': 'https://www.facebook.com/', 22 | 'cookie': self.cookies, 23 | 'dnt': '1'} 24 | self.graph = GraphAPI(self.access_token) 25 | 26 | def _post_photo(self, path): 27 | try: 28 | # Uploading the picture to Facebook 29 | response = self.graph.post(path='me/photos', retry=3, source=open(path, 'rb')) 30 | except Exception as e: 31 | print(e) 32 | return -1 33 | else: 34 | return response['id'] 35 | 36 | def _query_recognition_api(self, post_id): 37 | payload = [] 38 | data = 'recognition_project=composer_facerec&photos[0]=' + post_id 39 | data += '&target&is_page=false&include_unrecognized_faceboxes=false&include_face_crop_src=true' 40 | data += '&include_recognized_user_profile_picture=true&include_low_confidence_recognitions=true' 41 | data += '&__a=1&fb_dtsg=' + self.fb_dtsg 42 | 43 | # Since the POST sometimes returns a blank array, retrying until a payload is obtained 44 | for i in range(20): 45 | response = requests.post(self.API_URL, data=data, headers=self.headers) 46 | payload = json.loads(response.text.replace('for (;;);', ''))['payload'] 47 | if (None in payload): 48 | print (i) 49 | print(payload.get(0)) 50 | print('.-'*20) 51 | 52 | print(payload[0]['faceboxes']) 53 | if payload and "faceboxes" in payload[0] and payload[0]['faceboxes']: 54 | break 55 | 56 | return payload[0]['faceboxes'] 57 | 58 | def recognize_raw(self, path): 59 | print('Post data to Facebook, please wait...') 60 | post_id = self._post_photo(path) 61 | result = None 62 | if post_id != -1: 63 | try: 64 | print("Querying Facebook, please wait...") 65 | result = self._query_recognition_api(post_id) 66 | 67 | except (KeyError, IndexError) as e: 68 | print("Unable to fetch details. API unresponsive. Please try again later.") 69 | except Exception as e: 70 | print(e) 71 | 72 | # Deleting the uploaded picture 73 | print("Please wait. Cleaning up...") 74 | self.graph.delete(path=post_id, retry=5) 75 | 76 | print("Finished.") 77 | 78 | return result 79 | 80 | def recognize(self, path): 81 | """Face recognition using Facebook's recognize method 82 | Args: 83 | path : file path of the photo to be processed 84 | Returns: 85 | result : array of recognitions with the name of recognized people 86 | and the certainity of each recognition 87 | """ 88 | faceboxes = self.recognize_raw(path) 89 | result = [] 90 | for recog in faceboxes: 91 | name = recog['recognitions'] 92 | if name: 93 | result.append({'name': name[0]['user']['name'], 'certainity': name[0]['certainty']}) 94 | return result 95 | -------------------------------------------------------------------------------- /control-access.py: -------------------------------------------------------------------------------- 1 | 2 | #INICIO DE OPENCV PARA DETECCION FACIAL 3 | import cv2 #Libreria de opencv 4 | i=0 5 | flag=True 6 | 7 | #cargamos la plantilla e inicializamos la webcam: 8 | face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') 9 | cap = cv2.VideoCapture(0) 10 | 11 | while(flag): 12 | #leemos un frame y lo guardamos 13 | ret, img = cap.read() 14 | 15 | #convertimos la imagen a blanco y negro 16 | gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 17 | 18 | """buscamos las coordenadas de los rostros (si los hay) y 19 | guardamos su posicion""" 20 | faces = face_cascade.detectMultiScale(gray, 1.3, 5) 21 | 22 | #Dibujamos un rectangulo en las coordenadas de cada rostro 23 | for (x,y,w,h) in faces: 24 | i+=1 25 | cv2.rectangle(img,(x,y),(x+w,y+h),(125,255,0),2) 26 | break 27 | 28 | #Mostramos la imagen 29 | #cv2.imshow('img',img) 30 | 31 | #con la tecla 'q' salimos del programa 32 | #if cv2.waitKey(1) & 0xFF == ord('q'): 33 | # break 34 | 35 | if i>5: #esperamos a que se estabilice o aparezca una cara visible en la imagen para guardar una fotografia 36 | cv2.imwrite('save.jpg', img) 37 | #detenemos el bucle para buscar caras 38 | flag=False 39 | 40 | cap.release() 41 | cv2.destroyAllWindows() 42 | 43 | 44 | #INICIO DE FBRECOG PARA RECONOCIMIENTO FACIAL 45 | #An unofficial python wrapper for the Facebook face recognition endpoint 46 | from fbrecog import FBRecog 47 | 48 | #Clase con los datos para el wrapper de FB 49 | from credentials import credentials 50 | 51 | #Para dibujar rectangulos y nombres sobre las caras 52 | from PIL import Image, ImageDraw, ImageFont 53 | 54 | #Insert your access token obtained from Graph API explorer here 55 | TOKEN=credentials.Token 56 | 57 | # Insert your cookie string here 58 | COOKIE=credentials.Cookie 59 | 60 | # Insert the fb_dtsg parameter obtained from Form Data here. 61 | FB_DTSG=credentials.Fb_dstg 62 | 63 | # Insert your image file path here 64 | photo='save.jpg' 65 | 66 | #Open the image 67 | img=Image.open(photo) 68 | 69 | #Pasamos la imagen a dibujo para operar sobre ella 70 | draw=ImageDraw.Draw(img) 71 | 72 | #Configuramos los parametros de la fuente para poner el nombre de cada cara 73 | #ImageFont.truetype(FUENTE,TAMAÑO) 74 | font=ImageFont.truetype('arial.ttf',20) #Se recomienda la tipografía Sans serif 75 | 76 | w,h=img.size #Obtenemos las dimensiones de la foto para despues redimensionar las medidas obtenidas del wrapper 77 | 78 | # Instantiate the recog class 79 | recog = FBRecog(TOKEN, COOKIE, FB_DTSG) 80 | 81 | # Recog class can be used multiple times with different paths 82 | #print(recog.recognize(photo)) 83 | 84 | #print('-'*40) 85 | # Call recognize_raw to get more info about the faces detected, including their positions 86 | #print(recog.recognize_raw(photo)) 87 | 88 | # Call recognize_raw to get info about the positions of the face for draw an square 89 | faces = recog.recognize_raw(photo) 90 | 91 | try: 92 | # Recorremos todas las caras reconocidas 93 | for face in faces: 94 | #Obtenemos las caracteriticas de cada reconocimiento 95 | name=face['recognitions'] 96 | 97 | #La foto que se sube a fb tiene un tamaño de 100x100 (miniatura), por lo tanto, 98 | #las coordenadas del centro de los rostros detectados estan de acuerdo a esa resolucion. 99 | #La foto original tiene una medida variable, las coordenadas originales no encajarian con 100 | #las obtenidas de FB, para ajustar esto se propone 101 | #una sencilla regla de 3 para reescalar las coordenadas. 102 | 103 | #Se calcula la nueva posicion de la coordenada x con la medida del largo de la imagen original (w) 104 | posx=face['x']*w/100 105 | 106 | #Se calcula la nueva posicion de la coordenada y con la medida del alto de la imagen original (h) 107 | posy=face['y']*h/100 108 | 109 | #si la cara reconocida tiene un nombre de usuario se dibuja su nombre de usuario 110 | if name: 111 | #Imprime el nombre de usuario del rostro detectado 112 | print('name: '+name[0]['user']['name']) 113 | 114 | #Dibujamos sobre la imagen un texto con el nombre de usuario 115 | #draw.text((coordenada_en_x,coordenada_en_y),texto,fill=color_del_texto,font=fuente_de_la_letra) 116 | draw.text((posx,posy),name[0]['user']['name'],fill='blue',font=font) 117 | 118 | #Para dibujar un rectangulo sobre el rostro tambien hay que escalar las medidas del alto y ancho del rostro detectado 119 | #(face['width']*w/100) y (face['height']*h/100) 120 | 121 | #Dibujamos un rectangulo sobre el rostro 122 | #draw.rectangle(((posx+(face['width']*w/100)/2,posy+(face['height']*h/100)/2),(posx-(face['width']*w/100)/2,posy-(face['height']*w/100)/2)),fill=None,outline='red') 123 | 124 | #si no tiene un nombre de usuario entonces es un usuario desconocido 125 | else: 126 | draw.text((posx,posy),"usuario no reconocido",fill='blue',font=font) 127 | 128 | except AttributeError: 129 | print("Por favor verifique su conexion a internet") 130 | except: 131 | print("Error inesperado, intentelo de nuevo") 132 | 133 | img.save('save.jpg') 134 | -------------------------------------------------------------------------------- /archivos de prueba/control-access-experimental.py: -------------------------------------------------------------------------------- 1 | from mpi4py import MPI 2 | 3 | comm = MPI.COMM_WORLD 4 | rank = comm.Get_rank() 5 | 6 | #INICIO DE OPENCV PARA DETECCION FACIAL 7 | import cv2 #Libreria de opencv 8 | import time 9 | i=0 10 | flag=True 11 | 12 | #cargamos la plantilla e inicializamos la webcam: 13 | face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') 14 | cap = cv2.VideoCapture(0) 15 | 16 | while(flag): 17 | #Espera un segundo antes de comenzar un nuevo ciclo 18 | time.sleep(1) 19 | 20 | #Si no es el procesador principal 21 | if rank!=0: 22 | #Cerramos cualquier actividad de la camara 23 | cap.release() 24 | cv2.destroyAllWindows() 25 | 26 | #Espera antes de tomar la siguiente captura de frames 27 | time.sleep(0.5*rank) 28 | cap = cv2.VideoCapture(0) 29 | 30 | #leemos un frame y lo guardamos 31 | ret, img = cap.read() 32 | 33 | #convertimos la imagen a blanco y negro 34 | gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 35 | 36 | #buscamos las coordenadas de los rostros (si los hay) y 37 | #guardamos su posicion 38 | faces = face_cascade.detectMultiScale(gray, 1.3, 5) 39 | 40 | #Dibujamos un rectangulo en las coordenadas de cada rostro 41 | for (x,y,w,h) in faces: 42 | i+=1 43 | cv2.rectangle(img,(x,y),(x+w,y+h),(125,255,0),2) 44 | #detenemos el bucle cuando encuentra una cara 45 | flag=False 46 | break 47 | 48 | #Mostramos la imagen 49 | #cv2.imshow('img',img) 50 | 51 | #con la tecla 'q' salimos del programa 52 | #if cv2.waitKey(1) & 0xFF == ord('q'): 53 | # break 54 | 55 | #esperamos a que se estabilice o aparezca una cara visible en la imagen para guardar una fotografia 56 | cv2.imwrite('save'+str(rank)+'.jpg', img) 57 | 58 | #Cerramos la camara 59 | cap.release() 60 | cv2.destroyAllWindows() 61 | 62 | #INICIO DE FBRECOG PARA RECONOCIMIENTO FACIAL 63 | #An unofficial python wrapper for the Facebook face recognition endpoint 64 | from fbrecog import FBRecog 65 | 66 | #Clase con los datos para el wrapper de FB 67 | from credentials import credentials 68 | 69 | #Para dibujar rectangulos y nombres sobre las caras 70 | from PIL import Image, ImageDraw, ImageFont 71 | 72 | #Insert your access token obtained from Graph API explorer here 73 | TOKEN=credentials.Token 74 | 75 | # Insert your cookie string here 76 | COOKIE=credentials.Cookie 77 | 78 | # Insert the fb_dtsg parameter obtained from Form Data here. 79 | FB_DTSG=credentials.Fb_dstg 80 | 81 | # Insert your image file path here 82 | photo='save'+str(rank)+'.jpg' 83 | 84 | #Open the image 85 | img=Image.open(photo) 86 | 87 | #Pasamos la imagen a dibujo para operar sobre ella 88 | draw=ImageDraw.Draw(img) 89 | 90 | #Configuramos los parametros de la fuente para poner el nombre de cada cara 91 | #ImageFont.truetype(FUENTE,TAMAÑO) 92 | font=ImageFont.truetype('arial.ttf',20) 93 | 94 | #Obtenemos las dimensiones de la foto para despues redimensionar las medidas obtenidas del wrapper 95 | w,h=img.size 96 | 97 | # Instantiate the recog class 98 | recog = FBRecog(TOKEN, COOKIE, FB_DTSG) 99 | 100 | # Recog class can be used multiple times with different paths 101 | #print(recog.recognize(photo)) 102 | 103 | #print('-'*40) 104 | # Call recognize_raw to get more info about the faces detected, including their positions 105 | #print(recog.recognize_raw(photo)) 106 | 107 | # Call recognize_raw to get info about the positions of the face for draw an square 108 | faces = recog.recognize_raw(photo) 109 | 110 | #Lista para agregar nombres de las personas reconocidas 111 | users=[] 112 | try: 113 | 114 | for face in faces: 115 | #Obtenemos las caracteriticas de cada reconocimiento 116 | name=face['recognitions'] 117 | 118 | #La foto que se sube a fb tiene un tamaño de 100x100 (miniatura), por lo tanto, 119 | #las coordenadas del centro de los rostros detectados estan de acuerdo a esa resolucion. 120 | #La foto original tiene una medida variable, las coordenadas originales no encajarian con 121 | #las obtenidas de FB, para ajustar esto se propone 122 | #una sencilla regla de 3 para reescalar las coordenadas. 123 | 124 | #Se calcula la nueva posicion de la coordenada x con la medida del largo de la imagen original (w) 125 | posx=face['x']*w/100 126 | 127 | #Se calcula la nueva posicion de la coordenada y con la medida del alto de la imagen original (h) 128 | posy=face['y']*h/100 129 | 130 | #si la cara reconocida tiene un nombre de usuario se dibuja su nombre de usuario 131 | if name: 132 | 133 | #Imprime el nombre de usuario del rostro detectado 134 | #print('name: '+name[0]['user']['name']) 135 | 136 | #Se añaden los nombres a una lista 137 | users.append(name[0]['user']['name']) 138 | 139 | #Dibujamos sobre la imagen un texto con el nombre de usuario 140 | #draw.text((coordenada_en_x,coordenada_en_y),texto,fill=color_del_texto,font=fuente_de_la_letra) 141 | draw.text((posx,posy),name[0]['user']['name'],fill='blue',font=font) 142 | 143 | #Para dibujar un rectangulo sobre el rostro tambien hay que escalar las medidas del alto y ancho del rostro detectado 144 | #(face['width']*w/100) y (face['height']*h/100) 145 | 146 | #Dibujamos un rectangulo sobre el rostro 147 | #draw.rectangle(((posx+(face['width']*w/100)/2,posy+(face['height']*h/100)/2),(posx-(face['width']*w/100)/2,posy-(face['height']*w/100)/2)),fill=None,outline='red') 148 | 149 | #si no tiene un nombre de usuario entonces es un usuario desconocido 150 | else: 151 | draw.text((posx,posy),"usuario no reconocido",fill='blue',font=font) 152 | 153 | except AttributeError: 154 | print("verifique las credenciales") 155 | except: 156 | print("error inesperado, reintente") 157 | 158 | #Se importa la lista de personas con acceso al laboratorio 159 | from listaPermitidos import flabianos 160 | flabs=flabianos() 161 | 162 | #Busca si los nombres de las personas reconocidas estan dentro de los que tienen acceso 163 | flabs.TuSiTuNo(users) 164 | 165 | img.save('save'+str(rank)+'.jpg') 166 | 167 | --------------------------------------------------------------------------------