lunes, 4 de noviembre de 2013

Detección de peatones mediante Matlab/Simulink



Una buena opción para ganar tiempo y comprobar rápidamente alguna funcionalidad relacionada con la visión artificial es usar Matlab/Simulink. En muchos aspectos prefiero Python para estas tareas, aunque he de reconocer que con Matlab las cosas son incluso aún más rápidas. He trabajado varios años en simulación, empleando Matlab y Simulink con más o menos intensidad y el entorno me gusta. El descubrimiento de las funciones y los toolbox de visión por computación que incorpora Matlab fue un grato descubrimiento en su día.

En esta entrada voy a explicar como detectar peatones moviéndose y realizar tracking de los mismos de forma sencilla. Para ello he empleado un vídeo que viene de ejemplo en Matlab pero he resuelto el problema de dos formas, a continuación explico como he realizado el trabajo en cada una de ellas:

A. Restando un background a cada frame.

Básicamente el algoritmo se divide en tres partes:
  1. Capturar el fondo y extraer todo aquello que no pertenece al mismo.
  2. A continuación se realiza un estudio estadístico para conectar las regiones de la matriz binaria (Blob Analysis). 
  3. Finalmente se dibujan rectángulos en las regiones calculadas en el paso 2.
  
A continuación describiré como realizar estos pasos mediante bloques de Simulink. 


  1. Primeramente extraemos los frames de un vídeo mediante el bloque adecuado (From multimedia file) y a continuación, mediante un switch, tomamos la matriz del frame correspondiente al final del primer segundo. En este segundo no ocurre nada de interés, por lo que puede considerarse como el background de la escena. Luego restamos este background a cada frame de la escena y le aplicamos el valor absoluto al resultado.
     
  2. A continuación, aplicamos un bloque Media filter, esto es, un filtro de la mediana que sustituye el valor del píxel por la mediana de los vecinos más próximos. Con esto logramos eliminar ruido sin perder excesiva nitidez. Seguidamente aplicamos un bloque Closign, que realiza una dilatación y una erosión. Para finalizar metemos un bloque Autothreshold que convierte en binaria la imagen, transformando los píxeles a valor cero (o uno, según se considere) cuando su valor no superan un umbral.
  3. Luego, mediante un bloque Blob Analysis, se hace un análisis estadístico para conectar regiones cercanas en una imagen binaria. Finalizamos dibujamos rectángulos sobre las regiones y visualizamos el resultado.

El método explicado anteriormente funciona relativamente bien, pero requiere de ajustes más finos en las constantes para que no se den falsos positivos, pero es una buena forma de ilustrar aquellos métodos que restan el background. Se pueden lograr resultados más efectivos empleando un camino alternativo, camino que explico a continuación.


B. Usando un bloque Optical Flow

  1. Se sustituye el bloque que calcula el fondo y los resta a cada frame, por un bloque que obtiene la dirección y la velocidad de los objetos que se mueven entre un frame y otro (Optical flow). A continuación, se calcula la media de toda la matriz y seguidamente se realiza una media en el tiempo obteniendo un único valor. Este valor se compara con la velocidad de cada píxel. El resultado es una matriz binaria que describe el movimiento. 
El resultado es el siguiente:




No hay comentarios:

Publicar un comentario