Módulo de seguimiento de poses con OpenCv y Mediapipe

noor dijo

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:

  • OpenCV
  • Mediapipe
  • 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 fps

    class 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:

  • Importar las bibliotecas necesarias mediapipe y time.
  • Definir el 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″]

    Deja un comentario

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

    Scroll al inicio