[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()
🐛 Espero que tenham gostado, se preferirem, posso trazer mais conteúdos como esse aqui no tabnews.
Até mais pessoal!