Friday, December 9, 2011

Tracking usando filtro de partículas en OpenCV


Una implementación muy simple de un tracker que usa filtro de partículas en OpenCV. Las partículas se generan mediante números aleatorios que siguen una distribución Gaussiana, se les asigna peso según distancia de histogramas HSV y frame a frame se van actualizando, conservando sólo las mejores partículas.

Puedes bajar el programa aca

Friday, April 29, 2011

Octave plot custom grid

Necesitaba graficar algo, pero quería cambiar el espaciado de la rejilla a 0.25

P = dlmread("serial500.txt"," ");
plot(P(:,1),P(:,2),"*")
set(gca(),"xtick",[0:0.25:1])
set(gca(),"ytick",[0:0.25:1])
grid
xlabel("x")
ylabel("y")
title("500 pares de nums")

Saturday, March 12, 2011

Un problema interesante

El otro día me comentaron acerca de un problema muy interesante y quiero compartirlo con ustedes, por supuesto que no les daré el nombre del problema para que no lo busquen...

Hay tres cajas, de las cuales sólo una contiene un premio. Tú escoges una de estas cajas y luego se te muestra una de las cajas que no escogiste y no contiene premio. Se te da la posibilidad de cambiar la caja que escogiste por la que queda ¿Qué te conviene hacer?

Tuesday, February 22, 2011

Reflexiones acerca de nuestra grandeza

La vida se agota, nada se puede hacer para evitarlo, nos parecen tan importantes y eternas ciertas cosas, como si nunca dejaremos de ver el sol llegar cada día, como si existiese alguna urgencia en este mundo. Cuando en realidad cada una de nuestras creaciones tiene como destino la destrucción, pero que más da, es preferible soñar con que tenemos asuntos muy importantes que atender, con que somos grandes y elocuentes, mucho mejores que aquellas rocas que agonizan en el espacio. Es preferible emitir un destello de luz antes de desaparecer, como intenando superar la inercia de lo interte, que no ha conseguido aún tener la más mínima inferencia en lo que le depara.

Monday, November 15, 2010

La Identidad de Euler

Se dice que si se tuvieran que escoger los números más populares, sin duda alguna entre los primeros escogidos estarían π, e, i, 1 y 0.
Hay una bella identidad que los relaciona, seguramente conocida por más de alguno de ustedes, yo la ví en el documental universo matemático:

ei π + 1 = 0

La identidad anterior es conocida como la Identidad de Euler.

Para corroborar su autenticidad sólo debemos recurrir a la famosa Fórmula de Euler:

ei θ = cos (θ) + i sen(θ)



Donde se verifica fácilmente que si θ = π se obtiene:

ei π = cos (π) + i sen(π) = -1



Pues cos(π) = -1 y sin(π) = 0

Sunday, September 26, 2010

Tip Octave

Cuando se carga una imagen en memoria usando imread se almacena como una matriz uint8, lo que significa que cada valor de la matriz es un número positivo de 1 byte, si se quiere trabajar con esos números hay que tener cuidado pues tomarán un valor máximo de 255.


octave:> img = imread("imagen.jpg");
octave:> img(1,1)
octave:> ans = 44
octave:> img(1,1)*1000
octave:> ans=255
octave:> %para evitar esto hay que hacer un casting
octave:> double(img(1,1))*1000
octave:> ans=44000
octave:>


Escribí esto aquí para que no se me olvide, pues me causó un gran dolor de cabeza mientras estaba probando un algoritmo de interpolación para un trabajo de la universidad.

Monday, September 20, 2010

Efecto para ser invisible, para variar en OpenCV

El efecto mostrado en el post anterior es muy fácil de programar:
1.- Sacar una foto al fondo
2.- Reemplazar todos los pixeles color piel por su pixel correspondiente en la imagen tomada en 1.
Para detectar la piel humana en el espacio de colores RGB:

char isSkinPixel(IplImage *img, int x, int y) {
unsigned char R,G,B;
B = img->imageData[y*img->widthStep+x*img->nChannels];
G = img->imageData[y*img->widthStep+x*img->nChannels+1];
R = img->imageData[y*img->widthStep+x*img->nChannels+2];
if( R > 95 && G > 40 && B > 20 && ( max(R,G,B) - min(R,G,B) ) > 15 && abs( (int)(R-G) ) > 15 && R>G && R>B ) {
return 1;
}
return 0; 
}

La condición que se usa para detectar el color piel la ví en un paper, pero no lo pude encontrar para dejarlo aquí.

La detección de piel humana funciona bien sólo si estamos capturando imágenes en un lugar con la luminosidad adecuada, pues si esta muy oscuro o muy iluminado el color de la piel se pierde. Además hay falsos positivos si el fondo no es el adecuado.

Código fuente del programa : invisible (necesita la biblioteca OpenCV)