OpenCV es una biblioteca que se utiliza para realizar el procesamiento de imágenes utilizando lenguajes de programación como python. Este proyecto utiliza la biblioteca OpenCV para realizar una detección de rostros en tiempo real utilizando su cámara web como cámara principal.
Los siguientes son los requisitos para ello: –
- Python 2.7
- OpenCV
- entumecido
- Clasificadores de cara frontal Haar Cascade
Enfoque/Algoritmos utilizados:
- Este proyecto utiliza el algoritmo LBPH (histogramas de patrones binarios locales) para detectar rostros. Etiqueta los píxeles de una imagen mediante el umbral de la vecindad de cada píxel y considera el resultado como un número binario.
- LBPH usa 4 parámetros:
(i) Radio: el radio se usa para construir el patrón binario local circular y representa el radio alrededor del
píxel central.
(ii) Vecinos: el número de puntos de muestra para construir el patrón binario local circular.
(iii) Cuadrícula X: el número de celdas en la dirección horizontal.
(iv) Cuadrícula Y: el número de celdas en la dirección vertical. - El modelo construido se entrena con las caras con la etiqueta que se les da, y más tarde, la máquina recibe datos de prueba y la máquina decide la etiqueta correcta para ella.
Cómo utilizar :
- Cree un directorio en su PC y asígnele un nombre (por ejemplo, proyecto)
- Cree dos archivos python llamados create_data.py y face_recognize.py, copie el primer código fuente y el segundo código fuente respectivamente.
- Copie haarcascade_frontalface_default.xml al directorio del proyecto, puede obtenerlo en opencv o desde
aquí . - Ahora está listo para ejecutar los siguientes códigos.
Python
# Creating database # It captures images and stores them in datasets # folder under the folder name of sub_data import cv2, sys, numpy, os haar_file = 'haarcascade_frontalface_default.xml' # All the faces data will be # present this folder datasets = 'datasets' # These are sub data sets of folder, # for my faces I've used my name you can # change the label here sub_data = 'vivek' path = os.path.join(datasets, sub_data) if not os.path.isdir(path): os.mkdir(path) # defining the size of images (width, height) = (130, 100) #'0' is used for my webcam, # if you've any other camera # attached use '1' like this face_cascade = cv2.CascadeClassifier(haar_file) webcam = cv2.VideoCapture(0) # The program loops until it has 30 images of the face. count = 1 while count < 30: (_, im) = webcam.read() gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(gray, 1.3, 4) for (x, y, w, h) in faces: cv2.rectangle(im, (x, y), (x + w, y + h), (255, 0, 0), 2) face = gray[y:y + h, x:x + w] face_resize = cv2.resize(face, (width, height)) cv2.imwrite('% s/% s.png' % (path, count), face_resize) count += 1 cv2.imshow('OpenCV', im) key = cv2.waitKey(10) if key == 27: break
El siguiente código debe ejecutarse después de que el modelo haya sido entrenado para las caras:
Python
# It helps in identifying the faces import cv2, sys, numpy, os size = 4 haar_file = 'haarcascade_frontalface_default.xml' datasets = 'datasets' # Part 1: Create fisherRecognizer print('Recognizing Face Please Be in sufficient Lights...') # Create a list of images and a list of corresponding names (images, labels, names, id) = ([], [], {}, 0) for (subdirs, dirs, files) in os.walk(datasets): for subdir in dirs: names[id] = subdir subjectpath = os.path.join(datasets, subdir) for filename in os.listdir(subjectpath): path = subjectpath + '/' + filename label = id images.append(cv2.imread(path, 0)) labels.append(int(label)) id += 1 (width, height) = (130, 100) # Create a Numpy array from the two lists above (images, labels) = [numpy.array(lis) for lis in [images, labels]] # OpenCV trains a model from the images # NOTE FOR OpenCV2: remove '.face' model = cv2.face.LBPHFaceRecognizer_create() model.train(images, labels) # Part 2: Use fisherRecognizer on camera stream face_cascade = cv2.CascadeClassifier(haar_file) webcam = cv2.VideoCapture(0) while True: (_, im) = webcam.read() gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(gray, 1.3, 5) for (x, y, w, h) in faces: cv2.rectangle(im, (x, y), (x + w, y + h), (255, 0, 0), 2) face = gray[y:y + h, x:x + w] face_resize = cv2.resize(face, (width, height)) # Try to recognize the face prediction = model.predict(face_resize) cv2.rectangle(im, (x, y), (x + w, y + h), (0, 255, 0), 3) if prediction[1]<500: cv2.putText(im, '% s - %.0f' % (names[prediction[0]], prediction[1]), (x-10, y-10), cv2.FONT_HERSHEY_PLAIN, 1, (0, 255, 0)) else: cv2.putText(im, 'not recognized', (x-10, y-10), cv2.FONT_HERSHEY_PLAIN, 1, (0, 255, 0)) cv2.imshow('OpenCV', im) key = cv2.waitKey(10) if key == 27: break
Nota: los programas anteriores no se ejecutarán en el IDE en línea.
Capturas de pantalla del programa
Puede parecer algo diferente porque había integrado el programa anterior en el marco del matraz.
La ejecución del segundo programa produce resultados similares a la imagen a continuación:
Almacenamiento de conjuntos de datos: