Programa para segmentar o fundo estático de um vídeo

Download

Requer MS Visual Studio 2005 e OpenCV 1.0.

Neste trabalho, deve ser criado um programa que recebe um stream de vídeo (a partir de um arquivo ou vindo de uma webcam) e faz a segmentação do fundo em relação aos objetos dinâmicos da cena. Ou seja, o programa deve ser capaz de detectar os objetos em movimento ao longo do vídeo. A biblioteca OpenCV é utilizada para leitura do stream de vídeo.

Para detectar as características do fundo da cena, é calculada a média ou mediana dos primeiros N frames do vídeo de entrada, onde N é dado pelo slider "treino" na janela de input. Um valor de 100 mostrou-se razoável para a maioria dos vídeos testados. A média e a mediana são adaptativas, o que significa que objetos que permanecerem parados por um determinado período passarão a fazer parte do fundo.

Para o cálculo da mediana, uma árvore ordenada por valor (std::multiset) é criada em cada pixel contendo os valores dos N últimos frames. Paralelamente, uma fila guarda estes mesmos valores na ordem em que seus respectivos frames foram apresentados. Percorrendo-se a árvore ordenadamente a partir do menor valor até o nó N/2, obtém-se o valor da mediana. A atualização da mediana é feita periodicamente, obtendo-se o valor no início da fila e removendo-o dela e da árvore, com a posterior inserção do novo valor nestas estruturas.

O vídeo de entrada passa então pelos seguintes processos:

1. Redução de Ruído

O frame de entrada é convertido para o formato grayscale de 8-bit. Em seguida, um filtro gaussiano com kernel 5x5 é aplicado para reduzir o ruído da imagem.

2. Segmentação

Cada pixel x do frame de entrada I é comparado com a média ou mediana B(x) calculadas na fase de treinamento. Se a diferença absoluta for maior que o threshold t, controlado pelo slider na janela, o pixel é considerado como "em movimento" e é pintado de branco na imagem de saída, caso contrário é pintado de preto.

Condição de movimento: | I(x) - B(x) | > t

3. Filtro Morfológico

Para remover pontos de ruído na imagem de saída, aplica-se o filtro morfológico Open, que consiste num Erode seguido de Dilate. O Erode faz com que os pontos desapareçam, enquanto que o Dilate recompõe os objetos válidos que foram danificados pelo Erode.

4. Contornos

Os contornos da imagem de saída são calculados por aproximação. Para que os contornos fiquem mais suaves, o filtro Dilate é aplicado internamente antes da busca de contornos, sendo descartado para a exibição da imagem final.

Os contornos encontrados são exibidos tanto na imagem de saída quanto na de entrada, para facilitar a identificação dos objetos em movimento na cena.

Comentários sobre desempenho:

Os resultados para o algoritmo de média são bons, sendo executado em tempo real. O cálculo de medianas é mais lento, ficando ligeiramente abaixo do tempo real do vídeo. Para melhorar o desempenho, a biblioteca OpenMP da Intel foi utilizada para paralelizar o processamento da média e mediana a cada quadro em processadores de vários núcleos.

Ainda assim, seria possível melhorar mais o desempenho do cálculo de medianas. Atualmente, seu principal gargalo é a estrutura std::multiset utilizada, que aloca/desaloca dinamicamente blocos de memória do heap sempre que um nó é inserido ou removido. Um enorme ganho de desempenho seria conseguido com o uso de memória pré-alocada (pool), mas não houve tempo suficiente para implementar este recurso.


Voltar ao índice