Computer Vision con PythonDeteccion de ObjetosLección 8 de 12
Deteccion de pose y manos
MediaPipe de Google detecta el cuerpo humano completo: pose (33 puntos del cuerpo), manos (21 puntos por mano) y cara (468 puntos).
Aplicaciones de pose detection: • Fitness: Contar repeticiones, verificar forma correcta • Fisioterapia: Monitorear ejercicios de rehabilitacion • Gaming: Control por gestos sin controller • Seguridad: Detectar caidas de personas mayores • Deportes: Analisis de tecnica
Aplicaciones de hand tracking: • Lenguaje de senas: Traducir gestos a texto • Control de UI: Interaccion sin tocar la pantalla • VR/AR: Tracking de manos en realidad virtual • Musica: Instrumentos virtuales controlados por gestos
import cv2
import mediapipe as mp
import math
mp_pose = mp.solutions.pose
mp_hands = mp.solutions.hands
mp_draw = mp.solutions.drawing_utils
def count_fingers(hand_landmarks):
"""Cuenta dedos levantados"""
tips = [4, 8, 12, 16, 20] # IDs de puntas de dedos
fingers = 0
# Pulgar (comparar X)
if hand_landmarks.landmark[4].x < hand_landmarks.landmark[3].x:
fingers += 1
# Otros dedos (comparar Y — arriba = menor)
for tip in tips[1:]:
if hand_landmarks.landmark[tip].y < hand_landmarks.landmark[tip - 2].y:
fingers += 1
return fingers
def calculate_angle(a, b, c):
"""Calcula angulo entre 3 puntos (para ejercicios)"""
angle = math.degrees(
math.atan2(c.y - b.y, c.x - b.x) -
math.atan2(a.y - b.y, a.x - b.x)
)
return abs(angle)
# Pose + Hands en webcam
cap = cv2.VideoCapture(0)
pose = mp_pose.Pose(min_detection_confidence=0.5)
hands = mp_hands.Hands(max_num_hands=2, min_detection_confidence=0.5)
while True:
ret, frame = cap.read()
if not ret: break
rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
# Pose
pose_results = pose.process(rgb)
if pose_results.pose_landmarks:
mp_draw.draw_landmarks(frame, pose_results.pose_landmarks, mp_pose.POSE_CONNECTIONS)
# Hands
hand_results = hands.process(rgb)
if hand_results.multi_hand_landmarks:
for hand in hand_results.multi_hand_landmarks:
mp_draw.draw_landmarks(frame, hand, mp_hands.HAND_CONNECTIONS)
fingers = count_fingers(hand)
cv2.putText(frame, f"Dedos: {fingers}", (10, 30),
cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
cv2.imshow("Pose + Hands", frame)
if cv2.waitKey(1) & 0xFF == ord("q"): break
cap.release()
ConsejoMediaPipe corre en CPU a 30+ FPS. No necesitas GPU. Es la mejor opcion para prototipos rapidos y apps moviles.
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