Blog
Detección de Marcas Faciales II
- Publicado por: Rafael Fernandez
- Categoría: Blog DLib OpenCV Procesamiento de Imagenes

-Aquí veremos otro ejemplo de como detectar marcas faciales pero en este caso, en un vídeo.
-Adicionalmente, te dejamos el código y los requisitos para correrlo.
En el artículo de Detección de Marcas Faciales I vimos como podemos facilmente detectar los puntos faciales de la boca, nariz, cejas y ojos en una imagen. En este artículo nos vamos a centrar en hacerlo en un vídeo para incrementar las posibilidades de estos algoritmos.
Detección de Marcas Faciales en un vídeo
Para aplicar nuestro código hemos elegido dos vídeos de algunos representantes de estado o ex-representantes, son los siguientes:
Si quieres descargarte estos 2 vídeos para ejecutar el código lo puedes hacer desde aqui, pero puedes utilizar cualquier vídeo incluso un vídeo de tu mismo donde lo imprescindible es que se te vea la cara ya que vamos a reconocer las marcas faciales.
Requisitos para correr el algoritmo
- cv2 (librería openCV)
- dlib (Un juego de herramientas para hacer aplicaciones de learning machine y analisis de datos para el mundo real)
- numpy
- archivo : shape_predictor_68_face_landmarks.dat (lo puedes descargar desde este link)
- Vídeo a procesar
Código para la Detección de Marcas Faciales en un vídeo
from imutils import face_utils import time import dlib import cv2 mStart=48 mEnd=68 jStart=0 jEnd= 17 rlStart=17 rlEnd= 22 leStart=22 leEnd= 27 nStart=27 nEnd= 36 # Inicializar la detección de cara con la libreria dlib (HOG-based) y luego # usa el predictor del hito facial print("[INFO] loading facial landmark predictor...") detector = dlib.get_frontal_face_detector() PREDICTOR_PATH = "shape_predictor_68_face_landmarks.dat" predictor = dlib.shape_predictor(PREDICTOR_PATH) #se selecionan los indices del los ojos (lStart, lEnd) = face_utils.FACIAL_LANDMARKS_IDXS["left_eye"] (rStart, rEnd) = face_utils.FACIAL_LANDMARKS_IDXS["right_eye"] (mStart, mEnd) = face_utils.FACIAL_LANDMARKS_IDXS["mouth"] (jStart,jEnd) = face_utils.FACIAL_LANDMARKS_IDXS["jaw"] (reStart,reEnd) = face_utils.FACIAL_LANDMARKS_IDXS["right_eyebrow"] (leStart,leEnd)= face_utils.FACIAL_LANDMARKS_IDXS["left_eyebrow"] (nStart,nEnd)= face_utils.FACIAL_LANDMARKS_IDXS["nose"] #video que vamos a procesar cap = cv2.VideoCapture('la-tajante.mp4') fileStream = False time.sleep(1.0) # ciclo de procesado ppal while True: ret, frame = cap.read() #frame = imutils.resize(frame, width=450) gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # detecta caras en la imagen en escala de grises rects = detector(gray, 0) # ciclo sobre las detecciones de la cara for rect in rects: # Determina las marcas faciales para la región de la cara, luego # Convierte el punto de referencia facial (x, y) - a coordenada NumPy #Array shape = predictor(gray, rect) shape = face_utils.shape_to_np(shape) # Extrae las coordenadas de los ojos izquierdo y derecho y calcula # la relación de aspecto (AR) del ojo para ambos ojos leftEye = shape[lStart:lEnd] rightEye = shape[rStart:rEnd] mouth = shape[mStart:mEnd] jaw = shape[jStart:jEnd] re = shape[reStart:reEnd] le = shape[leStart:leEnd] nose= shape[nStart:nEnd] # hace la convex hull para los dos ojos # se dibujan los dos ojos leftEyeHull = cv2.convexHull(leftEye) mouthHull = cv2.convexHull(mouth) jawHull = cv2.convexHull(jaw) reHull = cv2.convexHull(re) leHull = cv2.convexHull(le) noseHull = cv2.convexHull(nose) rightEyeHull = cv2.convexHull(rightEye) cv2.drawContours(frame, [leftEyeHull], -1, (0, 255, 0), 1) cv2.drawContours(frame, [rightEyeHull], -1, (0, 255, 0), 1) cv2.drawContours(frame, [mouthHull], -1, (255, 255, 0), 1) cv2.drawContours(frame, [jaw], -1, (255, 55, 0), 1) cv2.drawContours(frame, [reHull], -1, (255, 2, 60), 1) cv2.drawContours(frame, [leHull], -1, (255, 255, 200), 1) cv2.drawContours(frame, [noseHull], -1, (5, 255, 200), 1) # mostramos el frame cv2.imshow("Frame", frame) key = cv2.waitKey(1) & 0xFF # si pulsa q se rompe el ciclo if key == ord("q"): break # limpiamos las ventanas cap.release() cv2.destroyAllWindows()
El código se compone de 2 ciclos y una sentencia:
- Un ciclo while principal del procesado, donde se grafica el vídeo
- Un ciclo for donde determinan las marcas faciales y se plotean en el vídeo
- Una sentencia if en la que puedes para la ejecución del código tecleando “q”
Una vez ejecutado el algoritmo pulsa “q” si quieres abortar el procesado
No olvidéis cambiar el vídeo en la línea 30 y de tener en una misma carpeta el vídeo, el código y el archivo shape_predictor_68_face_landmarks.dat
➡ Si has llegado hasta aquí enhorabuena ? te invitamos a la 6º lección Curso de Python Avanzado con Dlib & OpenCV donde aprenderás como implementar un algoritmo de Alineamiento de Caras!
Curso de Python Avanzado con Dlib & OpenCV, lección 6º
Curso de Python Avanzado con Dlib & OpenCV
[…] Share Tweet Google+ Email Prev Article Next Article […]