Detección de movimiento con una webcam

En este proyecto mi intención no es otra que hacer un sistema de detección de movimiento (que no de reconocimiento de objetos).

Detectar movimiento no es una cosa sencilla como pueda parecer a priori, ya que la imágen que pueda dar una camara (en este caso un webcam) no es de una calidad suficiente como para que dos imágenes tomadas en distintos momentos puedan considerarse iguales. Esto es debido a que las cámaras suelen introducir ruido en las imágenes que captan, o dicho de otra forma, un pixel de una posición determinada de la imágen nº1 no suele coincidir casi nunca (por no decir nunca) con un pixel de la misma posición de la imágen nº2 (aún siendo estas tomadas con una diferencia de milisegundos). Es por ello que hay que pensar que nivel de tolerancia hay que permitir para que aunque las imágenes no sean iguales exactamente, la información que contienen si sea similar en gran medida; sin detrimentro por supuesto de que si hay algún movimiento de un objeto o de un ser vivo sea tomado como informaciones distintas y provoque un evento o acción.

Existen varias formas de trabajar con esta tolerancia: algoritmos de detección de bordes (gradientes, derivadas gausianas, transformada de Hough, etc), filtrados descriptores de Fourier, clasificador Bayesiano, etc), etc. Todos ellos sirven, pero no son iguales de rápidos. Es por ello que me decanté por el metodo estadístico de hacer medias de pixeles con los de su alrededor, un metodo sencillo para fijar una tolerancia en escaso tiempo (aunque quizá con un poco de penalización en cuanto a acierto en detección).

El método consiste en tomar cada pixel de la imágen nº1 y sumar su valor con los 8 pixeles que le rodean (una matriz de 3×3) y luego dividir el resultado por 9, por lo que nos da un valor medio. El mismo proceso lo hacemos con los mismo pixeles pero de la segunda imágen, y así obtenemos otro valor medio. Al compararlos podemos detectar cuanto % de diferencia hay entre uno y otro, momento por el cual, gracias a que hemos configurado que nivel de sensibilidad en la diferencia, o se admite como que no es un valor a tomar en cuenta, o sin embargo el valor es distinto y por lo tanto se toma en cuenta. Si se sobrepasa una cantidad determinada de pixeles que se toman en cuenta (sensibilidad por puntos), entónces es que las imágenes no son completamente iguales en cuanto a información y se supone que se ha producido un movimiento (cambio de posicion de entidades en la imágen o aparación de otras nuevas). La idea es que se tome una imágen de referencia (una del entorno estático), y se comparen las restantes con ella, para poder así saber con respecto al origen si ha habido algún cambio. Más tarde se toma otra imagen de referencia eliminando así los problemas que pudieran causar otros agentes (como un cambio atenuado de luz por el sol).

Media de pixeles

Siguiendo esta idea, he desarrollado una aplicación en visual c++ 6.0 llamada DETECTOR donde he aplicado los conceptos anteriormente citados. Podeis descargar el ejecutable y/o su código fuente en esta dirección (esta bajo licencia creative commons): https://www.sistemasorp.es/detemovi

