
El seguimiento de poses es una tarea de detección y seguimiento de las articulaciones del cuerpo humano en un video o imagen. En los últimos años, el seguimiento de poses se ha vuelto cada vez más popular debido a sus posibles aplicaciones en varios campos, como los juegos, los deportes, la atención médica y la robótica. Es una tarea desafiante debido a la naturaleza compleja del movimiento del cuerpo humano y las variaciones en las diferentes formas del cuerpo.
Este proyecto trata sobre la creación de una aplicación de seguimiento de poses utilizando la biblioteca Mediapipe en Python. La aplicación toma un video como entrada y detecta la pose del cuerpo de la persona en el video. La pose corporal detectada se usa luego para rastrear las posiciones de varias partes del cuerpo, como las manos, los pies y la cabeza.
Mediapipe es una biblioteca de código abierto desarrollada por Google para crear aplicaciones multiplataforma en tiempo real para dispositivos móviles, computadoras de escritorio y navegadores web. Proporciona un conjunto de modelos y algoritmos prediseñados para tareas como la estimación de poses, el seguimiento de manos, la detección de rostros y el seguimiento de objetos. En este proyecto, utilizaremos el modelo de estimación de pose proporcionado por la biblioteca de Mediapipe.
Estructura del proyecto:
El proyecto consiste en un script de Python que utiliza la biblioteca Mediapipe para detectar la pose del cuerpo en un video. El script está estructurado en dos clases: la clase «posetracking», que contiene los métodos para detectar la pose y rastrear las posiciones, y la clase «main», que contiene el método principal que ejecuta la aplicación.
La clase «posetracking» tiene dos métodos: «findPose» y «findposition». El método «findPose» toma una imagen como entrada y detecta la pose utilizando el modelo de estimación de pose de Mediapipe. Luego, el método visualiza los puntos de referencia y los segmentos detectados en la imagen y devuelve la imagen procesada. El método «findposition» toma la imagen procesada como entrada y devuelve las posiciones de las partes del cuerpo en una lista.
El método «principal» lee el archivo de video usando la biblioteca OpenCV y crea una instancia de la clase «posetracking». Luego, el método procesa cada cuadro del video utilizando los métodos «findPose» y «findposition» de la clase «posetracking». Finalmente, el método muestra los fotogramas procesados con las partes del cuerpo detectadas y la velocidad de fotogramas del video.
Uso:
Para utilizar esta aplicación, debe instalar las siguientes bibliotecas:
Puede instalar estas bibliotecas usando pip:
pip install opencv-python
pip install mediapipe
Una vez que haya instalado las bibliotecas, puede ejecutar el script de Python ejecutando el siguiente comando en la terminal:
python pose_tracking.py
Código fuente:
import mediapipe as mp
import time # to track fpsclass posetracking:
def __init__(self,static_image_mode = False,model_complexity = 1,smooth_landmarks = True,enable_segmentation = False,smooth_segmentation = True,min_detection_confidence = 0.5,min_tracking_confidence=0.4):
self.model_complexity = model_complexity
self.smooth_landmarks = smooth_landmarks
self.enable_segmentation = enable_segmentation
self.smooth_segmentation = smooth_segmentation
self.min_detection_confidence = min_detection_confidence
self.min_tracking_confidence = min_detection_confidence
self.mpPose = mp.solutions.pose # use to detect pose landmarks
self.pose = self.mpPose.Pose(self.model_complexity,self.smooth_landmarks,self.enable_segmentation,self.smooth_segmentation,self.min_tracking_confidence)
self.mpDraw = mp.solutions.drawing_utils # functions for visualizing the detected landmarks and segments on the image.
# finding pose
def findPose(self,img,draw=True):
self.RGBimg = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
self.result = self.pose.process(self.RGBimg)
if self.result.pose_landmarks:
# for poseLms in self.result.pose_landmarks:
self.mypose = self.mpDraw.draw_landmarks(img,self.result.pose_landmarks,self.mpPose.POSE_CONNECTIONS)
return img
# getting potions ========
def findposition(self, img, draw=True):
lst = []
if self.result.pose_landmarks:
for id,lm in enumerate(self.result.pose_landmarks.landmark):
h,w,c = img.shape
cx,cy = int(lm.x * w), int(lm.y * h)
lst.append([id,cx,cy])
cv2.circle(img,(cx,cy),5,(0,0,255),cv2.FILLED)
return lst
# --------------------------end class
#python main-----------
if __name__ == "__main__":
# some variables
cTime = 0
pTime = 0
cap = cv2.VideoCapture('v1.mp4')
# clas obj
detector = posetracking()
while True:
success,frame = cap.read()
if not success:
break
frame = detector.findPose(frame)
lst = detector.findposition(frame)
print(lst)
cTime = time.time()
fps = 1/(cTime - pTime)
pTime = cTime
cv2.putText(frame,str(int(fps)), (70, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 3)
cv2.imshow('video',frame)
if cv2.waitKey(20) & 0xFF == ord("d"):
break
explanación
Este es un código de Python que usa la biblioteca Mediapipe para rastrear poses humanas en un video. El posetracking
La clase contiene métodos para detectar y visualizar puntos de referencia y segmentos de pose, así como para obtener sus posiciones. La función principal captura un video y usa el posetracking
clase para detectar y dibujar puntos de referencia y segmentos de pose en cada cuadro del video. También muestra los fotogramas con un contador de FPS (fotogramas por segundo).
Aquí hay una explicación línea por línea del código:
mediapipe
y time
.posetracking
clase.4–13. Inicialice la clase con varios parámetros que afectan la detección y el seguimiento de poses.
15–19. Instanciar el Pose
clase de la mediapipe
biblioteca, que se utiliza para detectar puntos de referencia de pose.
20–21. Instanciar el drawing_utils
clase de la mediapipe
biblioteca, que proporciona funciones para visualizar puntos de referencia y segmentos detectados en la imagen.
24–35. El findPose
El método toma una imagen como entrada y devuelve la misma imagen con los puntos de referencia detectados y los segmentos dibujados en ella. Primero convierte la imagen de formato BGR a RGB, que es el formato utilizado por el Pose
clase. Luego procesa la imagen con el Pose
clase y almacena los resultados en el result
atributo. Si se detectan puntos de referencia de pose, los dibuja en la imagen usando el draw_landmarks
función de la drawing_utils
clase. Finalmente, devuelve la imagen.
38–50. El findposition
El método toma una imagen como entrada y devuelve una lista de las posiciones de cada punto de referencia de pose detectado. Primero comprueba si se detectan puntos de referencia de pose en el result
atributo. Si es así, itera sobre los puntos de referencia y calcula sus posiciones en relación con el tamaño de la imagen. Almacena cada posición en una lista junto con su ID de punto de referencia correspondiente. Luego dibuja un círculo en cada posición de punto de referencia en la imagen de entrada usando el cv2.circle
función. Finalmente, devuelve la lista de posiciones.
54–65. El main
La función captura un video y muestra cada cuadro con los puntos de referencia detectados y los segmentos dibujados en él, así como un contador de FPS. Primero inicializa un objeto de captura de video usando el cv2.VideoCapture
función. Luego instancia la posetracking
clase como detector
. Entra en un bucle que lee fotogramas del vídeo utilizando el cap.read()
método. Si un marco se lee con éxito, lo pasa al findPose
metodo de la detector
objeto para detectar y dibujar puntos de referencia y segmentos de la imagen. Luego pasa la imagen resultante al findposition
metodo de la detector
objeto para obtener las posiciones de los puntos de referencia. Imprime la lista de posiciones de puntos de referencia en la consola. Calcula y muestra los FPS del video usando el time
biblioteca. Luego muestra la imagen con los puntos de referencia y el contador de FPS usando el cv2.imshow
función. Finalmente, sale del ciclo si se presiona la tecla ‘d’.
Conclusión:
En este proyecto, hemos creado una aplicación de seguimiento de poses utilizando la biblioteca Mediapipe en Python. La aplicación toma un video como entrada y detecta la pose del cuerpo de la persona en el video. La pose corporal detectada se usa luego para rastrear las posiciones de varias partes del cuerpo. Este proyecto se puede ampliar para incluir características adicionales como reconocimiento de gestos, corrección de postura y seguimiento de ejercicios.
[post_relacionado id=»1792″]