12/10/08

Acabando

Finalmente he implementado la parte que faltaba por hacer, distinguir entre objetos parados y abandonados mirando si hay movimiento en los alrededores del objeto. Para esto lo lógico sería trazar un circulo alrededor del objeto y mirar dentro de él, pero normalmente las imágenes que vamos a tener no serán cenitales (desde arriba sin ningún angulo). En cámaras con angulo el circulo se convertiría en una elipse por lo que he rebuscado en los apuntes de mate del instituto para que introduciendo el ángulo de la cámara con la pared el programa obtenga la altura y anchura de la elipse.

Un vez obtenidos el alto y el ancho, como recorrer los pixels de una elipse es algo complicado y no es excesivamente importante ceñirse perfectamente a ella, simplifico recorriendo los pixels del rectángulo resultante de dichas altura y anchura.
Para detectar si hay movimiento dentro del rectángulo descrito utilizo otra vez la téctica de resta de imágenes , umbralizado y recuento de pixels blancos restando la imagen actual al fondo como ya comente en otros posts.

Vídeo de demostración:




como en vídeos anteriores:
tipo objeto - color


parado - amarillo

abandonado - rojo
parado_perdido - gris
abandonado_perdido - azul

Por otra parte tras hacer todo lo demás me he encontrado con que hay un montón de variables como el angulo de la cámara, los umbrales utilizados, los tiempos entre actualizado de background o el tamaño de trabajo de las imágenes que no se pueden fijar y difícilmente calcular porque dependen de la situación de la captura(posición de la cámara en el pc, angulo de la cámara, resolución .....).

Para hacer esto configurable al usuario he aprovechado las funciones que tiene OpenCV para el manejo de archivos xml de tal forma que se puedan tener varios archivos xml de configuración por ejemplo para cada cámara y cargar en cada caso el más conveniente, pudiendo también cargar una configuración por defecto.


Y con esto en principio parece que el proyecto estaría completo salvo algún retoque. Ahora sería el momento de ponerme con la memoria... :-s


Bueno, y como lo prometido es deuda, aquí van los vídeos del programa en funcionamiento para los otros ángulos de cámara de la escena que llevo usando todo este tiempo:







Y aquí un puñao de otras escenas desde distintos ángulos:


















4 comentarios:

Miguel Delgadillo dijo...

Hola Que tal:

Tengo una duda como es ke puedo en timpo de ejecucion elegir la camara para la captura...

Alejandro Iglesias dijo...

Muy bueno!

La verdad te felicito! Los resultados hablan por si solos, y es más que interesante verlo en accion.

Aún así, no entiendo todavía si esto puede tener alguna aplicación mas significativa, no obstante será cuestion de buscar mejor.

Estoy con un proyecto con OpenCV, y estoy apunto de meterme en este mundillo (ya veremos si sale algo) y de casualidad llegue a esta página.

Bueno eso es todo, Un saludo!

Unknown dijo...

Hola, enhorabuena lo primero!

Si es posible podrías ayudarme y explicarme cómo reduces la imagen que estas tratando para detectar el fondo, porque no estoy muy seguro de si puede hacerse con cvResize() y en ese caso como sería partiendo de un IplImage.

Muchas gracias

Antonio Collazos Carrera dijo...

la forma de hacerlo es la siguiente:

-te creas otra iplimage del mismo tipo que la que quieres reducir, pero con distinto tamaño (cvCreateImage(...).

-haces cvResize(img_fuente,img_destino);

a partir de ese momento tendrás una copia de "im_fuente" reducida (o ampliada) en "img_destino".

Un saludo,
Antonio.