Mostrando entradas con la etiqueta juego. Mostrar todas las entradas
Mostrando entradas con la etiqueta juego. Mostrar todas las entradas

miércoles, 5 de mayo de 2010

Juego de RA, primeros pasos

Hola, ya que digamos que hemos conseguido hacer funcionar de manera medianamente decente el facedetect para tomarnos las imágenes e incluso los programas de haatraining, createsamples y performance, nos hemos metido en serio con el juego de RA, bueno, al menos con la parte gráfica, ya que el núcleo del juego ya lo empezó hace tiempo mi compañero y empezó ha hablar de el en un post anterior...

Bueno, ahora metiéndonos más en faena, cuando empezamos a mirar como hacer el seguimiento de las manos para poder jugar al pong, primero pensamos en hacer un haartraining para poder localizar la mano, pero vistos todos los problemas que nos ha causado el crear nuestros modelos para el reconocimiento, y visto que obtener las imágenes positivas y negativas se podía complicar hasta la saciedad, decimos desechar esta idea, ya que también, descubrimos un método que nos permitía mostrar en una imagen en blanco y negro, una imagen de la cámara siendo el blanco el color de la piel, lo cual nos resultaría muy útil para localizar la mano, pero ya que 'jugaba' con los colores, pequeñas modificaciones de la luminosidad, que podían incluso venir dadas por el simple hecho de mover la mano, hacía que se perdiera la representación de la mano como blanco provocando graves fallos en el 'tracking' de esta....

Finalmente, navegando por la red, y con las ideas adquiridas de las pruebas anteriores, encontramos este código libre que hemos modificado para que en vez mover el ratón por la pantalla mientras mueves el objeto a seguir muestre en la posición adecuada una raqueta para jugar a nuestro pong, así como para que en vez de necesitar que el usuario seleccione con el ratón el objeto a seguir, que el propio usuario haga que el sistema le siga la mano al 'coger' la raqueta que se encuentra en una posición fija. Para ello, ya que el sistema simplemente se basa en reconocer colores, y define su seguimiento en función de su variación, hemos optado por usar unos guantes rojos para así lograr que el sistema pueda seguirlos con facilidad.

Por otro lado, para mejorar el sistema de seguimiento, decidimos optar por, en la zona de búsqueda, quitar todos los canales de los otros colores dejando solo el rojo, lo cual lo logramos con el siguiente método:

void cogeRojos( IplImage* src, IplImage* dst )
{
CvScalar s;
for( int i = 0; i <>height; i++ )
{
for( int j = 0; j <>width; j++)
{
s = cvGet2D( src, i, j ); // coge el valor del pixel (i,j)
s.val[0] = 0;
s.val[1] = 0;

cvSet2D( dst, i, j, s );

}
}
}

Cabe destacar que este método nos ha ayudado a lograr un mejor tracking, menos dependiente de la iluminación, pero aun así, sigue teniendo fallos, como que por ejemplo, si el fondo es blanco, da un falso positivo, ya que al quitar los canales B y G de un blanco, este se convierte en rojo, aunque ahora estamos buscando una posible solución.

Finalmente, cabe destacar que estamos aunando la parte física con la parte gráfica, por lo que en cuanto lo tengamos, subiremos un vídeo de ejemplo.

lunes, 5 de abril de 2010

El desarrollo físico del juego

Buenas despues de tanto tiempo sin actualizar, os vamos a contar los avances desarrollados en la práctica durante este último mes, aunque a partir de ahora actualizaremos más a menudo. Mientras Jorge se esta encargando del entrenamiento para la detección de caras, para ir avanzando, iré desarrollando la parte física de lo que será nuestro juego.

El primer problema que se planteó, como en cualquier juego, fue el simple hecho de empezarlo. ¿Cómo hacerlo?¿Por donde empiezo? ¿Como lo vamos a ligar a la otra parte?

Después de mucho pensarlo decidimos desarrollar el juego utilizando una matriz de dos dimensiones de numeros enteros rellenandola con ceros para los puntos en blanco, señalando con 1 los puntos criticos de la pelota, y con un 2 las palas.
Para ello creamos nuestra matriz
int TablaJuego[Pixelesfila][PixelesColumna]
Con esto ya tenemos la tabla ajustada al tamaño de la pantalla.
Además tambien hemos definido un RADIO de la pelota, que realmente será una cruz pero que nos dará los puntos donde la pelota puede chocar contra los bordes o las palas y un tamaño para la pala TAMANOPALA que momentaneamente y como una primera simplificación ocupará una columna.
for (int i=90; i<90+TAMANOPALA; i++){
TablaJuego [i][1]= 2;
TablaJuego [i][PixelesColumna-1] = 2;
}
Con esta inicialización estamos dejando una linea a la "espalda" de nuestro pala que será considerada como tanto del jugador contrario.

A partir de este momento se nos plantea la gran dificultad del juego. El movimiento de la pelota, sobre todo en los momentos críticos. Los golpes con la pala y los rebotes con las paredes. Y aún mas crítico será el momento en el que la pelota rebote y ademas se encuentre con la pala.

Asi pues recorreremos la matriz variando la posición de la pelota acorde a unas sencillas leyes como por ejemplo la que ilustra el siguiente fragmento de código.

ContinuaTrayectoria [0] = Trayectoria [0];
ContinuaTrayectoria [1] = Trayectoria [1];
TablaJuego [i+ContinuaTrayectoria[0]][j+ContinuaTrayectoria[1]] =1;
TablaJuego [i][j]=0;
i= i+ContinuaTrayectoria[0];
j= j+ContinuaTrayectoria[1];

Cuando el programa esté completamente operativo, se podrá observar, para quien quiera leer el código que se están estudiando todos los casos posibles.

Además en la última parte se ha incluido un pequeño marcador que variará cada vez que un jugador anote un gol.

Esperamos volver a escribir pronto.