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 […]