19 comentarios en “Detección de movimiento con una webcam

  1. Anonymous

    Acojonante este sistema, ojalá hubiesemos visto algo parecido en una asignatura de Ingeneiría Informática como Imágnes y gráficos por computador.

    Responder
  2. falvarez

    Pues yo sí lo vi en una asignatura de la carrera (Licenciatura en Informática, FI-UPM). La asignatura, si no me falla la memoria, se llamaba Percepción Computacional.

    Seguramente me habría gustado tener más horas de prácticas, pero sin renunciar a las que tuve de teoría, que me vinieron muy bien.

    Responder
  3. sistemasorp

    Eso esta bién, lo que pasa es que me imagino que sería una de esas asignaturas de libre configuración, ¿no?. En mi universidad y en otras no solían ser tan sofisticados y tenian unas pocas que al final todo el mundo se pillaba por igual.

    Responder
  4. Anonymous

    hola, quisiera saber si el programa serviria bajo condiciones luminicas inestables,y ademas si seria factible hacerlo en un sistema HSI ya que trabajando con la saturacion no se veria afectado las variaciones luminicas en los pixeles involucrados, lo que el rgb no lo consigue.
    Pero de alli es muy ingeniosa tu propuesta,yo hice deteccion de movimiento tambien pero ya te digo lo hice en rgb con una Look up table y se me hizo complicado.
    Soy estudiante de la ESPOL(Ecuador)
    Carrera Ing.Ssistemas Multimedia.
    asignatura: digital imaging processing.

    Responder
  5. sistemasorp

    Pues el programa tiene un sistema que hace que cada 10 segundos cambie la imágen de referencia, sin embargo esto solo sirve para entornos donde la luz difiere de poco en poco (por ejemplo aquellos cuya luz provenga del sol). En cuanto a la tonalidad, saturación e intensidad, posiblemente se pudiera hacer, aunque no habíoa contemplado esa posibilidad, asi que la estudiaré.

    Responder
  6. Anonymous

    hola,

    Acabo de encontrar este programilla,…voy a probarlo ;-D

    Lo quiero usar como alarma, es decir que cuando detecte movimiento ejecute una acción, p.ej, reproducir un mp3! ;-D

    ¿Se podría hacer?

    Un saludo y gracias

    Responder
  7. Anonymous

    el algoritmo detecta q hubo movimiento en la escena.. pero conoces como hacer q el reconosca q cuerpo en la escena fue el que realizo el movimiento?

    Responder
  8. sistemasorp

    Reconocer que tipo de cuerpo es el que se ha movido, como por ejemplo una mano? Eso es más complicado, ya que tendrías que tener una base de datos de imágenes estandar de distintos objetos y luego por estadística ver con cual concuerda más, algo al estilo del OCR pero con objetos que pueden estar rotados, en perspectiva, etc.

    Responder
  9. Anonymous

    EXCELENTE TEMA MI TRABAJO DE GRADO ES SOBRE MONITOREO POR VIDEO CON DETECCION DE MOVIMIENTO. EXISTE UN PROGRAMA BAJO LICENCIA GNU PARA LINUX. SE LLAMA MOTION. PODEIS ENCONTRARLO EN GOOGLE BUSCANDO POR MOTION DETECTION LINUX. ES EXCELENTE. PROBARE ESTA VERSION PARA LINUX Y LA EXPLICACION QUE HAS DADO ES GENIAL. PUEDO PONERLA EN MI TRABAJO DE GRADO Y HACERTE REFERENCIA??
    GARCIAS
    MILTON G.

    Responder
  10. Anonymous

    muy bueno el prograga.. ahora estoy tratando de modificarlo para poder conectar dos camaras para el sistema de vision stereo de mi robot, Vincent(30 DOF), si me puedes recomendar algo al respecto, lo agradesco.. Ivan (bogota, colombia)

    Responder
  11. Ruben Lobos

    Déjame aplaudir y decir que está genial el tema. Según el algoritmo explicado veré como hacerlo para programarlo en Delphi.

    Me es de mucha, ya que tenía la idea de la comparación de pixeles, pero no encontraba la forma de llevarloa cabo.

    Un saludo y de nuevo digo congratulations.

    Responder
  12. Trinidad_Salmeron

    Buenas tardes amigo, me podrias decir que metodo utilizaste y donde lo encontraste ya que tengo que hacer un trabajo sobre eso

    Responder
  13. zero

    Este método es rápido, pero no es preciso, ya que el cálculo de la media está haciendo difusa la imagen; hace que cada pixel o bloque se asemeje al entorno. El problema con esto es que pasan desapercibidos cambios bruscos y pequeños. El método adecuado, debería ser aplicar algún filtro tipo pasabajos, o de búsqueda de bordes que utilice diferenciación (laplaciano por ejemplo). Luego, puede aplicarse algún algoritmo de clasificación o comparación de la imagen, de acuerdo a las formas, mediante redes neuronales por ejemplo. Esto haría posible la detección de pequeños cambios en la imagen. Estos procesos pueden realizarse en cascada, para maximizar la velocidad.

    Responder
  14. michafm

    Creen que esta aplicación pueda ser utilizada para detectar el movimiento de una bola de Ping-Pong, en el Modelo de un Ball & Bean Asimétrico????

    Responder

Responder a michafm Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *