Python jugando inteligencia artificial: ¿Estás haciendo bien tus flexiones?

1. Preparativos

1.1 Instalar Python3.8.x

1.2 Instalar PyCharm Community Edition

1.3 Crear un proyecto

1.4 Instalar el proyecto usando el kit de herramientas

1.1 Descargue e instale la versión Python3.8.x

En primer lugar, necesitamos instalar Python3.8.x en nuestra computadora. Python 3.8.x:  https://www.python.org/downlo...

1.2 Descargue e instale PyCharm Community Edition

PyCharm:  https://www.jetbrains.com/pyc  ... Por supuesto, también puede usar su IDE favorito.

1.3 Crear un proyecto Python

Después de instalar Python y PyCharm, podemos iniciar PyCharm y crear un nuevo proyecto de Python. Seleccione la ubicación de almacenamiento del proyecto. Al crear un proyecto, puede pedirle a PyCharm que lo ayude a crear un entorno virtual (virtualenv). El entorno virtual puede entenderse como el entorno de programación exclusivo para este proyecto y no afectará a otros proyectos.

1.4 Instalar el kit de herramientas utilizado por el proyecto

Después de crear el proyecto, abrimos la ventana Terminal de PyCharm, donde podemos ingresar el siguiente comando para instalar el kit de herramientas requerido para este proyecto: opencv-python mediapipe numpy pyautogui. El siguiente comando descargará el kit de herramientas de Internet y lo instalará. Si ve "Instalado con éxito..." al final, significa que la instalación se realizó correctamente.

pip instalar opencv-python mediapipe numpy

También puede hacer clic en la configuración de PyCharm para ver si existen los kits de herramientas anteriores en el entorno de Python del proyecto. Si los hay, significa que la instalación se realizó correctamente.

2. Escribe el programa

2.1 Crear módulo poseutil.py

2.2 Escribir pushup.py

2.3 Prueba de funcionamiento

2.1 Crear módulo poseutil.py

Cree un nuevo archivo Python llamado poseutil.py, que es el módulo de reconocimiento de poses que creamos. En este módulo, hay una clase de reconocimiento de poses PoseDetector, que puede reconocer poses humanas, obtener datos de poses humanas y calcular el ángulo del punto de Interés por la pose del cuerpo humano.

import cv2 
import mediapipe as mp 
import math 

