Segmentação de Escrita Ricardo Costa [email protected] Objetivo • Receber um vídeo de entrada • Separar: – Fundo – Objetos permanentes (escrita) – Objetos transitórios • Exibir apenas a escrita na saída • Em tempo real Implementação • Feito com OpenCV • Treinamento – Detecta o fundo – Fundo = média dos N primeiros quadros do vídeo • Segmentação – Assume que a escrita permanece estática por um tempo maior que os objetos em transição – Captura apenas as diferenças estáticas em relação ao fundo Implementação • Guarda 25 quadros anteriores numa fila – Buffer circular (vetor) funcionando como fila – Podem ser quadros espaçados no tempo (ex. captura 1 a cada 5 quadros de entrada) – Para cada canal de cor: 1. Insere novo pixel na fila. Se for igual ao que foi removido da fila, não faz mais nada. 2. Substitui pixel antigo no buffer de cálculo de mediana. 3. Calcula mediana com algoritmo otimizado. Algoritmos de Mediana • Não é necessário ordenar! – Basta o elemento do meio estar em sua posição correta – Algoritmo de Wirth • 25x mais rápido que usar qsort() • Outros algoritmos – Quick select – Método de Torben Algoritmo Melhor Ainda • Versões para 3, 5, 7, 9 ou 25 elementos • Faz o número mínimo de operações para se obter a mediana daqueles elementos • Citado no livro Graphic Gems typedef float pixelvalue ; #define PIX_SORT(a,b) { if ((a)>(b)) PIX_SWAP((a),(b)); } #define PIX_SWAP(a,b) { pixelvalue temp=(a);(a)=(b);(b)=temp; } pixelvalue opt_med5(pixelvalue * p) { PIX_SORT(p[0],p[1]) ; PIX_SORT(p[3],p[4]) ; PIX_SORT(p[0],p[3]) ; PIX_SORT(p[1],p[4]) ; PIX_SORT(p[1],p[2]) ; PIX_SORT(p[2],p[3]) ; PIX_SORT(p[1],p[2]) ; return(p[2]) ; } Segmentação Se abs(medianaR - fundoR) > threshold ou abs(medianaG - fundoG) > threshold ou abs(medianaB - fundoB) > threshold Então outR = 255 - abs(medianaR - fundoR) outG = 255 - abs(medianaG - fundoG) outB = 255 - abs(medianaB - fundoB) Senão outR = outG = outB = 255 • Otimizado para quadro branco ou negro – Gera o maior contraste possível para estes casos Resultado