[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!

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.

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.

Olá amigo. vc pode disponibilizar o código do Reconhecendo mãos e contando os dedos com visão computacional. Estou tentando executar e está dando erro.