class PoseDetector(): 
    ''' 
    Clase de detección de pose del cuerpo humano 
    ''' 

    def __init__(self, 
                 static_image_mode=False, 
                 upper_body_only=False, 
                 smooth_landmarks=True, 
                 min_detection_confidence=0.5, 
                 min_tracking_confid ence=0.5) : 
        ' '' 
        Inicialización 
        : param static_image_mode: Si se trata de una imagen estática, el valor predeterminado es No 
        : param upper_body_only: Si se trata de la parte superior del cuerpo, el valor predeterminado es No 
        : param smooth_landmarks: Establézcalo en True para reducir la inestabilidad 
        : param min_detection_confidence: El valor mínimo de confianza del modelo de detección de personas, el valor predeterminado es 0,5
        :param min_tracking_confidence: El valor mínimo de confianza de 
        los marcadores confiables 
        de pose, el 
        valor 
        predeterminado es 
        0.5  
        '''
        detección Pose del cuerpo humano 
        self.pose = mp.solutions.pose.Pose(self.static_image_mode, self.upper_body_only, self.smooth_landmarks, 
                                           self.min_detection_confidence, self.min_tracking_confidence) 
    def find_pose(self, img, draw=True): 
        ''' 
        método de detección de pose 
        : param img: un marco de imagen
 
        : param draw: si dibujar el nodo de pose del cuerpo humano y el gráfico de conexión 
        : retorno : imagen procesada 
        '''
        imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) 
        # pose.process(imgRGB) reconocerá los datos de pose del cuerpo humano en este marco de imagen y los guardará en self.results self.results 
        = self.pose.process(imgRGB) 
        if self .results.pose_landmarks: 
            if draw: 
                mp.solutions.drawing_utils.draw_landmarks(img, self.results.pose_landmarks, 
                                                          mp.solutions.pose.POSE_CONNECTIONS) 
        return img 

    def find_positions(self, img): 
        ''' 
        Obtener cuerpo humano pose data 
        : param img: un marco de imagen 
        : param draw: si dibujar el nodo de postura del cuerpo humano y el gráfico de conexión 
        : return: lista de datos de postura del cuerpo humano  
        '''
        # lista de datos de postura del cuerpo humano, cada miembro consta de 3 números: id, x , y 
        # id representa un cierto punto conjunto del cuerpo humano, x e y representan datos de posición coordinada 
        self.lmslist = [] 
        if self.results.pose_landmarks: 
            para id, lm en enumerate(self.results.pose_landmarks.landmark): 
                h, w, c = img.shape 
                cx, cy = int(lm.x * w), int(lm.y * h) 
                self.lmslist. append([id, cx, cy]) 

        return self.lmslist 

    def find_angle(self, img, p1, p2, p3, draw=True): 
        ''' 
        Obtenga los ángulos de 3 puntos p1-p2-p3 en el cuerpo humano pose 
        : param img: un marco de imagen 
        : param p1: el primer punto 
        : param p2: el segundo punto 
        : param p3: el tercer punto 
        : param draw: si dibujar el diagrama de conexión de tres puntos
        :return: ángulo 
            cv2.círculo(img, (x3, y3), 20, (0, 255, 255),cv2.LLENADO) 
        '''
        x1, y1 = self.lmslist[p1][1], self.lmslist[p1][2] 
        x2, y2 = self.lmslist[p2][1], self.lmslist[p2][2] 
        x3, y3 = self.lmslist[p3][1], self.lmslist[p3][2] 

        # Usa la fórmula trigonométrica para obtener 3 puntos p1-p2-p3, el valor del ángulo con p2 como el ángulo, entre 0-180 grados 
        ángulo = int(math.degrees(math.atan2(y1 - y2, x1 - x2) - math.atan2(y3 - y2, x3 - x2))) 
        si ángulo < 0: 
            ángulo = ángulo + 360 
        si ángulo > 180: 
            ángulo = 360 - ángulo 

        si dibujar: 
            cv2.círculo(img, (x1, y1), 20, (0, 255, 255), cv2.LLENADO) cv2.círculo 
            (img, (x2, y2), 30, (255, 0 , 255), cv2.LLENADO) 
            cv2.línea(img, (x1, y1), (x2, y2), (255, 255, 255, 3)) 
            img, (x2, y2), (x3, y3), (255, 255 , 255, 3)) 
            cv2.putText(img, str(ángulo), (x2 - 50, y2 + 50), cv2.FONT_HERSHEY_SIMPLEX, 2, (0, 255, 255), 2) ángulo de 

        retorno
    

2.2 Escribir pushup.py

Escriba el siguiente código, llame al módulo poseutil para obtener datos de la postura del cuerpo humano y calcule los ángulos formados por los hombros, las caderas, las rodillas y los hombros, los codos y las muñecas en el cuerpo humano, y use estos dos ángulos para juzgar si empujar- ups son estándar.

# Importar kit de herramientas opencv 
importar cv2 
# Importar numpy 
importar numpy como np 
# Importar reconocedor de poses 
desde poseutil import PoseDetector 

# Abrir archivo de video 
cap = cv2.VideoCapture('videos/pushup.mp4') 
# Detector de poses 
= PoseDetector() 

# Dirección y number 
dir = 0 # 0 es hacia abajo, 1 es 
cuenta ascendente = 0 

# Ancho y alto del video ancho 
= int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) 
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) 

# Configuración de grabación de video 
fourcc = cv2.VideoWriter_fourcc(*'mp4v') 
out = cv2.VideoWriter('videos/pushupoutput.mp4', fourcc, 30.0, (ancho, alto)) 

while True: 
    # lee la cámara, img es 
    éxito de imagen por cuadro, img = cap.read() 
    si tiene éxito:
        h, w, c = img.shape 
        # Reconocimiento de postura 
        img = detector.find_pose(img, draw=True) 
        # Obtener datos de postura 
        posiciones = detector.find_positions(img) 

        if posiciones: 
            # Obtener el ángulo de flexión de brazos 
            angle1 = detector .find_angle(img, 12, 24, 26) 
            angle2 = detector.find_angle(img, 12, 14, 16) 
            # longitud de la barra de progreso bar 
            = np.interp(angle2, (45, 150), (w // 2 - 100 , w / / 2 + 100)) 
            cv2.rectangle(img, (w // 2 - 100, h - 150), (int(bar), h - 100), (0, 255, 0), cv2.FILLED ) # 
            ángulo 
            Si ángulo2 <= 50 y ángulo1 >= 165 y ángulo1 <= 175: 
                dir == 0:
                    count = count + 0.5  
                    dir = 1
            # El ángulo mayor a 125 grados se considera apuntalado 
            si angle2 >= 125 and angle1 >= 165 and angle1 <= 175: 
                if dir == 1: 
                    count = count + 0.5 
                    dir = 0 
            cv2.putText(img , str (int(count)), (w // 2, h // 2), cv2.FONT_HERSHEY_SIMPLEX, 10, (255, 255, 255), 20, cv2.LINE_AA) # Abrir una ventana de imagen para mostrar el video 

        image 
        cv2.imshow ('Imagen', img) 

        # Grabar video 
        out.write(img) 
    else: 
        # El video finaliza y sale 
        break 

    # Si se presiona la tecla q, el programa sale 
    key = cv2.waitKey(1) 
    if key = = ord('q') : 
        romper 

# Cerrar el protector de video
out.release() 
# Cierra la cámara  
tapa de la cámara.release() 
# Cierra la ventana del programa
cv2.destroyAllWindows()

2.3 Prueba de funcionamiento

En la prueba de carrera real, el ángulo de flexión que establecemos está entre 50 grados y 125 grados, que se puede ajustar de acuerdo con el ángulo de disparo. Además, requerimos que el ángulo de la cadera esté entre 165 grados y 175 grados, que puede también ser ajustado. Se recomienda colocar más en el costado del cuerpo humano al grabar videos o usar la cámara, para que la detección sea más precisa.

 

 

Supongo que te gusta

Origin blog.csdn.net/weixin_73136678/article/details/128651181
Recomendado
Clasificación