Aprenda a identificar e rastrear mãos com OpenCV e Python

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.

Uma mão com marcos nomeados

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:

Pycharm IDE exibindo os parâmetros padrão do MediaPipe Hands

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:

Saída de um programa com cada marco circulado

Em seguida, desenha as conexões manuais:

Saída de um programa de rastreamento de mãos

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:

Saída de um programa de rastreamento de mãos

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

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *