§1O problema
Um celular só não pega o campo inteiro. Com dois, é preciso alinhar no tempo e na imagem, costurar sem emenda visível e ainda decidir para onde apontar a câmera sem ninguém operando.
§2O que eu construí
- SincroniaOs dois celulares são sincronizados pelo som.
- CosturaCalibração de lentes e ângulo pela imagem e costura em panorama cilíndrico, com correção de cor.
- Câmera virtualDetecção da bola por YOLO e trilha da bola; câmera virtual com zoom e suavização que olha adiante.
- CLIEtapas retomáveis (cada etapa grava seu arquivo) e progresso em JSON para os apps acompanharem.
- RefazerComando para refazer só a câmera com outro zoom.
§3As partes difíceis
5 itens- 01
Velocidade
O panorama foi de 37-46 para cerca de 120 quadros/s; o gargalo era o loop esperar a placa de vídeo a cada quadro.
- 02
Deriva de sincronia entre os relógios dos celulares
Cerca de 140 ppm, corrigida por janelas medidas ao longo do jogo.
- 03
Paralaxe e emenda
Medição da diferença na faixa comum e correção só perto da emenda.
- 04
Armadilhas numéricas
Inversão de lente que dobra e valores infinitos virando NaN nas faixas pretas.
- 05
Orientação e limite do codificador
A orientação de cada celular vem do marcador do app, não só da grama; o limite de 4096 px do H.264 na placa foi resolvido com HEVC.
§4Resultado
- quadros/s no panorama (era 37-46)
- ~120
- deriva de relógio corrigida entre celulares
- ~140 ppm
- de detecção por jogo
- ~1h10
Roda na placa de vídeo do meu computador: panorama a cerca de 120 quadros/s com 2 câmeras, e a detecção leva ~1h10 de processamento por jogo. Outros apps chamam a ferramenta do mesmo jeito que chamariam o ffmpeg.
§5Stack
- Python
- PyTorch (CUDA)
- YOLO11 (ultralytics)
- OpenCV (SIFT)
- ffmpeg com NVENC
- HEVC