DEMONSTRAÇÃO VISUAL Imagens estáticas e dados fictícios. Sem câmeras conectadas e sem gravação no banco.
Monitoramento da faixa 01
Placa do cavalo, código do contêiner e placa do porta-contêiner no mesmo registro.
Visão simultânea 3 CÂMERAS
A exibição das câmeras é independente do recebimento dos resultados OCR.
CONFERÊNCIA UNIFICADA
Passagem em andamento
RASTREABILIDADE
Últimas passagens
Dados persistidos no MariaDB · Horários no fuso da operação
Revisão de exceções
Leituras pendentes de todas as passagens abertas. Atalhos: A aceitar · R rejeitar · C corrigir · J/K próxima/anterior · E evidência.
Histórico de passagens
Consulte as leituras selecionadas, tentativas e evidências.
Agendamentos
Veículos previstos. Ao abrir uma passagem a partir de um agendamento, o OCR é cruzado com o esperado e libera sozinho quando confere.
Indicadores da operação
Taxa de acerto do OCR, aceite automático, tempo de exceção e tempo de passagem, no fuso da operação.
Conexão e captura
Uma fonte por leitura. Credenciais de snapshot ficam apenas no servidor.
Recebimento de leituras
API autenticada por câmera, correlação por UUID, agendamentos e reenvio idempotente.
O motor OCR envia o texto reconhecido. Exibir o vídeo, por si só, não executa reconhecimento. O serviço de visão local (pasta vision/) ou o Tesseract fazem o OCR no servidor.
Trilha de auditoria
Últimas 100 ações. Histórico de conferência preservado no banco.
PRIMEIROS PASSOS
Da captura ao registro.
01 / Configure as três fontes
C1: placa dianteira do cavalo. C2: código na lateral do contêiner. C3: placa traseira do implemento.
USB ou câmera virtual (Camo, OBS) usa permissão do navegador. Câmera IP usa snapshot HTTP, MJPEG ou player de um gateway HLS/WebRTC. Use Testar conexão antes de salvar.
02 / Agende e abra a passagem
Receba agendamentos pela API (ou cadastre no painel). Ao abrir a passagem escolha o agendamento: o esperado passa a ser cruzado com cada leitura.
Uma passagem aberta por vez. Uma câmera nunca cria uma passagem automaticamente.
03 / Leia em rajada
Cada captura envia vários quadros; o motor vota entre eles e corrige confusões típicas (O/0, B/8) respeitando a posição e o dígito verificador. Com Disparo por presença, a rajada sai sozinha quando o veículo para.
O serviço de visão (Python) é o motor preferido; Tesseract é o reserva.
04 / Revise e conclua
Leituras divergentes do esperado, de baixo escore ou inválidas vão para a Revisão, com atalhos de teclado e a imagem que o OCR viu.
Concluir significa encerrar o registro. Não aciona cancela e não significa liberação aduaneira.
FUNÇÕES DO SISTEMA, TELA POR TELA
O que cada botão faz.
Clique em uma área para abrir. Os nomes entre colchetes são os que aparecem na interface.
Operação ao vivo
[Nova passagem]
Abre um registro para um conjunto (cavalo + contêiner + implemento) na faixa. Gera um UUID exclusivo que as três leituras precisam informar — é o que impede misturar veículos. Dá para escolher o sentido (entrada/saída), vincular um agendamento (digite placa, contêiner ou referência e selecione) ou informar manualmente os valores esperados, o motorista (nome e documento; só os 4 últimos dígitos ficam visíveis) e o lacre. Só existe uma passagem aberta por vez.
Cartões de métricas
Passagens hoje (abertas no dia, no fuso da operação), Registros concluídos, Fila de revisão (leituras pendentes de decisão em passagens abertas) e Fontes configuradas (câmeras fora de "não configurada/demo"), com o total de agendamentos em aberto.
Quadro de cada câmera (C1, C2, C3)
Mostra o vídeo/snapshot, a etiqueta de estado (NÃO CONFIGURADA, IMAGEM RECEBIDA, SEM SINAL, USB CONECTADA, DEMO…), o retângulo laranja da ROI (região onde o OCR procura o texto) e, abaixo, a última leitura aceita desta passagem com o chip de cruzamento (Confere, Quase, Diverge), o escore e o número de quadros usados. Se a passagem tem esperado e ainda não há leitura, o quadro mostra "Esperado XXX".
[Capturar + OCR]
Dispara uma rajada: captura N quadros (padrão 6 em 2 s, configurável por câmera) do vídeo que está no navegador (USB/virtual) ou pede ao servidor que busque N snapshots da câmera IP. O motor lê cada quadro, vota por consenso e aplica a correção por posição/DV. O resultado aparece em um aviso: texto lido, motor, quadros, votos, correção e se foi Aceita ou ficou Pendente. Fica desabilitado sem passagem aberta ou sem motor de OCR.
[Conferir]
Conferência manual: o operador digita o valor lido na imagem, informa justificativa obrigatória e pode anexar o quadro atual ou um arquivo como evidência. É registrada como "conferência manual", sem escore de IA, e vale como leitura aceita quando o formato é válido. Para C2 aceita também o código ISO. Não apaga as tentativas anteriores.
[ícone de câmera] no quadro
Atalho para a configuração daquela fonte (só administrador).
[Conectar dispositivo] (modo USB)
Pede permissão de câmera ao navegador e lista os dispositivos de vídeo do computador, inclusive virtuais (Camo, OBS, Iriun). Um dispositivo diferente por posição; a escolha fica salva neste navegador. Exige localhost ou HTTPS.
[Disparo por presença]
Compara quadros reduzidos da imagem várias vezes por segundo. Quando detecta movimento e depois estabilidade (veículo parou), dispara a rajada sozinho para a câmera que ainda não tem leitura na passagem ativa. A barrinha sob cada quadro mostra a atividade; fica laranja acima do limiar. Funciona com USB/virtual e snapshot neste navegador; a sensibilidade é configurada por câmera. Pausa quando a aba está oculta.
[OCR automático]
Enquanto faltar leitura, repete a captura a cada "intervalo OCR" da câmera (só câmeras com "habilitar no OCR automático"). Diferente da presença, não espera o veículo parar: é periódico. Útil para teste e para câmeras fixas com fluxo contínuo.
[Reconectar]
Recria os quadros das três câmeras (snapshot, MJPEG, player). USB pede nova permissão.
Passagem em andamento
Mostra número, sentido, UUID (botão de copiar), progresso 0/3, cada leitura selecionada com o esperado ao lado, código ISO do contêiner, motorista, lacre e se há agendamento. Alertas: pendências na fila, leitura divergente do agendamento, placas iguais entre cavalo e implemento, passagem expirada (15 min sem concluir).
[Dados]
Edita, com a passagem aberta, os valores esperados, motorista, documento, lacre e observação. Alterar o esperado reavalia na hora o cruzamento das leituras já recebidas.
[Concluir registro]
Encerra a passagem. Só habilita com as três leituras selecionadas, nenhuma pendência, placas diferentes entre cavalo e implemento e dentro do prazo. Marca o agendamento como utilizado. Não abre cancela nem representa liberação aduaneira.
[Cancelar]
Cancela a passagem com justificativa (mínimo 5 caracteres). O histórico e as tentativas são preservados; um agendamento vinculado volta a ficar disponível.
[Ver tentativas e evidências]
Abre o detalhe completo: todas as tentativas de cada câmera, estado (aceita/pendente/rejeitada), motor, escore, quadros e votos, texto original e correção, cruzamento com o esperado, imagem de evidência, recorte que o OCR viu e SHA-256 do arquivo.
Últimas passagens
As 10 mais recentes com as três leituras, status e o botão de detalhe. [Ver histórico] leva à tela Passagens.
Chips do topo
OCR · SERVIÇO DE VISÃO / TESSERACT / INDISPONÍVEL indica o motor em uso; API + BANCO CONECTADOS confirma que o painel está falando com o servidor (atualiza a cada ~2 s).
Revisão
Fila (coluna esquerda)
Todas as leituras pendentes de passagens ainda abertas, da mais antiga para a mais nova, com câmera, texto, chip de cruzamento, escore e horário. O número no menu lateral é o tamanho da fila.
Painel de decisão
Lado a lado: LIDO (com os caracteres diferentes do esperado em vermelho) e ESPERADO; chips com motor, escore, quadros e validade de formato/DV; a mensagem de validação; os votos da rajada; o texto original e quantas outras tentativas aquela câmera já fez. Abaixo, o quadro de evidência e o recorte que o OCR viu.
[Aceitar] (tecla A ou Enter)
Seleciona a leitura para a passagem, com justificativa. Indisponível quando o formato/DV é inválido — nesse caso use Corrigir.
[Rejeitar] (tecla R)
Descarta a tentativa com justificativa. Se ela estava selecionada, a posição volta a ficar vazia.
[Corrigir] (tecla C)
Abre a conferência manual já preenchida com o esperado (ou com o lido), para o operador registrar o valor correto como nova leitura.
Outros atalhos
J/K próxima/anterior, E abre a evidência em nova aba, / foca a justificativa. [Atualizar fila] recarrega.
Por que uma leitura cai aqui
Escore abaixo do mínimo da câmera sem bater com o esperado; divergência ou diferença de 1 caractere em relação ao agendamento; formato/DV inválido; correção automática sem confirmação pelo esperado; leitura diferente de uma já selecionada para a mesma posição.
Passagens (histórico)
Busca
Por placa, contêiner (normalizados, sem traço/espaço), nome do motorista ou UUID; filtro por status: Em leitura, Em revisão, Pronto para concluir, Concluído, Cancelado. 25 por página.
Tabela
Número, horário, sentido, motorista, as três leituras selecionadas (≠ marca divergência do agendamento) e status. O olho abre o detalhe com tentativas e evidências.
[Exportar CSV]
CSV UTF-8 separado por ponto e vírgula com UUID, sentido, status, abertura/fechamento (UTC) e as três leituras, por período de até 366 dias. Valores que começam com =, +, -, @ são neutralizados contra injeção de fórmula em planilhas. A exportação fica na auditoria.
Agendamentos
O que é
A lista de veículos previstos. É o "esperado" que o OCR cruza: leitura igual libera sozinha; diferente vai para revisão. Pode vir de um TMS/sistema do cliente pela API ou ser cadastrado aqui.
[Novo agendamento]
Referência única, sentido, placa do cavalo, contêiner, placa do implemento (ao menos um; formatos validados, incluindo o DV do contêiner), transportadora, motorista e documento (mascarado), janela de horário. A mesma referência atualiza o registro.
Lista e filtros
Busca por referência, placa, contêiner ou motorista; filtro Agendados / Utilizados / Cancelados. Status: agendado (disponível), utilizado (uma passagem foi aberta a partir dele, número exibido) e cancelado.
[ícone de caminhão]
Abre a passagem já com este agendamento selecionado (desabilitado se já existe passagem aberta).
[X]
Cancela o agendamento. Não é possível cancelar um já utilizado.
Integração
O rodapé da tela mostra o endpoint e o JSON do POST ?action=appointment (token de escopo gate), o envio em lote e a consulta. Detalhes em docs/API.md.
Indicadores
Período
Datas no fuso da operação; padrão últimos 30 dias. [Aplicar] recalcula.
Hit rate do OCR
Leituras automáticas (não manuais) com formato/DV válido ÷ total de leituras automáticas. Mede a qualidade bruta do motor + câmera.
Aceite automático
Leituras automáticas aceitas sem intervenção ÷ leituras automáticas. É o que reduz trabalho do operador; sobe com agendamento e com escore alto.
Tempo médio de exceção
Do recebimento da leitura até a decisão do operador na revisão.
Turn time
Da abertura à conclusão da passagem; "pronto em" é o tempo até as três leituras ficarem confirmadas.
Demais cartões
Passagens (concluídas/canceladas), % com agendamento, % de conferência manual, % de leituras com evidência de imagem.
Por câmera / por motor
Volume, hit rate, aceite automático, rejeitadas, escore médio e quadros médios por câmera; e o mesmo por motor (serviço de visão, Tesseract, API externa, manual). "Cruzamento com agendamento" conta confere/quase/diverge e correções automáticas.
Passagens por dia
Barras: altura = abertas no dia; parte verde = concluídas.
Câmeras
Diagnóstico
Chips de PHP (alerta abaixo de 8.2), PDO, cURL, GD (necessário só para o Tesseract), Tesseract, Serviço de visão (versão e motores), migrações pendentes e retenção de evidências. [Testar serviço de visão] consulta o /health na hora.
[Configurar fonte] → Visualização
Snapshot HTTP(S) via servidor: o PHP busca a imagem (IP precisa estar em camera_hosts; usuário/senha ficam cifrados no servidor). MJPEG direto: o navegador carrega o fluxo. Player externo: iframe de um gateway HLS/WebRTC (RTSP não funciona direto). USB ou virtual: webcam, Camo, OBS. Ilustração: imagem fixa de demonstração. Não configurada.
ROI (X, Y, largura, altura em %)
Região da imagem onde o texto é procurado. Com o serviço de visão a placa é localizada sozinha e a ROI só restringe a busca; com Tesseract a ROI é essencial. Aparece como retângulo laranja no quadro.
Escore mínimo
Confiança (0–100) a partir da qual uma leitura válida é aceita sem revisão. Uma leitura igual ao agendamento é aceita mesmo abaixo dele.
Rajada: quadros e duração
Quantos quadros cada captura envia e em quanto tempo. Mais quadros = mais robustez e mais tempo de processamento.
Período de renovação do snapshot no quadro; período do OCR automático; limiar do disparo por presença (maior = dispara com menos movimento).
[Habilitar no OCR automático]
Inclui a câmera no OCR automático do painel e no worker.
[Disparo por presença no worker]
Faz o worker (sem navegador) detectar presença por snapshots e disparar a rajada.
[Testar conexão]
Antes de salvar: snapshot é buscado pelo servidor (tempo, tamanho, prévia); MJPEG é carregado pelo navegador; player mostra prévia; USB lista os dispositivos e marca os virtuais.
Integrações
[Gerar token]
Cria um token de API mostrado uma única vez. Escopo camera (um por C1/C2/C3): só envia leituras daquela câmera. Escopo gate (coordenador): abre/conclui/cancela passagens, gerencia agendamentos e consulta fila e indicadores. O banco guarda apenas o hash.
Tabela de tokens
Nome, prefixo, escopo, último uso e [Revogar] (imediato).
Endpoints
A tela mostra o POST ?action=reading com o JSON esperado (event_id único, passage_id, texto, escore, horário com fuso, imagem opcional, motor, código ISO) e os endpoints do coordenador. Reenvio idêntico é idempotente; event_id reutilizado com outro conteúdo é rejeitado.
Auditoria
Trilha
Últimas 100 ações com horário UTC, ator (usuário, token ou worker), ação e detalhes em JSON: login, abertura/conclusão/cancelamento, recebimento e revisão de leituras, configuração de câmera, teste de conexão, tokens, agendamentos, exportação CSV, visualização de evidência, migrações e expurgo de imagens. Tudo fica no banco; a tela mostra só as recentes.
Menu, status e bastidores
Menu lateral
O botão redondo na borda recolhe o menu para só ícones (a preferência fica salva neste navegador). O número ao lado de Revisão é a fila pendente.
Status da passagem
Em leitura (faltam leituras), Em revisão (há pendência ou placas iguais), Pronto para concluir (três leituras confirmadas), Concluído, Cancelado. Passagem sem conclusão em 15 minutos expira para novas leituras.
Estados de uma leitura
Aceita (selecionada para a posição), Pendente (aguarda decisão), Rejeitada. Cruzamento: Confere, Quase (1 caractere), Diverge, ou sem esperado.
Correção automática
Troca só confusões típicas na posição em que não cabem (letra onde se espera dígito e vice-versa). No contêiner, se o dígito verificador não fecha, apenas o próprio DV é corrigido e só quando o lido é uma confusão plausível. Toda correção é registrada e exibida.
Serviço de visão
Programa Python local (pasta vision/): detector de placa + OCR em CPU. Inicie com iniciar-visao.bat ou instale como serviço. Sem ele, o PHP usa Tesseract (precisa de GD) e a qualidade cai bastante.
Worker
iniciar-worker.bat / instalar-worker-servico.bat: faz rajada e presença em câmeras snapshot sem precisar do navegador aberto.
Evidências
Imagens ficam fora da pasta pública, com SHA-256 verificado a cada visualização. evidence_retention_days + tools/purge_evidence.php apagam os arquivos antigos mantendo o registro e o hash.
Escopo desta versão: uma faixa, um cavalo, um contêiner e um implemento por passagem. Sem integração com API Recintos, retenção certificada de vídeo ou homologação da Receita Federal. Não substitui o sistema completo de um recinto alfandegado.
Guias técnicos, SQL, exemplos de integração e instruções de instalação estão na pasta docs/ do projeto.