diff options
author | pgperui <pgperui@65703dd9-322d-4ecd-a169-f49c4620ba53> | 2011-06-17 15:04:34 (GMT) |
---|---|---|
committer | pgperui <pgperui@65703dd9-322d-4ecd-a169-f49c4620ba53> | 2011-06-17 15:04:34 (GMT) |
commit | 07863ea80e9c15db4e6f99a5f97ad950ad1e44f2 (patch) | |
tree | 5d045dc4afa564f24a62e229dd88761c5e85c5ea | |
parent | 0517a67d893ec23923c3847a28c01b9c0c901595 (diff) |
git-svn-id: svn+ssh://lulu.fing.edu.uy/ens/home01/pgperui/repoSVN@181 65703dd9-322d-4ecd-a169-f49c4620ba53
-rw-r--r-- | Utilidades/src/Pui.cpp | 155 | ||||
-rw-r--r-- | Utilidades/src/Pui.h | 28 | ||||
-rw-r--r-- | Utilidades/src/UtilidadesSDL.cpp | 36 | ||||
-rw-r--r-- | Utilidades/src/UtilidadesSDL.h | 1 |
4 files changed, 159 insertions, 61 deletions
diff --git a/Utilidades/src/Pui.cpp b/Utilidades/src/Pui.cpp index 60653d2..9cd1b91 100644 --- a/Utilidades/src/Pui.cpp +++ b/Utilidades/src/Pui.cpp @@ -46,7 +46,6 @@ Pui::Pui() { this->resulCalc[0]=-1; this->resulCalc[1]=-1; - this->debugMode =0; this->zoomFactor = 1; this->cantidad_marcadores_calib = -1; @@ -140,6 +139,17 @@ void Pui::obtenerCoordenadasIdealesMarcadorNoDetectado(double markerToCameraMatr } } +char *get_buff( char *buf, int n, FILE *fp ) +{ + char *ret; + + for(;;) { + ret = fgets( buf, n, fp ); + if( ret == NULL ) return(NULL); + if( buf[0] != '\n' && buf[0] != '#' ) return(ret); + } +} + int Pui::leerConfiguracionObjetosPUI(const char* archivoConfiguracion,int max_elementos){ this->multimodalInfo.objetosPUI = new Elemento[max_elementos]; this->multimodalInfo.max_elementos = max_elementos; @@ -184,20 +194,27 @@ int Pui::leerConfiguracionObjetosPUI(const char* archivoConfiguracion,int max_el this->multimodalInfo.objetosPUI[i].idPatt = id; fgetc(fich);//consumo fin de linea - fscanf(fich,"%s\n",&(this->multimodalInfo.objetosPUI[i].imagen)); - fscanf(fich,"%s\n",&(this->multimodalInfo.objetosPUI[i].sonido)); - fscanf(fich,"%s\n",&(this->multimodalInfo.objetosPUI[i].nombre)); + + get_buff(str, 255, fich); + sscanf(str,"%s\n",(this->multimodalInfo.objetosPUI[i].imagen)); + + get_buff(str, 255, fich); + sscanf(str,"%s\n",(this->multimodalInfo.objetosPUI[i].sonido)); + + get_buff(str, 255, fich); + sscanf(str,"%s\n",(this->multimodalInfo.objetosPUI[i].nombre)); + fscanf(fich,"%d",&(this->multimodalInfo.objetosPUI[i].conjunto)); fgetc(fich); //consumo fin de linea fscanf(fich,"%d",&(this->multimodalInfo.objetosPUI[i].idElementoRelacionado)); fgetc(fich); //consumo fin de linea - largo = fscanf(fich,"%s\n",&(this->multimodalInfo.objetosPUI[i].nombreRelacion)); + get_buff(str, 255, fich); + sscanf(str,"%s\n",(this->multimodalInfo.objetosPUI[i].nombreRelacion)); this->multimodalInfo.objetosPUI[i].idImagenSDL = -1; fscanf(fich,"%c",&c); - //fscanf(fich,"%c",&c); if(c!='-'){ //El - indica que termina la configuracion de un elemento printf("Error en el archivo de configuracion, la configuracion del elemento %d no termina en -\n",i); res = 0; @@ -221,27 +238,27 @@ int Pui::leerConfiguracionObjetosPUI(const char* archivoConfiguracion,int max_el char * Pui::getNombreObjetoPUI(int idObjeto){ - if(idObjeto< this->multimodalInfo.max_elementos){ + if(idObjeto< this->multimodalInfo.cant_elementos_cargados){ return this->multimodalInfo.objetosPUI[idObjeto].nombre; }else{ - return ""; + return NULL; } } char * Pui::getSonidoObjetoPUI(int idObjeto){ - if(idObjeto< this->multimodalInfo.max_elementos){ + if(idObjeto< this->multimodalInfo.cant_elementos_cargados){ return this->multimodalInfo.objetosPUI[idObjeto].sonido; }else{ - return ""; + return NULL; } } char * Pui::getImagenObjetoPUI(int idObjeto){ - if(idObjeto< this->multimodalInfo.max_elementos){ + if(idObjeto< this->multimodalInfo.cant_elementos_cargados){ return this->multimodalInfo.objetosPUI[idObjeto].imagen; }else{ - return ""; + return NULL; } } @@ -252,14 +269,14 @@ char * Pui::getImagenObjetoPUI(int idObjeto){ */ bool Pui::esRelacionCorrecta(int idObjeto1,int idObjeto2){ bool res = false; - if(idObjeto1< this->multimodalInfo.max_elementos && idObjeto2< this->multimodalInfo.max_elementos){ + if(idObjeto1< this->multimodalInfo.cant_elementos_cargados && idObjeto2< this->multimodalInfo.cant_elementos_cargados){ res = this->multimodalInfo.objetosPUI[idObjeto1].idElementoRelacionado == idObjeto2; } return res; } int Pui::getConjuntoObjetoPui(int idObjeto){ - if(idObjeto< this->multimodalInfo.max_elementos){ + if(idObjeto< this->multimodalInfo.cant_elementos_cargados){ return this->multimodalInfo.objetosPUI[idObjeto].conjunto; }else{ return -1; @@ -267,7 +284,7 @@ int Pui::getConjuntoObjetoPui(int idObjeto){ } int Pui::getIdElementoRelacionado(int idObjeto){ - if(idObjeto< this->multimodalInfo.max_elementos){ + if(idObjeto< this->multimodalInfo.cant_elementos_cargados){ return this->multimodalInfo.objetosPUI[idObjeto].idElementoRelacionado; }else{ return -1; @@ -275,10 +292,10 @@ int Pui::getIdElementoRelacionado(int idObjeto){ } char* Pui::getNombreRelacionObjetoPUI(int idObjeto){ - if(idObjeto< this->multimodalInfo.max_elementos){ + if(idObjeto< this->multimodalInfo.cant_elementos_cargados){ return this->multimodalInfo.objetosPUI[idObjeto].nombreRelacion; }else{ - return ""; + return NULL; } } @@ -388,6 +405,14 @@ int Pui::getDebugConImagenes(){ return this->debugModeImagenes; } +void Pui::setDebugMode(int debugMode){ + this->debugMode = debugMode; +} + +int Pui::getDebugMode(){ + return this->debugMode; +} + void Pui::habilitarHistorico(bool habilitar,int cantHistorico,int valorInicial){ this->historicoHabilitado = habilitar; @@ -900,20 +925,9 @@ int Pui::detectarYCalcularPosicionTodosMultiMarkers(){ } /*------------------- DETECCION DE LOS MARCADORES -----------------------------*/ if(this->dataArtoolkit.usarAlgoritmoLite){ - printf("detectando marcadores Lite\n"); res = arDetectMarkerLite(this->dataArtoolkit.dataPtr, this->dataArtoolkit.thresh, &this->dataArtoolkit.marker_info, &this->dataArtoolkit.marker_num); - if(arImage!=NULL){ - printf("Luego detectMarkerLite arImage no es NULL\n"); - }else{ - printf("Luego detectMarkerLite arImage ES NULL\n"); - } }else{ res = arDetectMarker(this->dataArtoolkit.dataPtr, this->dataArtoolkit.thresh, &this->dataArtoolkit.marker_info, &this->dataArtoolkit.marker_num); - if(arImage!=NULL){ - printf("Luego detectMarker arImage no es NULL\n"); - }else{ - printf("Luego detectMarker arImage ES NULL\n"); - } } if( res < 0 ) { @@ -1053,20 +1067,9 @@ int Pui::detectarMarcadoresSimple(){ } /*------------------- DETECCION DE LOS MARCADORES -----------------------------*/ if(this->dataArtoolkit.usarAlgoritmoLite){ - printf("detectando marcadores Lite\n"); res = arDetectMarkerLite(this->dataArtoolkit.dataPtr, this->dataArtoolkit.thresh, &this->dataArtoolkit.marker_info, &this->dataArtoolkit.marker_num); - if(arImage!=NULL){ - printf("Luego detectMarkerLite arImage no es NULL\n"); - }else{ - printf("Luego detectMarkerLite arImage ES NULL\n"); - } }else{ res = arDetectMarker(this->dataArtoolkit.dataPtr, this->dataArtoolkit.thresh, &this->dataArtoolkit.marker_info, &this->dataArtoolkit.marker_num); - if(arImage!=NULL){ - printf("Luego detectMarker arImage no es NULL\n"); - }else{ - printf("Luego detectMarker arImage ES NULL\n"); - } } if( res < 0 ) { @@ -1076,25 +1079,43 @@ int Pui::detectarMarcadoresSimple(){ //idMarcadorDetectado double max_cf =0; int idDetectado = -1; + int index = -1; for( int i = 0; i < this->dataArtoolkit.marker_num; i++ ) { if(this->dataArtoolkit.marker_info[i].id>=0 && this->dataArtoolkit.marker_info[i].cf>max_cf && this->dataArtoolkit.marker_info[i].cf>=this->dataArtoolkit.cf ){ + max_cf = this->dataArtoolkit.marker_info[i].cf; idDetectado =this->dataArtoolkit.marker_info[i].id; - this->dataArtoolkit.coordenadas_marcadores[0].area = this->dataArtoolkit.marker_info[i].area; - this->dataArtoolkit.coordenadas_marcadores[0].centro[0] = this->dataArtoolkit.marker_info[i].pos[0]; - this->dataArtoolkit.coordenadas_marcadores[0].centro[1] = this->dataArtoolkit.marker_info[i].pos[1]; - this->dataArtoolkit.coordenadas_marcadores[0].cf = this->dataArtoolkit.marker_info[i].cf; - this->dataArtoolkit.coordenadas_marcadores[0].id = idDetectado; - this->dataArtoolkit.coordenadas_marcadores[0].vertex[0][0] = this->dataArtoolkit.marker_info[i].vertex[0][0]; - this->dataArtoolkit.coordenadas_marcadores[0].vertex[0][1] = this->dataArtoolkit.marker_info[i].vertex[0][0]; - this->dataArtoolkit.coordenadas_marcadores[0].vertex[1][0] = this->dataArtoolkit.marker_info[i].vertex[0][0]; - this->dataArtoolkit.coordenadas_marcadores[0].vertex[1][1] = this->dataArtoolkit.marker_info[i].vertex[0][0]; - this->dataArtoolkit.coordenadas_marcadores[0].vertex[2][0] = this->dataArtoolkit.marker_info[i].vertex[0][0]; - this->dataArtoolkit.coordenadas_marcadores[0].vertex[2][1] = this->dataArtoolkit.marker_info[i].vertex[0][0]; - this->dataArtoolkit.coordenadas_marcadores[0].vertex[3][0] = this->dataArtoolkit.marker_info[i].vertex[0][0]; - this->dataArtoolkit.coordenadas_marcadores[0].vertex[4][1] = this->dataArtoolkit.marker_info[i].vertex[0][0]; - this->dataArtoolkit.coordenadas_marcadores[0].visible = 1; //En modo MODO_SIMPLE la informacion siempre corresponde a un marcador visible - //porque fue detectado + index=i; + }else if(this->debugMode){ + if(this->dataArtoolkit.marker_info[i].id>=0){//Imprimo el marcador descartado + printf("marcador %d descartado. CF = %f maxCF=%f\n ",this->dataArtoolkit.marker_info[i].id,this->dataArtoolkit.marker_info[i].cf,max_cf); + } + } + if(idDetectado>=0 ){ + int cant =0; + if(this->historicoHabilitado){ + cant = registrarColision(i); + } + if(cant>=this->historico.cantHistorico || !this->historicoHabilitado){ + this->multimodalInfo.idSimpleMarcadorDetectado = idDetectado; + this->dataArtoolkit.coordenadas_marcadores[0].area = this->dataArtoolkit.marker_info[index].area; + this->dataArtoolkit.coordenadas_marcadores[0].centro[0] = this->dataArtoolkit.marker_info[index].pos[0]; + this->dataArtoolkit.coordenadas_marcadores[0].centro[1] = this->dataArtoolkit.marker_info[index].pos[1]; + this->dataArtoolkit.coordenadas_marcadores[0].cf = this->dataArtoolkit.marker_info[index].cf; + this->dataArtoolkit.coordenadas_marcadores[0].id = this->multimodalInfo.idSimpleMarcadorDetectado; + this->dataArtoolkit.coordenadas_marcadores[0].vertex[0][0] = this->dataArtoolkit.marker_info[index].vertex[0][0]; + this->dataArtoolkit.coordenadas_marcadores[0].vertex[0][1] = this->dataArtoolkit.marker_info[index].vertex[0][0]; + this->dataArtoolkit.coordenadas_marcadores[0].vertex[1][0] = this->dataArtoolkit.marker_info[index].vertex[0][0]; + this->dataArtoolkit.coordenadas_marcadores[0].vertex[1][1] = this->dataArtoolkit.marker_info[index].vertex[0][0]; + this->dataArtoolkit.coordenadas_marcadores[0].vertex[2][0] = this->dataArtoolkit.marker_info[index].vertex[0][0]; + this->dataArtoolkit.coordenadas_marcadores[0].vertex[2][1] = this->dataArtoolkit.marker_info[index].vertex[0][0]; + this->dataArtoolkit.coordenadas_marcadores[0].vertex[3][0] = this->dataArtoolkit.marker_info[index].vertex[0][0]; + this->dataArtoolkit.coordenadas_marcadores[0].vertex[4][1] = this->dataArtoolkit.marker_info[index].vertex[0][0]; + this->dataArtoolkit.coordenadas_marcadores[0].visible = 1; //En modo MODO_SIMPLE la informacion siempre corresponde a un marcador visible + //porque fue detectado + }else if(this->debugMode){ + printf("Deteccion nro %d con marcador %d\n",cant,i); + } } } }else{ //Ningun marcador detectado @@ -1722,12 +1743,13 @@ int Pui::leerPatternsModoSimple(const char* archivoConfiguracion){ } } } + dataArtoolkit.patts_id = new int[i]; for(int k=0;k<i;k++){ - this->multimodalInfo.cant_elementos_cargados = i; - printf("Se cargaron %d marcadores en MODO_SIMPLE\n",this->multimodalInfo.cant_elementos_cargados); this->dataArtoolkit.patts_id[k]=patts_id[k]; //Se suponen que los id siempre arrancan en 0 y van incrementando de a uno, //pero por las dudas copiamos los id que devuelve artoolkit al cargar los .patt } + this->multimodalInfo.cant_elementos_cargados = i; + printf("Se cargaron %d marcadores en MODO_SIMPLE\n",this->multimodalInfo.cant_elementos_cargados); fclose(fich); if(res>0){ res = i; //Retorna la CANTIDAD de elementos, por eso hay que sumar 1 @@ -1893,14 +1915,19 @@ void Pui::initARConVideo(char * config_name,char * camera_para,char *vconf,int u void Pui::initPuiConCapturaDeVideo(int modo,PropiedadesDeteccionApuntador propiedadesDeteccion,RangosColorApuntador rangosColorApuntador,char * config_name,char * camera_para,char *vconf,int usarAlgoritmoRapido,int loopSpeed,double zoom){ this->multimodalInfo.modo = modo; this->initARConVideo(config_name,camera_para,vconf,usarAlgoritmoRapido,loopSpeed,zoom);//no modificar el orden de las invocaciones! - this->initDeteccionApuntador(propiedadesDeteccion,rangosColorApuntador); + if(modo==MODO_MULTI_MARKERS){ + this->initDeteccionApuntador(propiedadesDeteccion,rangosColorApuntador); + } } /****Init Principal desde archivo de Configuracion****/ void Pui::initPuiConCapturaDeVideo(int modo,char* configuracionFileName,char * config_name,char * camera_para,char *vconf,int usarAlgoritmoRapido,int loopSpeed,double zoom){ this->multimodalInfo.modo = modo; this->initARConVideo(config_name,camera_para,vconf,usarAlgoritmoRapido,loopSpeed,zoom);//no modificar el orden de las invocaciones! - this->initDeteccionApuntador(configuracionFileName); + if(modo==MODO_MULTI_MARKERS){ + this->initDeteccionApuntador(configuracionFileName); + } + } @@ -1921,6 +1948,13 @@ void Pui::setPropiedadesColorApuntador(RangosColorApuntador rangosColorApuntador } +void Pui::cerrarVentanaGrafica(){ +#ifdef GLUT_HABILITADO + argCleanup(); +#else + fprintf(stderr, "Pui no compilada con soporte para manejo de ventanas.\n Es necesario recompilar Pui con la siguiente bandera: \n -DGLUT_HABILITADO=1"); +#endif +} void Pui::abrirVentanaGrafica(){ #ifdef GLUT_HABILITADO @@ -2005,6 +2039,7 @@ void Pui::setARThreshold(int threshold){ void Pui::finish(){ capStop(); + capClose(); //cleanupAR(); } @@ -2084,6 +2119,10 @@ void Pui::capStop(){ arVideoCapStop(); } +void Pui::capClose(){ + arVideoClose(); +} + double Pui::getFPS(){ return (double)this->count/arUtilTimer(); } diff --git a/Utilidades/src/Pui.h b/Utilidades/src/Pui.h index 22361c4..3a072da 100644 --- a/Utilidades/src/Pui.h +++ b/Utilidades/src/Pui.h @@ -533,6 +533,13 @@ public: void abrirVentanaGrafica(); /** + * Cierra la ventana abierta mediante la funcion Pui::abrirVentanaGrafica + * Invocar esta funcion al finalizar el programa + * Pui debe ser compilado con la bandera GLUT_HABILITADO , de lo contrario no hace nada + */ + void cerrarVentanaGrafica(); + + /** * Despliega video en la ventana abierta por la funcion Pui::abrirVentanaGrafica() * Pui debe ser compilado con la bandera GLUT_HABILITADO , de lo contrario no hace nada * @@ -564,6 +571,11 @@ public: */ void capStop(); + /** + * Finaliza la captura de video. + * Previo se debe llamar a capStop + */ + void capClose(); /***************************************************************************************************/ @@ -1019,6 +1031,8 @@ public: */ void finish(); + + /** * retorna la cantidad de imagenes procesadas por segundo y comienza el contador desde 0 nuevamente * FIXME : Chequear la funcionalidad @@ -1036,6 +1050,20 @@ public: * */ char* getModuleInfo(); + + /** + * Establece modo debug mediante impresiones en consola + * + * @param debugMode 1 en caso de que se quiera habilitar el modo debug en consola + * 0 para deshabilitarlo + */ + void setDebugMode(int debugMode); + + /** + * @return Retorna 1 si esta el modo debug habilitado, + * 0 en caso contrario + */ + int getDebugMode(); }; #endif diff --git a/Utilidades/src/UtilidadesSDL.cpp b/Utilidades/src/UtilidadesSDL.cpp index 1ed5034..0089091 100644 --- a/Utilidades/src/UtilidadesSDL.cpp +++ b/Utilidades/src/UtilidadesSDL.cpp @@ -98,7 +98,7 @@ int EscribirTexto(char* texto, int x, int y,int flip){ * Si se carga exitosamente retorna el id de la imagen, de lo contrario retorna -1 */ int PlayImageConTitulo(char* image, char* titulo,int x, int y,int flip){ -//TODO Tener 2 rectangulos como globales y usar updateRect en vez de crear nuevos + printf("Imagen = %s\n",image); tope++; imagenes[tope] = NULL; imagenes[tope] = SDL_LoadBMP(image); @@ -110,7 +110,7 @@ int PlayImageConTitulo(char* image, char* titulo,int x, int y,int flip){ SDL_BlitSurface(imagenes[tope], NULL, screen, &rectangulos[tope]); // OcultarZona(x,y-30,imagenes[tope]->w,imagenes[tope]->h,0); - // EscribirTexto(titulo,x,y-30,0); + EscribirTexto(titulo,x,y-30,0); if(flip){ /*Actualizo la pantalla*/ SDL_Flip(screen); @@ -123,6 +123,36 @@ int PlayImageConTitulo(char* image, char* titulo,int x, int y,int flip){ } } +/** + * Carga la imagen en las coordenadas (x,y) de la pantalla. + * Si se carga exitosamente retorna el id de la imagen, de lo contrario retorna -1 + */ +int PlayImageSinTitulo(char* image,int x, int y,int flip){ + printf("Imagen = %s\n",image); + tope++; + imagenes[tope] = NULL; + imagenes[tope] = SDL_LoadBMP(image); + + if(imagenes[tope]!=NULL){ + /* Dibujamos la imagen de fondo */ + rectangulos[tope].x=x; + rectangulos[tope].y=y; + SDL_BlitSurface(imagenes[tope], NULL, screen, &rectangulos[tope]); + + if(flip){ + /*Actualizo la pantalla*/ + SDL_Flip(screen); + } + return tope; + }else{ + tope--; + fprintf(stderr, "Error cargando imagen\n"); + return -1; + } +} + + + int OcultarImage(int idImagen, int flip){ if(idImagen<0 || idImagen>MAX_IMAGENES){ @@ -161,7 +191,7 @@ int mostrarImagen(int idImagen, int flip){ } return 1; }else{ - fprintf(stderr, "Error ocultando imagen\n"); + fprintf(stderr, "Error mostrando imagen\n"); return -1; } } diff --git a/Utilidades/src/UtilidadesSDL.h b/Utilidades/src/UtilidadesSDL.h index 6e85aa1..ea13b40 100644 --- a/Utilidades/src/UtilidadesSDL.h +++ b/Utilidades/src/UtilidadesSDL.h @@ -9,6 +9,7 @@ int initSDL(int width, int height);
int PlayImage(char* image, char* leyenda, int flip);
int PlayImageConTitulo(char* image, char* titulo,int x, int y, int flip);
+int PlayImageSinTitulo(char* image,int x, int y,int flip);
int PlaySound (char* soundfile);
int EscribirTexto(char* texto, int x, int y, int flip);
int CargarFondo(const char * imagen, int flip);
|