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")
Labels:
programación
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?
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.
Labels:
Pensamientos
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:
Para corroborar su autenticidad sólo debemos recurrir a la famosa Fórmula de Euler:
Donde se verifica fácilmente que si θ = π se obtiene:
Pues cos(π) = -1 y sin(π) = 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.
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.
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:
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)
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)
