Aplicação de rastreamento de mãos em tempo real com efeitos visuais interativos, desenvolvida em Python utilizando MediaPipe e OpenCV.
| Painel esquerdo | Painel direito |
|---|---|
| Camera original (sem overlay) | Efeitos ativos + menu de controle |
| Tecnologia | Versão | Função |
|---|---|---|
| Python | 3.13.x | Linguagem principal |
| 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ó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 |
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
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()
# 1. Instalar dependências
pip install -r requirements.txt
# 2. Executar
python main.pyO modelo
hand_landmarker.task(~26 MB) é baixado automaticamente na primeira execução.
| 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 |
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 encerrarO 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"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) emediapipe- Arquitetura:
main.py(lógica principal) +requirements.txt(dependências)Requisitos de Implementação
- Inicialize a webcam (
cv2.VideoCapture(0)) com tratamento de erro- Aplique espelhamento horizontal (
cv2.flip) para movimento intuitivo- Converta BGR → RGB antes do MediaPipe
- Configure
max_num_hands=2, confiança mínima 0.7- Extraia landmarks das pontas dos dedos (IDs: 4, 8, 12, 16, 20)
- Implemente lógica de lateralidade corrigindo a inversão causada pelo flip
- Efeito laser: linha de núcleo (espessura 2) + glow externo (espessura 6-8) + círculos nos endpoints
- 5 cores distintas, uma por par de dedos
- Janela "Hand Laser Tracking", tecla
qpara sair
Com a aplicação aberta, rodando, quero que abra uma tela com o resultado da câmera e da modificação da aplicação.
Atualize a aplicação
main.pypara incluir uma interface de menu e novos efeitos visuais:
- Menu de Controle: alternar via teclas entre Laser, Luzes/Brilho, Raios (zigue-zague aleatório) e Poeira (partículas que seguem os landmarks)
- Efeito de Pontilhado: landmarks renderizados apenas como pontos estilizados, sem linhas do esqueleto
- Gesto de Encerramento: ao detectar punho cerrado em ambas as mãos por ~1 s, encerrar automaticamente; usar distância tip vs PIP
- Refatoração: estados gerenciados de forma modular, compatível com a MediaPipe Tasks API e o painel duplo já implementado