10/12/07

Detección de movimiento y actualización de fondos

Bueno, tras unos cuantos días que he estado malillo, por fin actualizo el blog con las cosas que hice antes y ahora:

2, 3 y 4 de diciembre.

En esta ocasión a las funciones de detección de movimiento descritas en la entrada anterior, he añadido la función
CvSeq* cvSegmentMotion( const CvArr* mhi, CvArr* seg_mask, CvMemStorage* storage,
double timestamp, double seg_thresh );

que a partir del historial creado con las funciones anteriores crea una estructura que almacena una secuencia de zonas de la imagen que se están moviendo en ese momento. Con esto he vuelto a aplicar la función que me da la dirección del movimiento pero en esta ocasión una vez por cada elemento de la secuencia y los he marcado en la imagen con un circulo y una línea indicando la dirección del movimiento como se puede ver en este vídeo:



9 y 10 de diciembre.

Por otra parte he cogido el ejemplo de actualización de fondos que probé anteriormente y lo he aplicado a mi código utilizando las funciones cvCreateFGDStatModel y cvUpdateBGStatModel de las cuales no he encontrado documentación alguna en los manuales ni en la wiki, parece como si no existieran, pero que compilan y funcionan.

Al actualizar el fondo con este método he podido comprobar como la velocidad del programa se hace insostenible, ya que tarda muchísimo en actualizarse el fondo, pero por otra parte los resultados obtenidos me han parecido muy interesantes para mis propósitos por lo que he decidido intentar hacer un "apaño".

Se me ha ocurrido que al actualizar el fondo no es tan vital que se haga continuamente, por lo que he decidido actualizarlo cada cierto número de frames para evitar que se ralentice el proceso en exceso. De esta forma he conseguido unos resultados mejores de los previstos, ya que se ha reducido el ruido que capta con el paso de la gente en el vídeo de la estación. Haciéndolo cada 50 frames si que me aparecían figuras oscuras con el paso de algunas personas, pero haciéndolo cada 100 frames prácticamente solo se aprecian cambios en la imagen cuando alguien se queda un rato en la misma posición y cuando se abandona un objeto.

Este es el resultado:


En el vídeo, aunque se ve un poco pequeño y mal se puede ver como solo cambia la imagen de la derecha(que es el background) cuando se queda quieto el chico de la mochila y cuando deja la mochila. Pero en el caso del chico como no se queda completamente quieto mucho tiempo no deja un rastro completamente sólido, al contrario que ocurre con la mochila.

Tras esto creo que ya tengo todas las herramientas para empezar a implementar un filtro de partículas.