Hola,<div><br></div><div>En este mensaje discutíamos sobre el estilo con el que es deseable que programemos nuestros algoritmos, al hilo de la implementación del cálculo de fondo que redo hizo para su clasificador, aunque en general son extensibles a cualquier tipo de código.</div>
<div><br></div><div>Hoy revisando la implementación para apañarla y hacerla más genérica, de modo que podamos usar dichos algoritmos en otros proyectos, me he encontrado con algunas otras cosas que no me gustan. Así, que para poder discutirlas las indico.</div>
<div><br></div><div>Ya habíamos hablado de las variables globales, y sobre todo del uso que se le dan: estado del algoritmo. Conclusión: la implementación no puede usarse para calcular N fondos.</div><div><br></div><div>Otro caso de abuso que lleva a poca reutilización de código son las variables static en funciones. De nuevo, nos llevan a que la implementación no escala. La solución es igual de simple que antes, usar una variable que guarde el estado del algoritmo y que cada función de nuestro algoritmo la reciba como parámetro de entrada.</div>
<div><br></div><div>Tenemos que poner un poco mas de cuidado cuando programemos algoritmos, y pensar que lo que hacemos podría ser reutilizado por otros, ahorrando mucho tiempo y pudiendo hacer cosas más complejas.</div><div>
<br></div><div>¿Comentarios?</div><div><br></div><div>David.</div><div><br><br><div class="gmail_quote">2010/7/2 redouane kachach <span dir="ltr">&lt;<a href="mailto:redo.robot@gmail.com">redo.robot@gmail.com</a>&gt;</span><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div dir="ltr"><div>BTW: GMM es la técnica más famoso para la actualización de fondo, si quieres echar un vistazo, tienes artículos que hablan del tema en:</div>
<div><br></div><div><a href="https://svn.jde.gsyc.es/users/redo/tfm/trunk/lecturas/" target="_blank">https://svn.jde.gsyc.es/users/redo/tfm/trunk/lecturas/</a>gmm</div>

<div><br></div><div>Por si tienes que pelear con los parámetros que usa el algoritmo.</div><div><div></div><div class="h5"><br>2010/7/2 redouane kachach <span dir="ltr">&lt;<a href="mailto:redo.robot@gmail.com" target="_blank">redo.robot@gmail.com</a>&gt;</span><br>
<div class="gmail_quote">

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>Ok, genial. En principio como te dije antes la GMM es una técnica más &quot;avanzada&quot; que las que tenemos implementadas. Creo que tiene en cuanta casos por ejemplo como árboles en el escenario (movimiento periódicos en la escena). Así que si funciona bien mejor usarla.</div>



<div><br></div><div>Por lo de re-enviar la conversación a la lista me parece buena idea :) .. sobre todo lo de POO en C creo que estaría bien mandar algún ejemplo a la lista. Vendría bien si alguien lo quiere utilizar.</div>



<div><br></div><div>Saludos,</div><div>Redo.</div><div><div></div><div><div><br></div><br><div class="gmail_quote">2010/7/2 David Lobato <span dir="ltr">&lt;<a href="mailto:dav.lobato@gmail.com" target="_blank">dav.lobato@gmail.com</a>&gt;</span><br>


<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Por el momento estamos probando los dos algoritmos que tiene opencv. Sin menospreciar tu trabajo, dado que ya están hechos y usamos opencv para todo, vamos a darle un intento.<div><br></div><div>Vamos a empezar con el Mixture of Gaussians, que parece estar cerca de lo que tu has hecho. El primer intento que hemos hecho tiene muy buena pinta, aunque hay que ver que hace cada parámetro de los que tiene.</div>




<div><br></div><div>Si vemos que opencv no hace lo que necesitamos, nos ponemos a apañar tu código, ok?</div><div><br></div><div>David.</div><div><br></div><div>PD: La conversación me parece muy interesante, os parece si la reenvío a la lista de desarrolladores de jderobot?</div>



<div><div></div><div>
<div><br><div class="gmail_quote">2010/7/2 redouane kachach <span dir="ltr">&lt;<a href="mailto:redo.robot@gmail.com" target="_blank">redo.robot@gmail.com</a>&gt;</span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">




<div dir="ltr"><div>Ya, eso es programar en C con el paradigma de POO, que es la mejor opción como has dicho:</div><div><br></div><div>En la cabecera ofreces un puntero a un struct opaco hacia fuera y metodos para usarlo a los cuales tienes que pasar el puntero.</div>






<div><br></div><div>En mi caso como solo me hacia falta un sólo fondo la verdad no he planteado esta opción, aunque en realidad hubiese sido lo idóneo. Si ves que te hace mucha falta que sea así podría invertir un poco de tiempo en convertirlo.</div>






<div><br></div><div>En todos los casos, yo creo que es mejor llevarlo a C++ que seria todavía más rápido. </div><div><br></div><div>Como lo ves?</div><div><div></div><div><div><br></div><div class="gmail_quote">
2010/7/2 David Lobato <span dir="ltr">&lt;<a href="mailto:dav.lobato@gmail.com" target="_blank">dav.lobato@gmail.com</a>&gt;</span><br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">La opción realmente buena es meter todo lo relacionado con el estado del algoritmo en una estructura que se pasa a las funciones del API del algoritmo.<div>






Eso requiere darle un repaso completo a tu código, que no digo que sea difícil, pero implica un esfuerzo para entenderlo.</div>
<div><br></div><div>Mira el API que usa opencv:</div><div><br></div><div><div>bg_model = cvCreateFGDStatModel(image,0);</div><div>...</div><div>cvUpdateBGStatModel(image,bg_model);</div><div>...</div><div>cvReleaseBGStatModel( &amp;bg_model );</div>







