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).
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
Acojonante este sistema, ojalá hubiesemos visto algo parecido en una asignatura de Ingeneiría Informática como Imágnes y gráficos por computador.
Es lo malo del sistema educativo de las universidades: Demasiada teoría y poca práctica.
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.
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.
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.
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é.
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
Claro, eso, enviar un correo, un sms, etc. Sólo hay que tocar en el punto correcto del codigo 😉
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?
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.
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.
Si, claro que puedes usar la explicación para tu trabajo.
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)
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.
Buenas tardes amigo, me podrias decir que metodo utilizaste y donde lo encontraste ya que tengo que hacer un trabajo sobre eso
No entiendo que quieres decir que método usé. Ya esta epxlicado en el propio artículo ¿no?
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.
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????
Me encantaría saber mas de este programa sera que me podrías apoyar al respecto?