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:
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:
Hola Que tal:
Tengo una duda como es ke puedo en timpo de ejecucion elegir la camara para la captura...
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!
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
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.
Publicar un comentario