3.5 SDVA Detector de moviendo con Python y OpenCV


En muchas aplicaciones basadas en la visión artificial, se utiliza la detección de movimiento. Por ejemplo, cuando queremos contar las personas que pasan por un determinado lugar o cuántos coches han pasado por un peaje. En todos estos casos, lo primero que tenemos que hacer es extraer las personas o vehículos que hay en la escena.

Existen diferentes técnicas, métodos o algoritmos que posibilitan la detección de movimiento. Al igual que en otras materias, en la visión artificial no hay casos genéricos. Dependerá de cada situación usar uno u otro. En este artículo te voy a mostrar 4 métodos para hacer la detección de movimiento con OpenCV y Python.

Los métodos que te voy a explicar a continuación están basados en la substracción del fondo, una técnica muy común en la detección de movimiento.

El objeto de este artículo no es entrar en detalle en la base matemática y científica que hay detrás de esta técnica. En el mundo en el que vivimos, el tiempo es un bien preciado. Voy a intentar ser práctico y te voy a dar los fundamentos de la sustracción de fondo y como utilizar esta técnica para la detección de movimiento con OpenCV y Python.

Substracción de fondo

La substracción de fondo consiste en tomar una imagen de la escena sin movimiento y restar los sucesivos fotogramas que vamos obteniendo de un vídeo. A la imagen sin movimiento se le llama fondo o segundo plano (background en inglés). El fotograma que vamos a analizar sería el primer plano (foreground en inglés). Por lo tanto, tenemos un fondo al que vamos restando los diferentes fotogramas.

 

El resultado, como ves en la imagen, es una escena con fondo negro. Donde se detecta movimiento, el color es diferente. Es una técnica muy sencilla. No requiere que el sujeto u objeto que se está intentando detectar deba tener algo que lo identifique como un sensor, baliza o traje especial. Por el contrario, la substracción de fondo es muy sensible a los cambios de iluminación como las sombras o los cambios producidos por la luz natural. Otra desventaja es que si el sujeto u objeto tiene un color parecido al del fondo, o no se detecta el movimiento o se detecta mal.

Dentro de la técnica de la substracción de fondo, existen dos modalidades. Dependerá de cómo se obtiene el fondo o segundo plano, con imagen de referencia o con fotogramas anteriores.

Substracción con imagen de referencia

Esta modalidad consiste en tener una imagen de referencia donde no haya ningún objeto en movimiento. A partir de esta imagen se obtienen los elementos en movimiento restando cada fotograma con la imagen de referencia. Normalmente se coge el primer fotograma de una secuencia de vídeo.

Es muy sensible a los cambios de luz. Imagínate que tomas la imagen de referencia en una habitación con luz natural. A las 10:00 de la mañana habrá unas condiciones de luz. Pero a las 18:00 de la tarde habrá otras. También es muy sensible a los movimientos de la cámara. Un movimiento muy pequeño puede hacer que se detecten falsos positivos en la escena. Por el contrario, este método funciona muy bien en entornos con iluminación controlada y detecta perfectamente la silueta de los objetos en movimiento.

Substracción con fotogramas anteriores

En esta modalidad, el fondo o segundo plano se obtiene de los fotogramas anteriores. La técnica consiste en tomar una imagen de referencia, dejar pasar un tiempo aplicando un retardo y empezar a comparar con los fotogramas que vamos obteniendo. Este retardo dependerá de factores como la velocidad de los objetos.

Una de las mayores desventajas es que si el objeto o la persona en movimiento se quedan quietos, no se detecta. No es capaz de detectar siluetas. Sin embargo, es un método bastante robusto a los cambios de iluminación y a los movimientos de cámara. Consigue estabilizarse pasado un tiempo.

Fases del proceso de detección de movimiento

Ahora veremos cuales son las fases que debemos seguir para crear un algoritmo que nos permita la detección de movimiento con OpenCV. El proceso realizará varias tareas.

  • Conversión a escala de grises y eliminación de ruido.
  • Operación de substracción entre el segundo plano y el primer plano.
  • Aplicar un umbral a la imagen resultado de la resta.
  • Detección de contornos o blobs.

Algo muy común en las ciencias de la computación, en particular en la visión artificial, son los parámetros. Cada parámetro puede tener un rango de valores. El valor correcto dependerá de muchos factores. Está en nuestras manos adaptar cada valor a una situación concreta.

Existen diferentes técnicas que nos permiten estimar cual es el conjunto de valores que nos da mejor resultados. Una de ellas es Simulated Annealing. No te voy a hablar de esta técnica ya que es muy compleja y no es el objeto de este artículo, pero debes tenerlo en cuenta cuando tu objetivo es hacer una aplicación profesional. Es la única manera de ajustar los parámetros para obtener unos resultados aceptables.

Conversión a escala de grises y eliminación de ruido

Antes de realizar ninguna operación con las imágenes, es conveniente convertir a escala de grises. Resulta menos complejo y más óptimo trabajar con este tipo de imágenes. Por otro lado hay que minimizar el ruido provocado por la propia cámara y por la iluminación. Esto se hace a través de promediar cada píxel con sus vecinos. Se conoce comúnmente como suavizado.

Detección de contornos o blobs

Una vez que tenemos la imagen con píxeles blancos o negros, tenemos que detectar los contornos o blobs. Un blob es un conjunto de píxeles que están conectados entre si es decir, tiene vecinos con el mismo valor. Cuando hablamos de vecinos es que estén al lado. En la siguiente imagen te muestro un ejemplo.

 

A continuación te dejamos un video con la finalidad que entiendas de manera mas detallada este tema.

 


Valoración: 5 estrellas
1 voto

Añadir comentario

Comentarios

Todavía no hay comentarios