Lectores como tú ayudan a apoyar a MUO. Cuando realiza una compra utilizando enlaces en nuestro sitio, podemos ganar una comisión de afiliado. Leer más.

Puede usar muchos proyectos para fortalecer sus habilidades en visión por computadora y Python. Uno de estos proyectos es crear un contador de flexiones simple usando Python. Puede escribir el programa de este proyecto en un solo archivo.

El programa tomará una entrada de video o una entrada en tiempo real de una cámara, realizará una estimación de la pose humana en la entrada y contará la cantidad de flexiones de brazos que la persona está haciendo. Para realizar la estimación de la pose humana, el programa utilizará el modelo de estimación de la pose humana MediaPipe.

Es un modelo desarrollado por Google que rastrea treinta y tres puntos de referencia en el cuerpo humano. También predice una segmentación de cuerpo completo que representa como una segmentación de dos clases. La siguiente imagen muestra todos los puntos de referencia que el modelo es capaz de identificar. Los puntos numerados identifican cada punto de referencia y se conectan entre sí con líneas.

instagram viewer

Crédito de la imagen: MediaPipe/GitHub

Su programa de mostrador de flexiones utilizará las posiciones de los hombros y los codos. En la imagen de arriba, los puntos de referencia del hombro son 11 y 12, mientras que los puntos de referencia del codo son 13 y 14.

Configuración de su entorno

Ya deberías estar familiarizado con los fundamentos de python. Abra un IDE de Python y cree un nuevo archivo de Python. Ejecute el siguiente comando en la terminal para instalar los paquetes respectivos en su entorno:

pip instalar OpenCV-Python

Utilizará OpenCV-Python para tomar la entrada de video en su programa y procesarla. Esta biblioteca le da a su programa capacidades de visión por computadora.

pip instalar MediaPipe

Utilizará MediaPipe para realizar una estimación de pose humana en la entrada.

pip instalar imutils

Utilizará imutils para cambiar el tamaño de la entrada de video al ancho deseado.

Importe las tres bibliotecas que instaló previamente en su entorno. Esto hará posible utilizar sus dependencias en el proyecto.

importar cv2
importar imutiles
importar tubo de medios como diputado

Luego cree tres objetos MediaPipe e inicialícelos usando las funciones respectivas. Utilizará mp.solutions.drawing_utilsfunction para dibujar los distintos puntos de referencia en la entrada. mp.solutions.drawing_styles para cambiar los estilos en los que aparecen los dibujos de los puntos de referencia, y mp.solutions.pose que es el modelo que utilizará para identificar dichos puntos de referencia.

mp_draw = mp.solutions.drawing_utils
mp_draw_styles = mp.solutions.drawing_styles
mp_pose = mp.soluciones.pose

Realización de la estimación de la pose humana

Detectar la pose de un ser humano es el proceso de identificar la orientación de su cuerpo identificando y clasificando sus articulaciones.

Declarando tus variables

Declare las variables que usará para almacenar la cantidad de flexiones, la posición de los hombros y los codos y la entrada de video.

contar = 0
posición = Ninguno
cap = cv2.VideoCapture("v4.mp4")

Inicialice la variable de posición en Ninguno. El programa lo actualizará dependiendo de la posición de los codos y hombros.

Llame al modelo de estimación de pose de MediaPipe que detectará la pose humana en la entrada.

con mp_pose. Pose(
min_detection_confidence = 0.7,
min_tracking_confianza = 0.7) como pose:

Las inicializaciones de la confianza de detección y la confianza de seguimiento representan el nivel de precisión que necesita del modelo. 0.7 es similar al 70% de precisión. Puede cambiarlo a su nivel deseado.

Tomar y preprocesar la entrada

Tome la entrada que luego pasará al modelo de estimación de pose. Cambie el tamaño del ancho de la entrada de video usando la biblioteca imutils. Convierta la entrada de BGR a RGB ya que MediaPipe funciona solo con entrada RGB. Finalmente, pase la entrada convertida al modelo de estimación de pose humana para identificar los puntos de referencia.

mientras cap.isOpened():
éxito, imagen=cap.read()

sino éxito:
imprimir("cámara vacía")
romper

imagen = imutils.resize (imagen, ancho =500)
imagen = cv2.cvtColor (cv2.flip (imagen, 1), cv2.COLOR_BGR2RGB)
resultado = pose.proceso (imagen)

Después de procesar la entrada, ha identificado los puntos de referencia en la entrada.

Dibujar los puntos de referencia identificados en la entrada

Cree una lista vacía que almacenará las coordenadas de cada punto de referencia. Usa la clase draw_landmarks para dibujar un punto en cada punto de referencia y las conexiones entre ellos. Usando un bucle for, itere sobre los puntos de referencia y almacene la ID y las coordenadas de cada punto de referencia en la lista que creó. Use la clase image.shape para calcular el ancho y el alto de la entrada de video.

lmLista = []

si resultado.pose_puntos de referencia:
# Dibuja los puntos de referencia y los conecta
mp_draw.draw_landmarks (imagen, resultado.pose_landmarks,
mp_pose. POSE_CONEXIONES)

para identificación, soy en enumerar (result.pose_landmarks.landmark):
# Encontrar la longitud y el ancho de la entrada de video
h, w, _ = imagen.forma

# Encontrar las coordenadas exactas de los puntos del cuerpo
X, Y = int (im.x * w), int (im.y * h)
lmList.append([id, X, Y])

El ID es el número asignado a un punto de referencia específico por el modelo de estimación de pose de MediaPipe. Habiendo identificado la pose del humano en la entrada, debe contar la cantidad de flexiones que están haciendo, si corresponde.

Contar el número de flexiones

Cree una condición que compare la posición de los hombros con la posición de los codos. Cuando los hombros de la persona en la entrada están más altos que los codos, la persona está arriba. Cuando los hombros están más bajos que los codos, la persona está abajo. Comprueba esto comparando los ID de los puntos de referencia de los hombros con los de los puntos de referencia de los codos.

# Comprobar si hay puntos de referencia identificados
si len (lmLista) != 0:
# Condición que identifica la posición baja
si (lmLista[12][2] y lmLista[11][2] >= lmLista[14][2] y lmLista[13][2]):
posición = "abajo"

# Condición que identifica la posición arriba
si (lmLista[12][2] y lmLista[11][2] <= lmLista[14][2] y lmLista[13][2])
y posición == "abajo":
posición = "arriba"
contar +=1

Para que una persona complete una flexión completa, debe asumir una posición hacia abajo y luego volver a la posición hacia arriba. Después de una flexión completa, el programa puede actualizar el conteo en uno.

Visualización de la salida

Debe mostrar el número de flexiones que ha contado el programa. Imprime el valor de la cuenta en el terminal, cada vez que el usuario hace una flexión completa. Finalmente, muestre la salida de la persona que hace flexiones con los puntos de referencia dibujados en su cuerpo.

 imprimir (contar)

cv2.imshow("Contador de flexiones", cv2.flip (imagen, 1))
clave = cv2.esperaClave(1)

# El programa termina cuando se presiona q
si clave == orden('q'):
romper

cap.liberar()

La salida debería ser algo como esto:

Debería observar una actualización en la terminal cuando la persona en la salida hace una flexión completa.

Fortalezca sus habilidades de visión artificial

La visión por computadora es amplia. Un contador de flexiones es uno de los muchos proyectos que puede usar para poner en práctica sus habilidades de visión por computadora. La mejor manera de fortalecer estas habilidades es construyendo más proyectos que involucren la visión artificial.

¡Cuantos más proyectos construyas, más aprenderás!