Objetivo:
O objetivo do trabalho é fazer a detecção de movimento através da subtração do fundo. Para isso foi utilizada a biblioteca openCV criada pela Intel. O programa recebe um stream de vídeo (a partir de um arquivo ou webcam) e faz a segmentação do fundo em relação aos objetos dinâmicos da cena. Com isso o programa identifica os objetos em movimento na cena.
Implementação:
O programa consiste nas seguintes etapas:
1)
Criação de duas janelas, uma com o vídeo de entrada e outra com o resultado do
vídeo de saída. O diálogo de entrada contém um “slider” para controlar um valor
de “threshold”.
2)
Treinamento das características do fundo usando-se n frames iniciais. A
quantidade
de frames ideal para um treinamento depende do vídeo de entrada. Nesse
trabalho foram usados os 30 frames iniciais para se fazer o
treinamento. Para tirar a média dos frames do treinamento soma-se os
pixels da posição (x,y) canal a canal e depois os divide pelo número de
frames. Faz isso para todas as posições (x,y) da imagem. O resultado é
armazenado em uma nova imagem.
3)
Após a fase de treinamento, cada pixel x de um novo frame de entrada Ii(x)
deverá sofrer uma segmentação em relação a média B(x) em relação à um “threshold”
qualquer t (controlado pelo “slider” da janela), respeitando a equação abaixo:
Ii(x) – B(x) > T
4) Os pixels que satisfazem a equação devem ser pintados de branco (movimento), caso contrário são pintados de preto (fundo).
5)
Aplicam-se filtros de ruído e morfológicos com o objetivo de se melhorar os
resultados obtidos.
- Filtro de mediana: diminui o ruído da imagem.
- Filtro de Closing: fecha vales e buracos.
- Filtro de Opening: abre vales e estreitos.
- Filtro de Erode: elimina detalhs irrelevantes.
- Filtro de Dilate: aumenta os objetos.
Todos
os filtros acima foram testados, no entanto apenas o filtro de mediana
e closing apresentaram melhoras significativas nos resultados sem que o
desempenho do programa fosse afetado.
6) Encontram-se os contornos ativos e os exibe na janela de resultados. As funções usadas para esse fim foram cvFindContours e cvDrawContours.
Resultados:


Figura1: segmentação de fundo

Figura2: segmentação de fundo sem filtro de closing

Figura3: segmentação de fundo com filtro de closing
============================================================================
============================================================================

