Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 
 
 

Repository files navigation

Hand Laser Tracking · v2.0

Aplicação de rastreamento de mãos em tempo real com efeitos visuais interativos, desenvolvida em Python utilizando MediaPipe e OpenCV.


Demonstração

Painel esquerdo Painel direito
Camera original (sem overlay) Efeitos ativos + menu de controle

Tecnologias Empregadas

Linguagem

Tecnologia Versão Função
Python 3.13.x Linguagem principal

Bibliotecas

Biblioteca Versão Função
MediaPipe >= 0.10.35 Detecção e rastreamento de landmarks das mãos via modelo TFLite (hand_landmarker.task). Utiliza a Tasks API (HandLandmarker) no modo VIDEO para processamento síncrono frame a frame.
OpenCV (opencv-python) >= 4.13 Captura de vídeo (VideoCapture), manipulação de frames (flip, conversão de cor), renderização de primitivas gráficas (linhas, círculos, texto, retângulos) e exibição da janela.
NumPy >= 2.4 Criação de arrays para overlays (np.zeros_like, np.full) e operações de blending (cv2.add com matriz gerada por NumPy).

Módulos da Biblioteca Padrão

Módulo Uso
math Cálculo de distâncias (hypot), ângulos (cos, sin, tau) para os efeitos de partículas e raios
random Jitter aleatório dos relâmpagos e velocidade/direção das partículas de poeira
time Timestamps monotônicos para a Tasks API (modo VIDEO) e temporização do gesto de punho
dataclasses Definição de AppState e _Particle com @dataclass
urllib.request Download automático do modelo hand_landmarker.task na primeira execução
os Verificação de existência do arquivo de modelo

Arquitetura do Código

main.py
│
├── Constantes e Customização
│   ├── FINGER_COLORS       → cores BGR por dedo
│   ├── CORE/GLOW_THICKNESS → espessuras do laser
│   ├── FIST_PAIRS          → pares (tip, pip) para detecção de punho
│   └── HAND_CONNECTIONS    → conexões do esqueleto
│
├── AppState (dataclass)
│   └── flags booleanas: laser, glow, lightning, dust, dot_mode
│
├── DustSystem
│   ├── spawn()             → cria partículas nos landmarks
│   └── update_and_draw()   → física + renderização frame a frame
│
├── Utilitários
│   ├── ensure_model()      → download automático do modelo
│   ├── get_fingertip_coords() → normalizado → pixel
│   ├── classify_hands()    → correção de lateralidade pós-flip
│   └── is_fist()           → detecção de punho por tip.y > pip.y
│
├── Renderização
│   ├── draw_skeleton()     → esqueleto cinza com HAND_CONNECTIONS
│   ├── draw_dots()         → nuvem de pontos sem linhas
│   ├── draw_laser()        → glow externo + núcleo fino + círculos
│   ├── draw_glow()         → overlay + GaussianBlur aditivo
│   └── draw_lightning()    → zigue-zague com jitter perpendicular
│
├── Interface
│   ├── draw_hud()          → status + barra de progresso do punho
│   └── draw_menu()         → menu ON/OFF sobreposto ao painel direito
│
└── run()                   → loop principal com painel duplo

Fluxo de Execução por Frame

cap.read() → cv2.flip() → raw.copy()
    → BGR→RGB → mp.Image → detect_for_video()
    → classify_hands() + is_fist()
    → [glow] → [skeleton | dots]
    → [laser] [lightning] (entre as 2 mãos)
    → [dust particles]
    → draw_hud() + draw_menu()
    → hconcat([raw | sep | processed])
    → imshow() → waitKey()

Instalação e Execução

# 1. Instalar dependências
pip install -r requirements.txt

# 2. Executar
python main.py

O modelo hand_landmarker.task (~26 MB) é baixado automaticamente na primeira execução.


Controles

Tecla Efeito
1 Toggle Laser
2 Toggle Brilho (aura/glow)
3 Toggle Raios (relâmpagos)
4 Toggle Poeira (partículas)
D Toggle Pontilhado (dot cloud)
Q Sair
✊✊ Fechar as duas mãos por 1 s → encerramento automático

Customização Rápida

Todas as variáveis de estilo estão no bloco # CUSTOMIZAÇÃO no topo de main.py:

# Cores por dedo (formato BGR)
FINGER_COLORS = {
    4:  (0, 255, 255),   # Polegar  – Ciano
    8:  (0, 0,   255),   # Indicador – Vermelho
    12: (0, 255,   0),   # Médio    – Verde
    16: (255, 0,  255),  # Anelar   – Magenta
    20: (0, 165,  255),  # Mindinho – Laranja
}

CORE_THICKNESS    = 2    # espessura do núcleo do laser
GLOW_THICKNESS    = 8    # espessura do brilho externo
CIRCLE_RADIUS     = 8    # raio dos círculos nas pontas
FIST_HOLD_SECONDS = 1.0  # tempo (s) de punho para encerrar

Correção de Lateralidade

O frame é espelhado com cv2.flip(frame, 1) para criar a experiência de espelho. Isso inverte a geometria das mãos na imagem, fazendo o MediaPipe classificar incorretamente esquerda/direita. A correção é feita em classify_hands():

# MediaPipe vê "Left" → na imagem espelhada é a mão DIREITA do usuário
corrected = "Right" if mp_label == "Left" else "Left"

Prompt Utilizado para Desenvolvimento

Prompt 1 — Aplicação base (v1.0)

Desenvolva uma aplicação em Python para rastreamento de mãos em tempo real utilizando a webcam, com o objetivo de desenhar "lasers" coloridos conectando os dedos correspondentes entre a mão esquerda e a mão direita.

Especificações Técnicas

  • Linguagem: Python 3.x
  • Bibliotecas: opencv-python (cv2) e mediapipe
  • Arquitetura: main.py (lógica principal) + requirements.txt (dependências)

Requisitos de Implementação

  1. Inicialize a webcam (cv2.VideoCapture(0)) com tratamento de erro
  2. Aplique espelhamento horizontal (cv2.flip) para movimento intuitivo
  3. Converta BGR → RGB antes do MediaPipe
  4. Configure max_num_hands=2, confiança mínima 0.7
  5. Extraia landmarks das pontas dos dedos (IDs: 4, 8, 12, 16, 20)
  6. Implemente lógica de lateralidade corrigindo a inversão causada pelo flip
  7. Efeito laser: linha de núcleo (espessura 2) + glow externo (espessura 6-8) + círculos nos endpoints
  8. 5 cores distintas, uma por par de dedos
  9. Janela "Hand Laser Tracking", tecla q para sair

Prompt 2 — Painel duplo

Com a aplicação aberta, rodando, quero que abra uma tela com o resultado da câmera e da modificação da aplicação.

Prompt 3 — Menu de efeitos e refatoração (v2.0)

Atualize a aplicação main.py para incluir uma interface de menu e novos efeitos visuais:

  1. Menu de Controle: alternar via teclas entre Laser, Luzes/Brilho, Raios (zigue-zague aleatório) e Poeira (partículas que seguem os landmarks)
  2. Efeito de Pontilhado: landmarks renderizados apenas como pontos estilizados, sem linhas do esqueleto
  3. Gesto de Encerramento: ao detectar punho cerrado em ambas as mãos por ~1 s, encerrar automaticamente; usar distância tip vs PIP
  4. Refatoração: estados gerenciados de forma modular, compatível com a MediaPipe Tasks API e o painel duplo já implementado

Repositório

GitHub: https://github.com/leoaalvsufg/visao

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages