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.