Executando verificação de segurança...
3

[DATA SCIENCE] DAY: 028 - Reconhecendo mãos e contando os dedos com visão computacional

🐍 Bom dia, Boa tarde e Boa noite pessoal, tudo bem?

🧃 Espero que estejam bem, desapareci nesses últimos dois dias porque estou trabalhando em um outro projeto pessoal que está dando certo além desse aqui, futuramente pretendo compartilhar aqui com vocês!

O assunto de hoje vai ser um conteúdo diferente do que estamos acostumados a ver aqui no onlyDataFans, vou falar sobre visão computacional, uma das áreas que gosto muito! Irei ensinar vocês a como identificar mãos e contar os dedos em tempo real!

Irei utilizar o opencv e o mediapipe <3


Vamos importar as bibliotecas do mediapipe responsáveis por desenhar os resultados na imagem e identificar as mãos:

import cv2
import mediapipe as mp

mp_drawing = mp.solutions.drawing_utils
mp_drawing_styles = mp.solutions.drawing_styles
mp_hands = mp.solutions.hands

Iniciar a captura de vídeo da webcam:

cap = cv2.VideoCapture(0)

Utilizar a biblioteca do mediapipe para identificar as mãos na imagem:

with mp_hands.Hands(
    model_complexity=0, # Nível de complexidade do modelo de reconhecimento de mãos
    min_detection_confidence=0.5, # Nível mínimo de confiança na detecção de mãos
    min_tracking_confidence=0.5) as hands:

Loop de captura de frames da webcam:

  while cap.isOpened():
    success, image = cap.read() # Captura um frame da webcam
    if not success: # Caso não tenha sido possível capturar o frame, o loop continua
      print("Ignorando frame vazio da câmera.")
      continue

Para melhorar o desempenho, marca a imagem como não editável:

    image.flags.writeable = False

Converte a imagem de BGR para RGB:

    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

Processa a imagem com a biblioteca do mediapipe para identificar as mãos:

    results = hands.process(image)

Marca a imagem como editável novamente:

    image.flags.writeable = True

Converte a imagem de volta de RGB para BGR:

    image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)

Inicializa a contagem de dedos como 0:

    fingerCount = 0

Caso tenha sido identificado pelo menos uma mão na imagem:

    if results.multi_hand_landmarks:

Loop pelas mãos identificadas:

      for hand_landmarks in results.multi_hand_landmarks:

Pega o índice da mão identificada para identificar se é a mão esquerda ou direita:

        handIndex = results.multi_hand_landmarks.index(hand_landmarks)
        handLabel = results.multi_handedness[handIndex].classification[0].label

Inicializa a lista de pontos de referência (landmarks) da mão:

        handLandmarks = []

Preencher lista com posições x e y de cada landmark:

      for landmarks in hand_landmarks.landmark:
        handLandmarks.append([landmarks.x, landmarks.y])

Condições de teste para cada dedo: contador é aumentado se o dedo é considerado levantado. Polegar: posição x da ponta deve ser maior ou menor que posição x da Junta Interfalangeana Proximal (JIP), dependendo da rotulação da mão:

        if handLabel == "Left" and handLandmarks[4][0] > handLandmarks[3][0]:
          fingerCount = fingerCount+1
        elif handLabel == "Right" and handLandmarks[4][0] < handLandmarks[3][0]:
          fingerCount = fingerCount+1

Outros dedos: posição y da ponta deve ser menor que posição y da JIP, já que o origem da imagem está no canto superior esquerdo:

      if handLandmarks[8][1] < handLandmarks[6][1]:       #Dedo indicador
        fingerCount = fingerCount + 1
      if handLandmarks[12][1] < handLandmarks[10][1]:     #Dedo do meio
        fingerCount = fingerCount + 1
      if handLandmarks[16][1] < handLandmarks[14][1]:     #Dedo anelar
        fingerCount = fingerCount + 1
      if handLandmarks[20][1] < handLandmarks[18][1]:     #Dedo mindinho
        fingerCount = fingerCount + 1

Desenha a marca das mãos:

 mp_drawing.draw_landmarks(
        image,
        hand_landmarks,
        mp_hands.HAND_CONNECTIONS,
        mp_drawing_styles.get_default_hand_landmarks_style(),
        mp_drawing_styles.get_default_hand_connections_style())

Exibe contagem de dedos:

cv2.putText(image, str(fingerCount), (50, 450), cv2.FONT_HERSHEY_SIMPLEX, 3, (255, 0, 0), 10)

Exibe imagem:

cv2.imshow('MediaPipe Hands', image)

Verifica se tecla de esc foi pressionada para finalizar o script:

if cv2.waitKey(5) & 0xFF == 27:
  break
cap.release()

Imagem do código acima



🐛 Espero que tenham gostado, se preferirem, posso trazer mais conteúdos como esse aqui no tabnews.

Até mais pessoal!

Carregando publicação patrocinada...
2

Fala aí onlyDataFans,

Deu um pulo de conceitos em rapaz hahaha.

Mas foi bem legal que esteja trazendo deeplearning pra cá também.

Seria legal também trazer o famoso e polêmico modelo de aprendizagem não supervisionado.

1

Fala meu brother! Eu me senti pressionado a trazer esse conteúdo porque é algo que andei vendo esses últimos dias por conta de um outro projeto. Como fiquei sem produzir conteúdo pra trilha de cientista de dados junior, decidi postar algo sobre o que eu estou vendo agora. Pretendo abrangir esses temas futuramente, deep learning, modelo de aprendizagem não supervisionado e outros que são do meu interesse.

1