diff options
author | pgperui <pgperui@65703dd9-322d-4ecd-a169-f49c4620ba53> | 2011-05-27 02:11:51 (GMT) |
---|---|---|
committer | pgperui <pgperui@65703dd9-322d-4ecd-a169-f49c4620ba53> | 2011-05-27 02:11:51 (GMT) |
commit | 6d5baf9e40ed428904fc8ff7a8cc3690dfd7409f (patch) | |
tree | a45302af7c5a0346deb965bd2f17115ce60e3313 | |
parent | 40ce6c1d7b3184249bf8a86e03ad14e6bb5f7dd3 (diff) |
git-svn-id: svn+ssh://lulu.fing.edu.uy/ens/home01/pgperui/repoSVN@174 65703dd9-322d-4ecd-a169-f49c4620ba53
-rw-r--r-- | multi/SRC/TocarAnimalesPUI.cpp | 507 |
1 files changed, 507 insertions, 0 deletions
diff --git a/multi/SRC/TocarAnimalesPUI.cpp b/multi/SRC/TocarAnimalesPUI.cpp new file mode 100644 index 0000000..af85b76 --- /dev/null +++ b/multi/SRC/TocarAnimalesPUI.cpp @@ -0,0 +1,507 @@ +/* + * TocarAnimalesPui.cpp + * Author: smarichal + */ +#include "Pui.h" +#include "UtilidadesSDL.h" +#include <AR/gsub.h> +#include <GL/gl.h> +#include <GL/glut.h> + + /************************************************************************************************************************* + * CONFIGURACIONES GENERALES DE LA APLICACION + *************************************************************************************************************************/ +int mostrarVideo = 0; +int dibujarCubos = 0; +int mostrarRadar = 1; + + /************************************************************************************************************************* + * CONFIGURACION DE RECONOCIMIENTO DE COLORES + *************************************************************************************************************************/ +#define MIN_AREA 500 +//#define MAX_AREA 1500 + +int min_area = MIN_AREA; +//int max_area = MAX_AREA; +float factor =1; +#define MIN_H 0 +#define MAX_H 0 +#define MIN_S 0 +#define MAX_S 0 +#define MIN_B 0 +#define MAX_B 0 +#define CANT_HISTORIA 4 +#define UMBRAL 5 +#define UMBRAL_AREA_APUNTADOR 20 //El area del apuntador y el area del marcador tienen una relacion definida mediante calibracion. Usamos un + //umbral de error al que declaramos como UMBRAL_AREA_APUNTADOR. Es decir si la zona de estudio donde buscamos el + //apuntador mide 300 y la relacion es de 1/2 (el apuntador mide la mitad del marcador) entonces buscaremos apuntadores entre + //las cotas (150 - UMBRAL_AREA_APUNTADOR) y (150 - UMBRAL_AREA_APUNTADOR) +#define ERODE 1 +#define DILATE 1 +#define SMOOTH 1 +#define OFFSET_ROI 5 //Cuanto mas grande mas grande sera el ROI donde busco el apuntador +#define MIN_AREA_WIDTH_HEIGHT 5 //Este valor sirve para indicar cual es el area minima en la cual se busca un apuntador. + //Por ejemplo si el marcador se encuentra apenas dentro de la pantalla y el height o el width no superan este valor entonces + //el area no sera analizada en busca de un apuntador + +int umbral = UMBRAL; +int minH = MIN_H, maxH = MAX_H, minS = MIN_S, maxS = MAX_S, minB = MIN_B,maxB = MAX_B; +int num_apuntadores =0; +int mostrarImagenDebug = 0; +int debugImg = 0; //Parametro para hayObjetoColor. Si se le pasa 1 y se le pasa una ventana entonces va reproduciendo el ROI. Sino crea una ventana nueva pero detiene la aplicacion hasta tocar una tecla +int idMarcadorMostrarImagenDebug = -1; + + /******************************************************************************************************************************** + * CONFIGURACION DE ARTOOLKIT Y MARCADORES + ********************************************************************************************************************************/ + +#define MAX_MARCADORES 30 +/* set up the video format globals */ + +#ifdef _WIN32 +char *vconf = "Data\\WDM_camera_flipV.xml"; +#else +char *vconf = ""; +#endif + +int xsize, ysize; +int thresh = 100; +int count = 0; + +char *cparam_name = "Data/camera_para.dat"; +ARParam cparam; + +char *config_name = "Data/prototipo1/prototipo1.dat"; +ARMultiMarkerInfoT *config; + + +IplImage* img =NULL; +uchar* data1 =NULL; +IplImage* mono_Image = NULL; + +/*La posicion i del arreglo corresponde al marcador con con patt_id=i*/ +ARCoordMarcador marcadoresOcultos[MAX_MARCADORES]; //MAX_MARCADORES es la maxima cantidad -1 de marcadores que la aplicacion puede manejar. + + +Pui* pui; + +/************************************************************************************************************************************** + * ************************************************************************************************************************************ + * VARIABLES DEL PROTOTIPO + * ************************************************************************************************************************************ + * ************************************************************************************************************************************/ + +typedef struct { + int idImagenSDL; +}ElementoEnPantalla; + + + +/* Representacion de los elementosEnPantalla*/ +ElementoEnPantalla elementosEnPantalla[MAX_MARCADORES]; //El indice el elemento coincide con el id del elemento que tambien coincide con el id del marcador artoolkit +int cantElementosCargados = 0; + +int idObjetoPUIActual = -1; //id del objeto PUI que esta en pantalla, con este elemento deberia corresponderse la seleccion del usuario para obtener una respuesta exitosa +int idObjetoPUISeleccionado = -1; //id del objeto PUI que se ha seleccionado + +int correspondenciaCorrecta = 0; //indica si el elemento del conjunto A y el del conjunto B + // que se seleccionaron se corresponden +int correspondenciaIncorrecta = 0; + +int xNombreRelacion = 200; +int yNombreRelacion = 15; + +int xImagen = 135; +int yImagen = 100; + + +int anchoPantalla = 655; +int altoPantalla = 700; + +//Son los id de las imagenes actualmente desplegadas en la pantalla +int idSDLImagenPantalla = -1; + +int mostrarDebugAR = 0; +#define CONJUNTO_A 0 +#define CONJUNTO_B 1 + + + + /*************************************************************************************************************************************** + * DECALRACIONES DE FUNCIONES AUXILIARES + ****************************************************************************************************************************************/ +static void init(void); +static void cleanup(void); +static void keyEvent( unsigned char key, int x, int y); +static void mainLoop(void); +static void draw(); + +int main(int argc, char **argv) +{ + pui = new Pui(); + printf("InitAR\n"); + pui->initPuiConCapturaDeVideo("pui.config",config_nameCalibrador,"Data/camera_para.dat",vconf,usarAlgoritmoRapido,pui->NORMAL_SPEED_LOOP,2.0); + pui->abrirVentanaGrafica(); + pui->capStart(); + + init(); + printf("main loop\n"); + argMainLoop( NULL, keyEvent, mainLoop ); + printf("---------------------"); + return (0); +} + + +void proximoElemento(){ + if(idObjetoPUIActual == cantElementosCargados -1){//TODO Vuelve a comenzar o mensaje de exito y finaliza?? + idObjetoPUIActual = 0; + }else{ + idObjetoPUIActual++; + } +} + +void actualizarPantalla(){ + if(idObjetoPUIActual!=-1){ + if(elementosEnPantalla[idObjetoPUIActual].idImagenSDL == idSDLImagenPantalla && idSDLImagenPantalla >= 0){ + printf("Se sigue con la misma imagen, no se hace nada"); + }else{ + if(idSDLImagenPantalla!=-1){ + OcultarImage(idSDLImagenPantalla,0); + } + if( (elementosEnPantalla[idObjetoPUIActual].idImagenSDL == -1) ){ //Todavia no se cargo la imagen para este elemento + printf("voy a desplegar la imagen: %s\n",elementosEnPantalla[idObjetoPUIActual].imagen); + elementosEnPantalla[idObjetoPUIActual].idImagenSDL = PlayImageConTitulo(pui->getImagenObjetoPUI(idObjetoPUIActual),pui->getNombreObjetoPUI(idObjetoPUIActual),xImagen,yImagen,0); + idSDLImagenPantalla = elementosEnPantalla[idObjetoPUIActual].idImagenSDL; //Actualizo el id de la imagen mostrada actualmente + printf("IdSDLA = %d\n",idSDLImagenPantalla); + }else{ + mostrarImagen(elementosEnPantalla[idObjetoPUIActual].idImagenSDL,0); + idSDLImagenPantalla = elementosEnPantalla[idObjetoPUIActual].idImagenSDL; + } + } + + if(correspondenciaCorrecta){ + OcultarZona(xNombreRelacion,yNombreRelacion,anchoPantalla - xNombreRelacion,yImagen - yNombreRelacion,0); //Borro la zona superior de la pantalla que es donde esta escrito el texto + EscribirTexto(elementosEnPantalla[idObjetoPUIActual].nombreRelacion,xNombreRelacion,yNombreRelacion,0); + PlaySound(elementosEnPantalla[idObjetoPUIActual].sonido); + }else if(correspondenciaIncorrecta){ + PlaySound(errorSound); + } + + }else{ + EscribirTexto("Prototipo - Estado Inicial",xNombreRelacion,yNombreRelacion,0); + } + //Actualizo la pantalla + printf("Flip antes\n"); + flip(); + printf("Flip dsps\n"); +} + + +static void keyEvent( unsigned char key, int x, int y) +{ + /* quit if the ESC key is pressed */ + if( key == 0x1b ) { + printf("*** %f (frame/sec)\n", (double)count/arUtilTimer()); + cleanup(); + exit(0); + } + + + if( key == 'v' ) { + mostrarVideo = 1 - mostrarVideo; + if(!mostrarVideo){ + argCleanWindow(0,0); + } + } + + if( key == 'm' ) { + mostrarImagenDebug= 1 - mostrarImagenDebug; + } + + if(key == 'i'){ + printf("Ingrese marcador para debug (actual %d): ",idMarcadorMostrarImagenDebug); + scanf("%d",&idMarcadorMostrarImagenDebug); while( getchar()!='\n' ); + printf("\n"); + } + + if( key == 'c' ) { + dibujarCubos = 1 - dibujarCubos; + if(!dibujarCubos){ + argCleanWindow(0,0); + } + } + + if( key == 'r' ) { + printf("Mostrar Radar\n"); + mostrarRadar = 1 - mostrarRadar; + if(!mostrarRadar){ + argCleanWindow(2,1); + } + } + + if( key == SDLK_RETURN ) { + printf("Proximo\n"); + proximoElemento(); + actualizarPantalla(); + + } + + if( key == 't' ) { + printf("count = %d\n",count); + printf("timer = %f\n",arUtilTimer()); + printf("*** %f (frame/sec)\n", (double)count/arUtilTimer()); + printf("Enter new threshold value (current = %d): ", thresh); + scanf("%d",&thresh); while( getchar()!='\n' ); + pui->setARThreshold(thresh); + printf("\n"); + count = 0; + } + + /* turn on and off the debug mode with right mouse */ + if( key == 'd' ) { + printf("*** %f (frame/sec)\n", (double)count/arUtilTimer()); + mostrarDebugAR = 1 - mostrarDebugAR; + pui->desplegarImagenAR(mostrarDebugAR); + } + + if( key == '+' ) { + pui->setHminApuntador(pui->getHminApuntador()+5); + pui->setHmaxApuntador(pui->getHmaxApuntador()+5); + printf("*** Aumento hue: [%d,%d]\n", pui->getHminApuntador(),pui->getHmaxApuntador()); + } + + if( key == '-' ) { + pui->setHminApuntador(pui->getHminApuntador()-5); + pui->setHmaxApuntador(pui->getHmaxApuntador()-5); + printf("*** Disminuyo hue: [%d,%d]\n", pui->getHminApuntador(),pui->getHmaxApuntador()); + } + +} + +/* main loop */ +static void mainLoop(void) +{ + ARUint8 *dataPtr; + int err_deteccion; + + /* VIEJO1 + arUtilSleep(90000); + if( (dataPtr = (ARUint8 *)arVideoGetImage()) == NULL ) { + printf("sleep\n"); + arUtilSleep(2); + return; + } + if( count == 0 ) arUtilTimerReset(); + count++; + + if(img==NULL){ + img = crearImagenCv2(dataPtr,xsize,ysize); + } + */ + + /***** NUEVO 1 *****/ + if(dataPtr=pui->capturarImagenAR()==NULL){ + return; + }else{ + + /* VIEJO 2 + // detect the markers in the video frame + if( arDetectMarkerLite(dataPtr, thresh, &marker_info, &marker_num) < 0 ) { + cleanup(); + exit(0); + } + */ + /* NUEVO 2*/ + err_deteccion = pui->detectarYCalcularPosicionTodosMultiMarkers(); + if(err_deteccion==DETECCION_CORRECTA){ + /* *************** NO APLICA MAS, YA ESTA INCLUIDO EN NUEVO 3 ********************** + * if( (err=arMultiGetTransMat(marker_info, marker_num, config)) < 0 ) { + argSwapBuffers(); + return; + } + + if(err > 100.0 ) { + printf("saliendo 2\n"); + argSwapBuffers(); + return; + } + + if(mostrarVideo || dibujarCubos){ + argDrawMode3D(); + argDraw3dCamera( 0, 0 ); + glClearDepth( 1.0 ); + glClear(GL_DEPTH_BUFFER_BIT); + } + */ + + /**** VIEJO 4 + if(marker_num>0){ + for( i = 0; i < config->marker_num; i++ ) { + if( (dibujarCubos)&&(config->marker[i].visible >= 0) ){ + draw( config->trans, config->marker[i].trans, 0 ); + }else { + //printf("No visible: Width> %f",config->marker[i].width); + //printf("No visible: Center> (%f,%f)",config->marker[i].center[0],config->marker[i].center[1]); + + /* + * MARCADOR NO DETECTADO. + * * TENEMOS SUS COORDENADAS + * - Marker Coordinates (Xm,Ym) + * - Camera Coordinates (Xc,Yc) + * * NECESITAMOS SUS COORDENADAS + * - Ideal Screen Coordinates (xc,yc) + * + */ + /* double hXi_hYi[3][4]; + obtenerCoordenadasIdealesMarcadorNoDetectado(config->trans,config->marker[i],hXi_hYi,marcadoresOcultos[i].vertex); + + double Xi,Yi; + if(hXi_hYi[2][3]!=0){ //TODO que pasa si h==0? + marcadoresOcultos[i].centro[0] = hXi_hYi[0][3]/hXi_hYi[2][3]; + marcadoresOcultos[i].centro[1] = hXi_hYi[1][3]/hXi_hYi[2][3]; + }else{ + marcadoresOcultos[i].centro[0] = hXi_hYi[0][3]; + marcadoresOcultos[i].centro[1] = hXi_hYi[1][3]; + } + + if(dibujarCubos){ + dibujarPuntosMarcadorNoDetectado(Xi,Yi,marcadoresOcultos[i].vertex); + } + if(mostrarRadar){ + argDrawMode2D(); + dibujarMiniMarcador(0,0,marcadoresOcultos[i].vertex,0); + } + + int area = hayColision(i,dataPtr); //Chequea que algun apuntado este colisionando con el marcador i + if(area>0){ + int cant = registrarColision(i,&historico); + if(cant>=CANT_HISTORIA){ + correspondenciaCorrecta = 0; + correspondenciaIncorrecta = 0; + //printf("es de conjunto A y ") + if(config->marker[i].patt_id == idObjetoPUIActual){ + correspondenciaCorrecta = true; + printf("&&&&&&&&&&& COLISION CON MARCADOR %d &&&&&&&&&&&&&&&\n",i); + actualizarPantalla(); + correspondenciaCorrecta = false; + }else{ + correspondenciaIncorrecta = false; + printf("&&&&&&&&&&& COLISION CON MARCADOR %d &&&&&&&&&&&&&&&\n",i); + actualizarPantalla(); + } + + break; // Por ahora cuando se detecta la primera colision ya frenamos + }else{ + printf("Colision nro %d con marcador %d\n",cant,i); + } + } + + } + + } + }*/ + + /*********** NUEVO 4 ***********/ + idObjetoPUISeleccionado = pui->detectarSeleccion(); + if(idObjetoPUISeleccionado!=-1){ + printf("&&&&&&&&&&& COLISION CON MARCADOR %d &&&&&&&&&&&&&&&\n",idObjetoPUISeleccionado); + correspondenciaCorrecta = false; + correspondenciaIncorrecta = false; + if(pui->esRelacionCorrecta(idObjetoPUIActual,idObjetoPUISeleccionado)){ + correspondenciaCorrecta = true; + actualizarPantalla(); + correspondenciaCorrecta= false; + }else{ + correspondenciaIncorrecta=false; //FIXME tendriamos que poner correspondencia incorrecta en true + actualizarPantalla(); + } + } + }else if(err_deteccion==ERROR_NINGUN_MARCADOR_DETECTADO){ + //Equivalente a marker_num<=0 + }else if(err_deteccion==ERROR_DETECTANDO_MARCADORES){ + printf("Error detectando marcadores\n"); + }else if(err_deteccion==ERROR_CALCULANDO_MATRIZ_TRANSFORMACION){ + printf("Error calculando matriz de trasnformacion\n"); + }else if(err_deteccion==ERROR_IMAGEN_NULL){ + printf("Error! imagen es NULL\n"); + }else{ + printf("err_deteccion= %d \n",err_deteccion); + } + + if(mostrarVideo){ + /*VIEJO 3 + * argDrawMode2D(); + if( !arDebug ) { + argDispImage( dataPtr, 0,0 ); + } + else { + argDispImage( dataPtr, 1, 1 ); + if( arImageProcMode == AR_IMAGE_PROC_IN_HALF ) + argDispHalfImage( arImage, 0, 0 ); + else + argDispImage( arImage, 0, 0); + + glColor3f( 1.0, 0.0, 0.0 ); + glLineWidth(6.0); + for( i = 0; i < marker_num; i++ ) { + argDrawSquare( marker_info[i].vertex, 0, 0 ); + } + glLineWidth( 1.0 ); + }*/ + + /* NUEVO 3*/ + if(err_deteccion!=ERROR_IMAGEN_NULL){ + pui->desplegarImagenAR(false); + } + } + + //TODO como mostramos el radar con Pui? + /* if(mostrarRadar){ + argDrawMode2D(); + argCleanWindow(2,1); + dibujarLimitesPantalla(xsize, ysize); + for( i = 0; i < marker_num; i++ ) { + dibujarMiniMarcador(0,0,marker_info[i].vertex,1); + //printf() + //argDrawSquare( marker_info[i].vertex, 2, 1 ); + } + } + */ + + } +} + + +static void init( void ) +{ + + //Cargo archivo de configuracion de los elementosEnPantalla a detectar + // cantElementosCargados = leerConfiguracionElementos("prototipo1_SeleccionSimple.config",elementosEnPantalla,MAX_MARCADORES,clickSound,errorSound); + cantElementosCargados = pui->leerConfiguracionObjetosPUI("prototipo1_SeleccionSimple.config",MAX_MARCADORES); + printf("Se cargaron %d elementos\n",cantElementosCargados); + pui->imprimirPropiedadesObjetosPUI(); + + //Inicializacion de sdl + if(!initSDL(anchoPantalla,altoPantalla)){ + cleanup(); + exit(0); + } + CargarFondo("Data/prototipo1/fondoPrototipo1.bmp",1); + + + //Inicializo historial + pui->habilitarHistorico(true,CANT_HISTORIA,-1); + + idObjetoPUIActual = 0; + actualizarPantalla(); + +} + +/* cleanup function called when program exits */ +static void cleanup(void) +{ + arVideoCapStop(); + arVideoClose(); + argCleanup(); + cleanUpSDL(); +} |