jueves, 17 de junio de 2010

Implementando una técnica simple de Backgroung Subtraction

Vamos a intentar una implementacion simple de esta técnica. Para ello tomaremos como modelo de Background el primer frame de la secuencia de video. La idea es ir generando imágenes binarias en las que los objetos del primer plano toman el valor 1 y se diferencian del fondo que toma valor 0.
La imagen de fondo If se comparará pixel a pixel con los frames consecutivos Ii, obteniendo una nueva imagen que representará el foreground con los siguientes valores en sus pixeles:


Teniendo en cuenta que la ecuación anterior, con condiciones reales no sería aplicable debido al ruido que aparece en las imágenes del video, se introduce el concepto del umbral, que discernirá entre fondo y primer plano:

El pseudocódigo del algoritmo quedaría entonces como :



En esta primera aproximación tendremos en cuenta dos cuestiones:

1- Conversión de los frames a escala de grises.

Para hacer está implementación, lo que se suele hacer es pasar la representación en RGB de los pixeles de los frames, a una representación en escala de grises. Un pixel con una representación RGB, contiene información sobre las 3 componentes de color: rojo , verde y azul. La idea es pasar esta información a escala de grises, donde por cada pixel solo almacenamos el valor del nivel de intensidad, que va de 0 a 255, asi la información a procesar sería menos. La fórmula para la transformación sería, para cada pixel :

2- Presentación de los resultados:

La librería OpenCV contiene una parte relacionada con el uso de GUI's (highgui) que vamos a usar para estas primeras pruebas. Como comenté en posta anteriores, básicamente te la la opción de crear una ventana, mediante la función cvNamedWindow, donde podrás mostrar una imagen usando la función cvShowImage .Estas funcionalidades son muy útiles para labores de investigación como la que nos ocupa, para así no preocuparte por la parte del interfaz. Más adelante, para complicarnos un poco más la vida, trataremos de integrar todo esto en la interfaz que generamos con WxWidgets.

En este caso mostraremos en nuestro interfaz el video original, y en las ventanas generadas con OpenCV, la imagen en escala de grises y la diferencia con el modelo de fondo.




Evidentemente la técnica anterior, al ser la más simple, el calculo computacional es más rápido, pero a la vez tiene un gran número de desventajas, como por ejemplo que depende enormemente de la elección del umbral, ya que con un umbral alto se pierde información y con uno bajo se introduce mucho ruido. También afecta la velocidad de los objetos en movimiento, ya que con objetos muy rápidos con respecto al frame rate, no funcionaría correctamente.

A continuación adjunto una comparativa donde podemos observar como afecta la elección del umbral en la detección de objetos en movimiento:

Imagen original



Umbral = 25



Umbral = 100




No hay comentarios:

Publicar un comentario