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

 

============================================================================ 

Código Fonte 

============================================================================