<div><br></div><div>Todo va en bg_model. Si quiero tener X cámaras pues bg_model1, bg_model2,...</div><div><div></div><div><br><div class="gmail_quote">2010/7/2 redouane kachach <span dir="ltr">&lt;<a href="mailto:redo.robot@gmail.com" target="_blank">redo.robot@gmail.com</a>&gt;</span><br>







<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>Buena pregunta :-)</div><div><br></div><div>Tal y como esta el modulo no se puede. Pero no por el hecho de que el fondo sea una variable global, es porque el propio modulo internamente tiene un solo fondo. De hecho lo de exportar el modulo hacia fuera como variable global fui más bien para pintarlo no para usarlo. Si ves la cabecera, el metodo que se usa para comprobar si un pixel de un frame se ha movido o no, es:</div>









<div><br></div><div><div>int movement_on_pixel(char* image, int pos);</div></div><div><br></div><div>Si quieres usarlo para varias tienes que cambiar el modulo para añadirle este soporte. En este caso como ya sabes tienes dos opciones:</div>









<div><br></div><div>1) Modificar el codigo C que ya existe para crear más de un fondo -- no creo que sea díficil pero requiere trabajo --</div><div>2) Envolver el código existente en una clase C++  y luego instanciarla cada vez que necesitas un fondo.</div>









<div><br></div><div>Yo creo que la opción 2) es la mejor y la más rápida en tiempo.</div><div><div><br></div><div class="gmail_quote">2010/7/2 David Lobato <span dir="ltr">&lt;<a href="mailto:dav.lobato@gmail.com" target="_blank">dav.lobato@gmail.com</a>&gt;</span><br>









<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">En ElderCare usamos N cámaras, como calculas el fondo de cada una con una variable global?<div><br></div><div><br><br>









<div class="gmail_quote">2010/7/2 redouane kachach <span dir="ltr">&lt;<a href="mailto:redo.robot@gmail.com" target="_blank">redo.robot@gmail.com</a>&gt;</span><div><div></div><div><br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>No creo que sea muy difícil de reutilizar :-)  -- aunque quizás lo digo porque fui el creador --</div>










<div><br></div><div>Si ves el header de background_model.h tienes los tres siguiente metodos de actualizan el fondo. Como entrada reciben el fotograma actual.  El mejor es el &quot;<span style="color:rgb(51, 51, 255)">update_background_mode_based</span>&quot;  que actualiza el fondo basandose en la moda:</div>












<div><br></div><div><div><font color="#3333FF">int update_background_mean_based(char* input_image);</font></div><div><font color="#3333FF">void update_background_mode_based(char* input_image);</font></div>

<div><font color="#3333FF">int update_background_exp(char* input_image);</font></div><div><font color="#3333FF"><b><br></b></font></div><div>En cada momento puede acceder al fondo estimado que no deja de ser una imagen y  que se exporta como variable global hacia el exterior:</div>












<div><br></div><div><div><font color="#3333FF">extern unsigned char background_image[MY_SIFNTSC_ROWS*MY_SIFNTSC_COLUMNS*3];</font></div></div></div><div><font color="#3333FF"><br>

</font></div><div>En serio, no creo que es tan difícil de reutilizar .. </div><div><br></div><div>2010/7/2 David Lobato <span dir="ltr">&lt;<a href="mailto:dav.lobato@gmail.com" target="_blank">dav.lobato@gmail.com</a>&gt;</span></div>










<div><div></div><div><div class="gmail_quote">

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Estoy probando el otro método que implementan, que según la documentación que hay en cvaux.h parece ser mas potente. Voy a hacer un ejemplo y lo vemos.<div>












<br></div><div>En cuanto a reutilizar el módulo que has hecho para carclassifier, me temo que no va a ser tan fácil de reutilizar. De nuevo se abusa de variables globales... Tenemos que salir de ahí de una vez por todas.</div>













<div><br></div><div>David.<br><br><div class="gmail_quote">2010/7/1 redouane kachach <span dir="ltr">&lt;<a href="mailto:redo.robot@gmail.com" target="_blank">redo.robot@gmail.com</a>&gt;</span><div><div></div><div>

<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div dir="ltr"><div>Hola David,</div><div><br></div><div>Pues sin entrar en mucho detalles si de verdad implementan la GMM (Gaussian Mixture Model) entonces deberia dar mejor resultados que el modelo de background que tenemos en el clasificador. Yo creo que lo mejor es intentar compilar un ejemplo y compraralo contra los resultados obtenidos por el clasificador. El submodulo de background debe ser fácil de reutilizar.</div>















<div><br></div><div><br></div><div class="gmail_quote">2010/7/1 David Lobato <span dir="ltr">&lt;<a href="mailto:dav.lobato@gmail.com" target="_blank">dav.lobato@gmail.com</a>&gt;</span><div><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">















Buscando cosas en opencv he encontrado esto [1]. Cómo de cerca está de la solución implementada en el carclassifier?<div><br></div><div><br></div><div><br></div><div>David.</div><div><br></div><div>[1] <a href="http://opencv.willowgarage.com/wiki/VideoSurveillance" target="_blank">http://opencv.willowgarage.com/wiki/VideoSurveillance</a></div>
















</blockquote></div></div><br></div>
</blockquote></div></div></div><br></div>
</blockquote></div><br></div></div></div>
</blockquote></div></div></div><br></div>
</blockquote></div><br></div></div>
</blockquote></div><br></div></div></div>
</blockquote></div><br></div></div></div>
</blockquote></div><br></div>
</div></div></blockquote></div><br></div></div></div>
</blockquote></div><br></div></div></div>
</blockquote></div><br></div>