Leitores como você ajudam a apoiar o MUO. Quando você faz uma compra usando links em nosso site, podemos ganhar uma comissão de afiliado. Consulte Mais informação.

Você pode usar muitos projetos para fortalecer suas habilidades em visão computacional e Python. Um desses projetos é criar um contador de push-up simples usando Python. Você pode escrever o programa deste projeto em um único arquivo.

O programa receberá uma entrada de vídeo ou uma entrada em tempo real de uma câmera, executará uma estimativa de pose humana na entrada e contará o número de flexões que a pessoa está fazendo. Para executar a estimativa de pose humana, o programa usará o modelo de estimativa de pose humana MediaPipe.

É um modelo desenvolvido pelo Google que rastreia trinta e três marcos no corpo humano. Ele também prevê uma segmentação de corpo inteiro que representa como uma segmentação de duas classes. A imagem a seguir mostra todos os marcos que o modelo é capaz de identificar. Pontos numerados identificam cada ponto de referência e se conectam uns aos outros com linhas.

instagram viewer
Crédito da imagem: MediaPipe/GitHub

Seu programa de contra-flexão utilizará as posições dos ombros e dos cotovelos. Na imagem acima, os pontos de referência do ombro são 11 e 12, enquanto os pontos de referência do cotovelo são 13 e 14.

Configurando seu ambiente

Você já deve estar familiarizado com o básico de Python. Abra um Python IDE e crie um novo arquivo Python. Execute o seguinte comando no terminal para instalar os respectivos pacotes em seu ambiente:

pip instalar OpenCV-Python

Você usará o OpenCV-Pythonto para obter a entrada de vídeo em seu programa e processá-la. Esta biblioteca dá ao seu programa recursos de visão computacional.

pip instalar MediaPipe

Você usará o MediaPipe para executar a estimativa de pose humana na entrada.

pip instalar imutils

Você usará imutils para redimensionar a entrada de vídeo para a largura desejada.

Importe as três bibliotecas que você instalou anteriormente em seu ambiente. Isso possibilitará o uso de suas dependências no projeto.

importar cv2
importar imutils
importar mediapipe como mp

Em seguida, crie três objetos MediaPipe e inicialize-os usando as respectivas funções. Você usará a função mp.solutions.drawing_utils para desenhar os vários pontos de referência na entrada. mp.solutions.drawing_styles para alterar os estilos em que os desenhos dos marcos aparecem e mp.solutions.pose que é o modelo que você usará para identificar esses marcos.

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

Realizando a estimativa de pose humana

Detectar a pose de um ser humano é o processo de identificar a orientação de seu corpo, identificando e classificando suas articulações.

Declarando suas variáveis

Declare as variáveis ​​que você usará para armazenar o número de flexões, a posição dos ombros e cotovelos e a entrada de vídeo.

contagem = 0
posição = Nenhum
cap = cv2.VideoCapture("v4.mp4")

Inicialize a variável de posição como None. O programa irá atualizá-lo dependendo da posição dos cotovelos e ombros.

Chame o modelo de estimativa de pose MediaPipe que detectará a pose humana na entrada.

com mp_pose. Pose(
min_detecção_confiança = 0.7,
min_tracking_confiança = 0.7) como pose:

As inicializações da confiança de detecção e confiança de rastreamento representam o nível de precisão que você precisa do modelo. 0,7 é semelhante a 70% de precisão. Você pode alterá-lo para o nível desejado.

Tomando e pré-processando a entrada

Pegue a entrada que você passará posteriormente para o modelo de estimativa de pose. Redimensione a largura da entrada de vídeo usando a biblioteca imutils. Converta a entrada de BGR para RGB, pois o MediaPipe funciona apenas com entrada RGB. Por fim, passe a entrada convertida para o modelo de estimativa de pose humana para identificar os pontos de referência.

enquanto cap.isOpened():
sucesso, imagem=cap.read()

senão sucesso:
imprimir("câmera vazia")
quebrar

imagem = imutils.resize (imagem, largura =500)
imagem = cv2.cvtColor (cv2.flip (imagem, 1), cv2.COLOR_BGR2RGB)
resultado = pose.process (imagem)

Depois de processar a entrada, você identificou os pontos de referência na entrada.

Desenhando os marcos identificados na entrada

Crie uma lista vazia que armazenará as coordenadas de cada ponto de referência. Use a classe draw_landmarks para desenhar um ponto em cada marco e as conexões entre eles. Usando um loop for, itere sobre os pontos de referência e armazene o ID e as coordenadas de cada ponto de referência na lista que você criou. Use a classe image.shape para calcular a largura e a altura da entrada de vídeo.

lmList = []

se result.pose_landmarks:
# Desenha os pontos dos marcos e os conecta
mp_draw.draw_landmarks (imagem, result.pose_landmarks,
mp_pose. POSE_CONNECTIONS)

para id, eu em enumerar (result.pose_landmarks.landmark):
# Encontrando o comprimento e a largura da entrada de vídeo
h, w, _ = imagem.forma

# Encontrando as coordenadas exatas dos pontos do corpo
X, Y = int (im.x * w), int (im.y * h)
lmList.append([id, X, Y])

O ID é o número atribuído a um ponto de referência específico pelo modelo de estimativa de pose do MediaPipe. Tendo identificado a pose do humano na entrada, você precisa contar o número de flexões que ele está fazendo, se houver.

Contando o número de flexões

Crie uma condição que verifique a posição dos ombros em relação à posição dos cotovelos. Quando os ombros da pessoa na entrada são mais altos que os cotovelos, a pessoa está de pé. Quando os ombros estão mais baixos que os cotovelos, a pessoa está caída. Você verifica isso comparando os IDs dos pontos de referência dos ombros com os dos pontos de referência dos cotovelos.

# Verificando se existem pontos de referência identificados
se len (lmLista) != 0:
# Condição que identifica a posição para baixo
se (lmLista[12][2] e lmLista[11][2] >= lmList[14][2] e lmLista[13][2]):
posição = "abaixo"

# Condição que identifica a posição para cima
se (lmLista[12][2] e lmLista[11][2] <= lmLista[14][2] e lmLista[13][2])
e posição == "abaixo":
posição = "acima"
contar +=1

Para uma pessoa completar uma flexão completa, ela deve assumir uma posição para baixo e depois voltar para a posição superior. Após uma flexão completa, o programa pode atualizar a contagem em um.

Exibindo a Saída

Você precisa exibir o número de flexões que o programa contou. Imprima o valor da contagem no terminal, cada vez que o usuário fizer uma flexão completa. Por fim, exiba a saída da pessoa fazendo flexões com os pontos de referência desenhados em seu corpo.

 imprimir (contar)

cv2.imshow("Contador de flexões", cv2.flip (imagem, 1))
chave = cv2.waitKey(1)

# O programa termina quando q é pressionado
se chave == ord('q'):
quebrar

cap.release()

A saída deve ser algo como isto:

Você deve observar uma atualização no terminal conforme a pessoa na saída faz uma flexão completa.

Fortaleça suas habilidades de visão computacional

A visão computacional é ampla. Um contador de flexões é um dos muitos projetos que você pode usar para colocar em prática suas habilidades de visão computacional. A melhor maneira de fortalecer essas habilidades é criar mais projetos que envolvam visão computacional.

Quanto mais projetos você construir, mais aprenderá!