Deteccion y reconocimiento facial
La deteccion facial tiene 4 niveles:
1. DETECCION: Hay una cara? Donde esta? (bounding box) Herramientas: Haar Cascades, HOG + SVM, MTCNN, MediaPipe
2. LANDMARKS: Donde estan los ojos, nariz, boca? (68-468 puntos) Herramientas: dlib (68 puntos), MediaPipe (468 puntos) Usos: Filtros AR (Snapchat/Instagram), seguimiento de mirada
3. RECONOCIMIENTO: De QUIEN es la cara? Herramientas: face_recognition (dlib), ArcFace, FaceNet Usos: Face ID, busqueda de personas, verificacion de identidad
4. ANALISIS: Que expresion tiene? Edad? Genero? Herramientas: DeepFace, FER (Facial Expression Recognition) Usos: Analisis de sentimiento, UX research, marketing
import cv2
# Metodo 1: Haar Cascade (clasico, rapido)
face_cascade = cv2.CascadeClassifier(
cv2.data.haarcascades + "haarcascade_frontalface_default.xml"
)
eye_cascade = cv2.CascadeClassifier(
cv2.data.haarcascades + "haarcascade_eye.xml"
)
def detect_faces_haar(frame):
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x, y, w, h) in faces:
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
# Detectar ojos dentro de la cara
roi_gray = gray[y:y+h, x:x+w]
roi_color = frame[y:y+h, x:x+w]
eyes = eye_cascade.detectMultiScale(roi_gray)
for (ex, ey, ew, eh) in eyes:
cv2.circle(roi_color, (ex+ew//2, ey+eh//2), 15, (255, 0, 0), 2)
cv2.putText(frame, f"Caras: {len(faces)}", (10, 30),
cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
return frame, faces
# Webcam en tiempo real
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret: break
frame, faces = detect_faces_haar(frame)
cv2.imshow("Face Detection", frame)
if cv2.waitKey(1) & 0xFF == ord("q"): break
cap.release()
# Metodo 2: MediaPipe (moderno, mas preciso, 468 landmarks)
import mediapipe as mp
import cv2
mp_face = mp.solutions.face_mesh
mp_draw = mp.solutions.drawing_utils
cap = cv2.VideoCapture(0)
with mp_face.FaceMesh(max_num_faces=2, min_detection_confidence=0.5) as mesh:
while True:
ret, frame = cap.read()
if not ret: break
rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
results = mesh.process(rgb)
if results.multi_face_landmarks:
for face in results.multi_face_landmarks:
mp_draw.draw_landmarks(
frame, face, mp_face.FACEMESH_CONTOURS,
landmark_drawing_spec=mp_draw.DrawingSpec(
color=(0, 255, 0), thickness=1, circle_radius=1
)
)
cv2.imshow("MediaPipe Face Mesh", frame)
if cv2.waitKey(1) & 0xFF == ord("q"): break
cap.release()
Practica esta lección
Resuelve los ejercicios del curso de Computer Vision con Python en la app, gratis y con corrección automática.
Empezar a practicar