Aprenda a identificar e rastrear mãos com OpenCV e Python
O rastreamento manual é o processo de usar a visão computacional para detectar e seguir os movimentos da mão de uma pessoa em tempo real. A aplicação mais dominante de rastreamento de mão está em fones de ouvido de realidade virtual. Os fones de ouvido permitem que você use suas mãos como entrada no lugar de controladores de toque. Isso, por sua vez, torna a experiência mais imersiva.
Descubra como rastrear as mãos de uma pessoa usando Python, OpenCV para visão computacional e MediaPipe.
Como o MediaPipe Framework rastreia as mãos?
O Google desenvolveu a estrutura MediaPipe, que contém muitas soluções de aprendizado de máquina. Uma das soluções é a solução de rastreamento de mãos e dedos chamada MediaPipe Hands . Para rastrear as mãos, o MediaPipe Hands realiza dois processos: detecção de palma e detecção de ponto de referência.
Detecção de palma da mão
O MediaPipe começa identificando onde as palmas estão na imagem de entrada. Uma vez que estimar caixas delimitadoras para objetos rígidos é mais simples do que identificar mãos com dedos articulados.
Detecção de marcos manuais
Após a detecção da palma, o MediaPipe executa a detecção de pontos de referência da mão. O modelo de ponto de referência da mão pode prever 21 coordenadas precisas da localização de cada ponto de referência da mão.
Os números representam um identificador exclusivo para cada ponto de referência.
Configurando seu ambiente
Para acompanhar este projeto, você deve estar familiarizado com os fundamentos do Python. Instale as seguintes bibliotecas em seu ambiente:
- OpenCV: Você usará esta biblioteca para visão computacional e para executar técnicas de processamento de imagem na imagem de entrada.
- MediaPipe: você usará esta biblioteca para realizar detecção e rastreamento de mão na imagem de entrada.
- imutils: Você usará esta biblioteca para redimensionar o quadro de vídeo da entrada.
Execute o seguinte comando em seu terminal para instalar as bibliotecas OpenCV, MediaPipe e imutils. Instale o pip — o gerenciador de pacotes do Python — se precisar. Certifique-se de passar as bibliotecas como uma lista delimitada por espaço.
pip install OpenCV-Python MediaPipe imutils
Quando a atualização for concluída, o ambiente estará pronto para você começar a codificar.
Importando as bibliotecas necessárias
Você precisará importar as bibliotecas instaladas para poder usá-las. Abra qualquer IDE Python, crie um arquivo Python e adicione as seguintes importações:
import cv2
import mediapipe as mp
import imutils
Certifique-se de importar OpenCV como cv2 e MediaPipe em letras minúsculas. Deixar de fazer isso gerará um erro.
Criando os objetos MediaPipe que você usará durante o rastreamento
Você usará mpHands para chamar a solução de mãos do MediaPipe e o objeto de mãos para detectar e rastrear a entrada da mão. Você usará o objeto mpDraw para desenhar as conexões entre os pontos de referência das mãos identificadas.
mpHands = mp.solutions.hands
hands = mpHands.Hands()
mpDraw = mp.solutions.drawing_utils
Você pode ajustar o modelo de mãos do MediaPipe passando vários parâmetros para o construtor Hands(). Os valores padrão são bons o suficiente para este projeto, mas você pode experimentá-los para ver como eles afetam o modelo:
Você deve deixar static_image_mode como False para garantir que o modelo detecte as mãos uma vez antes de começar a rastreá-las. Ele apenas repete o processo de rastreamento se a confiança de detecção cair abaixo do parâmetro declarado, tornando o processamento geral de entrada mais rápido.
Executando Rastreamento de Mão
Você precisa de três funções para executar o rastreamento de mão: uma para processar a entrada, uma para desenhar as conexões de referência de mão e uma função principal para controlar o fluxo do programa.
Função de processamento de entrada
Essa função pega a entrada, converte-a em escala de cinza e a passa para o modelo de mãos do MediaPipe para detectar e rastrear as mãos na entrada.
# Processing the input image
def process_image(img):
# Converting the input to grayscale
gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
results = hands.process(gray_image)
# Returning the detected hands to calling function
return results
A função retorna os resultados se houver mãos detectadas na entrada.
A função de desenho de conexões de ponto de referência manual
Esta função verifica se a função de processamento de entrada detectou alguma mão. Se houver mãos detectadas, ele faz um loop sobre cada ponto de referência e desenha um círculo ao seu redor, acompanhando o ponto de referência usando a função enumerate do Python. Em seguida, ele desenha as conexões entre os pontos de referência na entrada de vídeo original.
# Drawing landmark connections
def draw_hand_connections(img, results):
if results.multi_hand_landmarks:
for handLms in results.multi_hand_landmarks:
for id, lm in enumerate(handLms.landmark):
h, w, c = img.shape
# Finding the coordinates of each landmark
cx, cy = int(lm.x * w), int(lm.y * h)
# Printing each landmark ID and coordinates
# on the terminal
print(id, cx, cy)
# Creating a circle around each landmark
cv2.circle(img, (cx, cy), 10, (0, 255, 0),
cv2.FILLED)
# Drawing the landmark connections
mpDraw.draw_landmarks(img, handLms,
mpHands.HAND_CONNECTIONS)
return img
A função começa circulando cada ponto de referência:
Em seguida, desenha as conexões manuais:
Ele finalmente retorna sua saída para a função de chamada.
A função principal
Crie uma função principal que controlará o fluxo do seu programa. Ele receberá a entrada e redimensionará o quadro de vídeo para garantir a consistência da saída. Passe a entrada para a função de processamento que detectará e rastreará as mãos. Leve os resultados retornados para a função de desenho de conexão de marcos manuais, que desenhará a conexão na entrada de vídeo original. Ele finalmente exibirá a saída para o usuário.
def main():
# Replace 0 with the video path to use a
# pre-recorded video
cap = cv2.VideoCapture(0)
while True:
# Taking the input
success, image = cap.read()
image = imutils.resize(image, width=500, height=500)
results = process_image(image)
draw_hand_connections(image, results)
# Displaying the output
cv2.imshow("Hand tracker", image)
# Program terminates when q key is pressed
if cv2.waitKey(1) == ord('q'):
cap.release()
cv2.destroyAllWindows()
A última etapa é executar seu programa. O código abaixo garante que, ao executar o programa, a função principal seja executada primeiro.
if __name__ == "__main__":
main()
Quando o programa é executado, ele produz uma saída como esta:
O programa rastreia as mãos em tempo real.
Rastreamento de mão para realidade virtual imersiva
O rastreamento de mãos em realidade virtual torna a tecnologia mais atraente. Os fones de ouvido de realidade virtual começaram a introduzir o rastreamento manual, trazendo uma sensação de realidade aumentada ao mundo virtual. Os fones de ouvido permitem que o usuário insira comandos usando uma mão virtual.
O rastreamento de mãos em fones de ouvido virtuais é apenas uma aplicação dessa tecnologia. Você pode incorporar o rastreamento manual em qualquer área aplicável de sua preferência.
Deixe um comentário