| .gitignore | ||
| assign_cells.py | ||
| clean_csv_heuristics.py | ||
| extract_frames_and_tables.py | ||
| fix_all_csvs.py | ||
| flake.nix | ||
| README.md | ||
| requirements.txt | ||
| row_eq.py | ||
| run.sh | ||
| sew_csvs.py | ||
| svg_columns.py | ||
| template.svg | ||
Extração de Tabelas de Vídeo com Scroll
Sistema automatizado para extrair tabelas de vídeos de gravação de tela que contêm tabelas com scroll vertical. Utiliza OCR em português, alinhamento baseado em template SVG e mesclagem inteligente para gerar um CSV final deduplicado.
Visão Geral
Este projeto processa vídeos de gravação de tela que contêm tabelas com scroll, extraindo os dados através de:
- Amostragem de frames: Extrai frames do vídeo em intervalos regulares
- OCR: Reconhece texto em português em cada frame
- Alinhamento: Usa um template SVG para identificar colunas e linhas
- Correção heurística: Aplica correções automáticas nos dados extraídos
- Mesclagem e deduplicação: Combina todos os frames e remove duplicatas
Requisitos
- Python 3
- OpenCV (opencv4)
- NumPy
- Tesseract OCR (com suporte a português)
- FFmpeg
- Nix (para ambiente isolado, opcional)
Estrutura do Projeto
Arquivos de Entrada
| Arquivo | Descrição |
|---|---|
video-data.webm |
Vídeo fonte contendo a tabela com scroll vertical |
template.svg |
Template de anotação: retângulos vermelhos definem as colunas (6 colunas), retângulos azuis definem as linhas (28 linhas) |
Arquivos de Saída
| Arquivo/Diretório | Descrição |
|---|---|
result.csv |
Tabela final com 6 colunas: Concessionária, Código, Rodovia/UF, km inicial, km final, Extensão. Uma linha por segmento, deduplicada. |
frames/ |
Diretório de trabalho: contém um PNG e um CSV por frame amostrado (ex: 0, 10, 20, 30, ...) |
llm-fixed-frames/ |
Diretório opcional: cópias dos CSVs dos frames após correções manuais ou via LLM. Use este diretório como entrada para sew_csvs.py se fizer correções manuais |
Uso Rápido
Execução Automatizada Completa
Para executar todo o pipeline (extração → correção → mesclagem → resultado):
nix-shell -p python3 python3Packages.opencv4 python3Packages.numpy python3Packages.pytesseract tesseract ffmpeg --run "./run.sh"
Ou com vídeo e diretório de saída customizados:
./run.sh caminho/para/video.webm meu_diretorio_frames
# result.csv será escrito na raiz do projeto
Fluxo com Correções Manuais
Se você precisar corrigir manualmente os CSVs extraídos:
-
Copie os CSVs do diretório
frames/parallm-fixed-frames/:cp frames/*.csv llm-fixed-frames/ -
Edite os arquivos CSV em
llm-fixed-frames/conforme necessário -
Execute apenas a mesclagem usando o diretório corrigido:
python3 sew_csvs.py llm-fixed-frames result.csv
Scripts do Projeto
Scripts Principais
| Script | Função |
|---|---|
extract_frames_and_tables.py |
Extrai frames do vídeo a cada N frames, salva como PNG, executa OCR em português, alinha texto às colunas/linhas do template SVG e gera um CSV por frame |
fix_all_csvs.py |
Aplica correções heurísticas nos CSVs dos frames: remove espaços, converte "E" em "-", substitui pipes por espaços, calcula extensão a partir dos km |
sew_csvs.py |
Mescla os CSVs dos frames em ordem, remove sobreposição nas bordas, deduplica linhas completas e escreve o resultado final |
Scripts Auxiliares
| Script | Função |
|---|---|
svg_columns.py |
Parse dos retângulos de colunas e linhas do template.svg |
assign_cells.py |
Mapeia caixas de palavras para células (col, row); mescla texto das células (col1 sem espaço, outras com espaço) |
clean_csv_heuristics.py |
Limpeza por linha e correção de extensão (usado por fix_all_csvs.py) |
row_eq.py |
Função de igualdade de linhas para a mesclagem |
Fluxo de Processamento
O pipeline completo segue estas etapas:
- Extração de Frames:
extract_frames_and_tables.pyamostra o vídeo a cada 10 frames (padrão) e salva como PNG - OCR e Alinhamento: Para cada frame, executa OCR em português e alinha o texto às colunas/linhas definidas no
template.svg - Correção Heurística:
fix_all_csvs.pyaplica correções automáticas nos dados extraídos - Mesclagem:
sew_csvs.pycombina todos os CSVs, remove sobreposições e deduplica linhas completas - Resultado Final: Gera
result.csvcom todos os dados consolidados
Reiniciar do Zero
Para executar uma nova extração do zero:
- Delete ou limpe os diretórios
frames/ellm-fixed-frames/(se existirem) - Execute
./run.sh(ou o fluxo de correção manual descrito acima)
Nota: result.csv é sobrescrito a cada execução.
Estrutura das Colunas
O CSV final contém 6 colunas:
- Concessionária: Nome da concessionária
- Código: Código identificador
- Rodovia/UF: Rodovia e estado
- km inicial: Quilômetro inicial do segmento
- km final: Quilômetro final do segmento
- Extensão: Extensão calculada (km final - km inicial)