🚶 Detección de puntos clave del cuerpo con Mediapipe en Python – Pose Landmark Detection
¡Hola, hola, Omesitos! En este video vamos a retomar una de las soluciones que nos ofrece MediaPipe para detección de puntos clave en el cuerpo: Pose Landmark Detection. Veremos como aplicarlo en imágenes, videos y videostreming.¡Empecemos!
¿Qué es la detección de puntos clave del cuerpo?

El landmark detection es la detección de distintos puntos clave distribuidos en el cuerpo humano, mediante un modelo de machine learning. Dicho modelo permitirá extraer una determinada cantidad de puntos. En MediaPipe, los modelos para aplicar landmark detection pueden extraer 33 puntos.
🔧 Instalación de MediaPipe
Para llevar a cabo esta práctica debemos instalar MediaPipe, a través de:
pip install mediapipe
Puedes verificar su instalación y versión con: pip freeze
Nota: A continuación te dejo la programación usada en el video. Si quieres ver el paso a paso explicado con más detalle, ¡no te pierdas el video completo!
🚶 Pose Landmark detection en imágenes
import cv2
import mediapipe as mp
from mediapipe.tasks.python import vision
from mediapipe.tasks.python import BaseOptions
# Especificar la configuración
options = vision.PoseLandmarkerOptions(
base_options=BaseOptions(model_asset_path="pose_landmarker_lite.task"),
running_mode=vision.RunningMode.IMAGE)
landmarker = vision.PoseLandmarker.create_from_options(options)
# Leer la imagen de entrada
image = cv2.imread("./Inputs/02_image.jpg")
h, w, _ = image.shape
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
image_rgb = mp.Image(image_format=mp.ImageFormat.SRGB, data=image_rgb)
# Obtener los resultados
pose_landmarker_result = landmarker.detect(image_rgb)
print(pose_landmarker_result)
for lm in pose_landmarker_result.pose_landmarks:
#print(lm)
#print(lm[26])
#x_right_knee = int(lm[26].x * w)
#y_right_knee = int(lm[26].y * h)
#cv2.circle(image, (x_right_knee, y_right_knee), 8, (0, 0, 255), -1)
for each_lm in lm:
if each_lm.visibility > 0.9:
x_each_lm = int(each_lm.x * w)
y_each_lm = int(each_lm.y * h)
cv2.circle(image, (x_each_lm, y_each_lm), 5, (0, 255, 255), -1)
cv2.imshow("Image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
🚶 Pose Landmark detection aplicado en Video
import cv2
import mediapipe as mp
from mediapipe.tasks.python import vision
from mediapipe.tasks.python import BaseOptions
# Especificar la configuración
options = vision.PoseLandmarkerOptions(
base_options=BaseOptions(model_asset_path="pose_landmarker_lite.task"),
running_mode=vision.RunningMode.VIDEO)
landmarker = vision.PoseLandmarker.create_from_options(options)
# Leer el video de entrada
cap = cv2.VideoCapture("./Inputs/01_video.mp4")
frame_count = cap.get(cv2.CAP_PROP_FRAME_COUNT)
fps = cap.get(cv2.CAP_PROP_FPS)
for frame_index in range(int(frame_count)):
ret, frame = cap.read()
if ret == False:
break
h, w, _ = frame.shape
frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
frame_rgb = mp.Image(image_format=mp.ImageFormat.SRGB, data=frame_rgb)
# Calcular la marca temporal del frame actual (en milisegundos)
frame_timestamp_ms = int(1000 * frame_index / fps)
# Obtener los resultados
pose_landmarker_result = landmarker.detect_for_video(frame_rgb, frame_timestamp_ms)
for lm in pose_landmarker_result.pose_landmarks:
for each_lm in lm:
if each_lm.visibility > 0.9:
x_each_lm = int(each_lm.x * w)
y_each_lm = int(each_lm.y * h)
cv2.circle(frame, (x_each_lm, y_each_lm), 3, (0, 255, 255), -1)
cv2.imshow('Video', frame)
if cv2.waitKey(1) & 0xFF == 27:
break
cap.release()
cv2.destroyAllWindows()
🎞️ Pose Landmark detection aplicado en Video Stream
import cv2
import mediapipe as mp
from mediapipe.tasks.python import vision
from mediapipe.tasks.python import BaseOptions
import time
result_list = []
# Función callback para procesar los resultados
def res_callback(result, output_image, timestamp_ms):
result_list.append(result)
# Especificar la configuración
options = vision.PoseLandmarkerOptions(
base_options=BaseOptions(model_asset_path="pose_landmarker_lite.task"),
running_mode=vision.RunningMode.LIVE_STREAM,
result_callback=res_callback)
landmarker = vision.PoseLandmarker.create_from_options(options)
# Leer el video de entrada
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
while True:
ret, frame = cap.read()
if ret == False:
break
h, w, _ = frame.shape
frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
frame_rgb = mp.Image(image_format=mp.ImageFormat.SRGB, data=frame_rgb)
# Obtener los resultados
landmarker.detect_async(frame_rgb, time.time_ns() // 1_000_000)
if result_list:
for lm in result_list[0].pose_landmarks:
for each_lm in lm:
if each_lm.visibility > 0.9:
x_each_lm = int(each_lm.x * w)
y_each_lm = int(each_lm.y * h)
cv2.circle(frame, (x_each_lm, y_each_lm), 3, (0, 255, 255), -1)
result_list.clear()
cv2.imshow('Video', frame)
if cv2.waitKey(1) & 0xFF == 27:
break
cap.release()
cv2.destroyAllWindows()
Y eso ha sido todo por este post, Omesitos.
Espero que les haya resultado útil y que se animen a probarlo.
📌 No olviden revisar el video si desean ver todo el paso a paso en acción.
¡Nos vemos en el siguiente post!



