No description
Find a file
2026-02-04 22:35:14 -03:00
.gitignore chore: init 2026-02-04 21:11:16 -03:00
assign_cells.py chore: init 2026-02-04 21:11:16 -03:00
clean_csv_heuristics.py chore: init 2026-02-04 21:11:16 -03:00
extract_frames_and_tables.py chore: init 2026-02-04 21:11:16 -03:00
fix_all_csvs.py chore: init 2026-02-04 21:11:16 -03:00
flake.nix chore: init 2026-02-04 21:11:16 -03:00
README.md feat: add proper README 2026-02-04 22:35:14 -03:00
requirements.txt chore: init 2026-02-04 21:11:16 -03:00
row_eq.py chore: init 2026-02-04 21:11:16 -03:00
run.sh chore: init 2026-02-04 21:11:16 -03:00
sew_csvs.py chore: init 2026-02-04 21:11:16 -03:00
svg_columns.py chore: init 2026-02-04 21:11:16 -03:00
template.svg chore: init 2026-02-04 21:11:16 -03:00

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:

  1. Amostragem de frames: Extrai frames do vídeo em intervalos regulares
  2. OCR: Reconhece texto em português em cada frame
  3. Alinhamento: Usa um template SVG para identificar colunas e linhas
  4. Correção heurística: Aplica correções automáticas nos dados extraídos
  5. 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:

  1. Copie os CSVs do diretório frames/ para llm-fixed-frames/:

    cp frames/*.csv llm-fixed-frames/
    
  2. Edite os arquivos CSV em llm-fixed-frames/ conforme necessário

  3. 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:

  1. Extração de Frames: extract_frames_and_tables.py amostra o vídeo a cada 10 frames (padrão) e salva como PNG
  2. OCR e Alinhamento: Para cada frame, executa OCR em português e alinha o texto às colunas/linhas definidas no template.svg
  3. Correção Heurística: fix_all_csvs.py aplica correções automáticas nos dados extraídos
  4. Mesclagem: sew_csvs.py combina todos os CSVs, remove sobreposições e deduplica linhas completas
  5. Resultado Final: Gera result.csv com todos os dados consolidados

Reiniciar do Zero

Para executar uma nova extração do zero:

  1. Delete ou limpe os diretórios frames/ e llm-fixed-frames/ (se existirem)
  2. 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)