17 dic 2008

La cosa avanza

El proyecto empieza a tomar forma. Esta semana me he dedicado a realizar dos funciones:

La primera consistía en mostrar una secuencia de imágenes, dando la impresión de "movimiento". He usado las que me bajé la otra vez del edificio en construcción. El resultado es una versión "a lo bruto" de lo que tendría que ser el proyecto una vez finalizado, ya que se notan mucho las transiciones entre imágenes. La implementación ha sido bastante sencilla, usando un bucle que va cargando una imagen y mostrándola en cada iteración. Las mayores complicaciones han venido del lado de la dirección de la imagen, ya que esta tiene que cambiar en cada iteración. Lo que hice fue pasar el contador del bucle a char, concatenarlo con la extensión de la imagen (.jpg por ejemplo), y usar el resultado como dirección. Aún así, al finalizar el programa (y mostrar correctamente las imágenes), me sale el siguiente error: "Stack around the variable 'xxxx' was corrupted", siendo "xxxx" una variable que uso para inicializar un puntero a char que es en donde guardaré la dirección de la imagen (ya que el compilador me decía que debía inicializar dicho puntero). He estado probando cosas pero sigo sin quitar ese error. Al menos no molesta demasiado por ahora...

La segunda de las funciones que he hecho ha sido algo más complicada. Consistía en hallar la imagen promedio de un número de imágenes. La principal complicación fue hallar el modo de acceder a cada píxel de la imagen. Buscando por diversos tutoriales de Internet vi diversos métodos, y finalmente me decanté por uno que al parecer no es muy eficiente, pero sí me resultó más sencillo de entender (los otros métodos no conseguí entenderlos del todo).

Simplemente hay que usar la función "cvGet2D(img,y,x)", donde "x" e "y" son las coordenadas del píxel al que se quiere acceder. Esta función devuelve en una variable del tipo CvScalar los valores RGB del píxel, del siguiente modo:

s.val[0]=blue
s.val[1]=green
s.val[2]=red

Para recoger la información del color de cada píxel de la imagen definí un array de dos dimensiones, del tamaño que tengan las imágenes a tratar (p.ej. 300x240), y que guardase en cada posición la información RGB mediante un struct. Lo demás es bastante sencillo: usando este array se va recogiendo la información de cada pixel de cada imagen, y se halla el promedio. Una vez obtenido este, se usa la función "cvSet2D(img,y,x,s)", que básicamente hace lo inverso que "cvGet2D", creando la imagen resultado.

Como he dicho, este método puede no resultar muy eficiente, y de hecho hay desbordamiento de pila si se usan imágenes de gran tamaño. Por eso intentaré averigüar cómo hacerlo de una manera más eficiente.