Sistema de detecção de gestos em tempo real para jogos multiplayer. Quando um ou mais jogadores levantam os dois braços por 2 segundos, o sistema salva automaticamente os últimos 30 segundos de vÃdeo com marca d'água e registra no banco de dados.
- A câmera captura o vÃdeo continuamente em uma thread dedicada
- YOLOv8 detecta a pose de todas as pessoas no frame em outra thread
- Quando alguém mantém os dois braços levantados por 2 segundos, o gesto é confirmado
- O sistema toca um som, salva o clipe e registra no banco
- A API Flask permite buscar os vÃdeos pelo código da partida
instaplay/
├── app.py # Loop principal + orquestração das threads
├── config.py # Constantes (FPS, buffer, resolução, paths)
├── camera/
│ ├── camera.py # Captura de vÃdeo em thread dedicada
│ ├── detector.py # Inferência YOLOv8 em thread dedicada
│ └── pose_utils.py # Lógica de detecção de braços levantados
├── processing/
│ ├── bufferManager.py # Buffer circular de 30 segundos
│ └── videoSaver.py # Exporta vÃdeo do buffer com marca d'água
├── server/
│ ├── server.py # API Flask
│ ├── db/connection.py # Conexão PostgreSQL + modelos ORM
│ └── services/
│ └── partidas_service.py # Regras de negócio (partidas e vÃdeos)
├── static/
│ ├── logo.png # Marca d'água aplicada nos vÃdeos
│ ├── start.mp3 # Som ao iniciar a partida
│ ├── replay.mp3 # Som ao detectar o gesto
│ └── videos/ # VÃdeos gerados
├── docker-compose.yaml # PostgreSQL
├── init.sql # Schema do banco
└── requirements.txt
- Python 3.10+
- Docker Desktop
# 1. Subir o banco de dados
docker-compose up -d
# 2. Instalar dependências Python
pip install -r requirements.txtNa primeira execução o modelo YOLOv8 (~6 MB) é baixado automaticamente.
Em app.py, linha 43, altere o source conforme sua câmera:
| Fonte | Valor |
|---|---|
| Webcam local | 0 |
| IP Cam (DroidCam, iVCam) | 'http://192.168.x.x:4747/video' |
| RTSP | 'rtsp://usuario:senha@192.168.x.x:554/stream' |
python app.pyO terminal exibe o código da partida ao iniciar:
Partida iniciada | Codigo: a3f2c1d4e5b6...
O mesmo código aparece na janela de preview. Para encerrar, pressione q na janela.
- Keypoints utilizados: ombros (5, 6) e pulsos (9, 10) — formato COCO
- Condição:
pulso.y < ombro.ypara ambos os braços simultaneamente - Tempo mÃnimo sustentado: 2 segundos
- Cooldown entre detecções: 5 segundos
Base URL: http://localhost:5000
GET /partida/<codigo>
Resposta:
{
"id": "uuid",
"codigo": "a3f2c1d4...",
"pagamento": false,
"data_inicio": "2025-01-01T10:00:00",
"data_fim": null,
"jogadas": [
{
"id": "uuid",
"partida_id": "uuid",
"path": "20250101100500-uuid.mp4",
"thumbnail": "base64...",
"created_at": "2025-01-01T10:05:00"
}
]
}GET /partida/video/<filename>
| Tabela | Descrição |
|---|---|
partida |
Sessão de jogo (código, data inÃcio/fim, pagamento) |
partida_videos |
Clipes gerados (path, thumbnail base64, timestamp) |
| Técnica | Efeito |
|---|---|
yolov8n-pose (nano) |
Modelo mais leve da famÃlia YOLOv8 |
| Resize para 640px antes da inferência | Reduz custo ~4× vs resolução original |
skip_frames=2 |
Inferência a cada 2 frames |
| Thread de captura separada | Câmera nunca bloqueia o loop principal |
| Fila de 1 slot no detector | Sempre processa o frame mais recente |