Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpgperui <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)
commit07863ea80e9c15db4e6f99a5f97ad950ad1e44f2 (patch)
tree5d045dc4afa564f24a62e229dd88761c5e85c5ea
parent0517a67d893ec23923c3847a28c01b9c0c901595 (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.cpp155
-rw-r--r--Utilidades/src/Pui.h28
-rw-r--r--Utilidades/src/UtilidadesSDL.cpp36
-rw-r--r--Utilidades/src/UtilidadesSDL.h1
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);