diff options
author | pgperui <pgperui@65703dd9-322d-4ecd-a169-f49c4620ba53> | 2011-06-07 04:35:42 (GMT) |
---|---|---|
committer | pgperui <pgperui@65703dd9-322d-4ecd-a169-f49c4620ba53> | 2011-06-07 04:35:42 (GMT) |
commit | 638e1993b83bdb6cf9a0ba298610ce98888f449d (patch) | |
tree | 14cf5361ef2cd5ebcaec3521dcdf3ecf0a2042ca | |
parent | 1bf95b711899c53024284d359dfc1d43ba171a52 (diff) |
git-svn-id: svn+ssh://lulu.fing.edu.uy/ens/home01/pgperui/repoSVN@177 65703dd9-322d-4ecd-a169-f49c4620ba53
-rw-r--r-- | Utilidades/src/EstructurasPublicas.h | 5 | ||||
-rw-r--r-- | Utilidades/src/Pui.cpp | 166 | ||||
-rw-r--r-- | Utilidades/src/Pui.h | 18 |
3 files changed, 153 insertions, 36 deletions
diff --git a/Utilidades/src/EstructurasPublicas.h b/Utilidades/src/EstructurasPublicas.h index 10af15f..78feeba 100644 --- a/Utilidades/src/EstructurasPublicas.h +++ b/Utilidades/src/EstructurasPublicas.h @@ -32,8 +32,9 @@ typedef struct { typedef struct { Elemento* objetosPUI; int max_elementos; - char* soundOK; - char* soundError; + int cant_elementos_cargados; + char soundOK[255]; + char soundError[255]; }PUI_Multimodal; typedef struct { diff --git a/Utilidades/src/Pui.cpp b/Utilidades/src/Pui.cpp index 4c49ddd..7be6692 100644 --- a/Utilidades/src/Pui.cpp +++ b/Utilidades/src/Pui.cpp @@ -115,17 +115,18 @@ void Pui::obtenerCoordenadasIdealesMarcadorNoDetectado(double markerToCameraMatr * | | * V3|________| V2 */ - //double auxiliar[3][4]; + + double auxiliar[3][4]; for(i=0;i<4;i++){ - //marker.trans[0][3] = marker.pos3d[i][0]; // Seteo la posicion del vertice Vi - //marker.trans[1][3] = marker.pos3d[i][1]; //FIXME si no funciona descomentar las 3 lineas - //arUtilMatMul(C_Por_Tcm,marker.trans,auxiliar); //FIXME Esta linea no es necesario. En vez de auxiliar tengo que usar hXi_hYi que ya esta calculado - if(hXi_hYi[2][3]!=0){ - vertex[i][0] = hXi_hYi[0][3]/hXi_hYi[2][3]; - vertex[i][1] = hXi_hYi[1][3]/hXi_hYi[2][3]; + marker.trans[0][3] = marker.pos3d[i][0]; // Seteo la posicion del vertice Vi + marker.trans[1][3] = marker.pos3d[i][1]; + arUtilMatMul(C_Por_Tcm,marker.trans,auxiliar); //FIXME Esta linea no es necesario. En vez de auxiliar tengo que usar hXi_hYi que ya esta calculado + if(auxiliar[2][3]!=0){ + vertex[i][0] = auxiliar[0][3]/auxiliar[2][3]; + vertex[i][1] = auxiliar[1][3]/auxiliar[2][3]; }else{ - vertex[i][0] = hXi_hYi[0][3]/hXi_hYi[2][3]; - vertex[i][1] = hXi_hYi[1][3]/hXi_hYi[2][3]; + vertex[i][0] = auxiliar[0][3]/auxiliar[2][3]; + vertex[i][1] = auxiliar[1][3]/auxiliar[2][3]; } } } @@ -167,21 +168,22 @@ int Pui::leerConfiguracionObjetosPUI(const char* archivoConfiguracion,int max_el while( (c!='\n') && (c!=EOF)&&(c!='&')){ printf("%c\n",c); + fscanf(fich,"%c",&c); } break; }else{ 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); - fscanf(fich,"%d",&this->multimodalInfo.objetosPUI[i].conjunto); + 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)); + fscanf(fich,"%d",&(this->multimodalInfo.objetosPUI[i].conjunto)); fgetc(fich); //consumo fin de linea - fscanf(fich,"%d",&this->multimodalInfo.objetosPUI[i].idElementoRelacionado); + fscanf(fich,"%d",&(this->multimodalInfo.objetosPUI[i].idElementoRelacionado)); fgetc(fich); //consumo fin de linea - largo = fscanf(fich,"%s\n",&this->multimodalInfo.objetosPUI[i].nombreRelacion); + largo = fscanf(fich,"%s\n",&(this->multimodalInfo.objetosPUI[i].nombreRelacion)); this->multimodalInfo.objetosPUI[i].idImagenSDL = -1; @@ -204,6 +206,7 @@ int Pui::leerConfiguracionObjetosPUI(const char* archivoConfiguracion,int max_el }else{ printf("No se puede leer el archivo de configuracion %s\n",archivoConfiguracion); } + this->multimodalInfo.cant_elementos_cargados = res; return res; } @@ -314,7 +317,7 @@ int Pui::leerConfiguracionCalibracion(const char* archivoConfiguracion, int cant void Pui::imprimirPropiedadesObjetosPUI(){ int i; - for(i=0;i<this->multimodalInfo.max_elementos;i++){ + for(i=0;i<this->multimodalInfo.cant_elementos_cargados;i++){ printf("IdPatt=%d\n",this->multimodalInfo.objetosPUI[i].idPatt); printf("IdPattElementoRelacionado=%d\n",this->multimodalInfo.objetosPUI[i].idElementoRelacionado); printf("Nombre=%s\n",this->multimodalInfo.objetosPUI[i].nombre); @@ -324,6 +327,8 @@ void Pui::imprimirPropiedadesObjetosPUI(){ printf("Sonido=%s\n",this->multimodalInfo.objetosPUI[i].sonido); printf("Conjunto=%d\n",this->multimodalInfo.objetosPUI[i].conjunto); } + printf("Sound OK = %s\n",this->multimodalInfo.soundOK); + printf("Sound Error = %s\n",this->multimodalInfo.soundError); } int Pui::detectarSeleccion(){ @@ -410,6 +415,38 @@ void Pui::procesarDatosCalibracion(){ } } + +void Pui::guardarSoloRangosColorApuntador(char * nombreArchivo) { + FILE *fich; + fich=fopen(nombreArchivo,"w"); + if(fich != NULL) { + fprintf(fich,"#\n%d %d\n%d %d\n%d %d\n-\n",this->propiedades.resultado_rangos_color.hmin, + this->propiedades.resultado_rangos_color.hmax, + this->propiedades.resultado_rangos_color.smin, + this->propiedades.resultado_rangos_color.smax, + this->propiedades.resultado_rangos_color.vmin, + this->propiedades.resultado_rangos_color.vmax); + fclose(fich); + } +} + +void Pui::guardarCalibracionApuntador(char * nombreArchivo,int area_min,float factorProporcionUnico,int erode, int dilate,int smooth,int usarEnclosingCircle){ + FILE *fich; + fich=fopen(nombreArchivo,"w"); + if(fich != NULL) { + fprintf(fich,"#\n%d %d\n%d %d\n%d %d\n%d\n%f\n%d\n%d\n%d\n%d\n-\n",this->propiedades.resultado_rangos_color.hmin, + this->propiedades.resultado_rangos_color.hmax, + this->propiedades.resultado_rangos_color.smin, + this->propiedades.resultado_rangos_color.smax, + this->propiedades.resultado_rangos_color.vmin, + this->propiedades.resultado_rangos_color.vmax, + area_min,factorProporcionUnico,erode,dilate,smooth,usarEnclosingCircle); + + fclose(fich); + } +} + + void Pui::guardarDatosCalibracion(const char* nombreArchivo){ FILE *arch = fopen(nombreArchivo,"w"); //Modo w: Si no existe el archivo lo creo, si ya existe lo sobrescribo. char aux[100]; @@ -818,7 +855,6 @@ void Pui::setAutoWhiteBalance(int habilitado, char * device){ int Pui::detectarYCalcularPosicionTodosMultiMarkers(){ int res; double err; - printf("Entro a detectarYCalcularPosicionTodosMultiMarkers\n"); if(count<INT_MAX) count++; else{ @@ -1126,6 +1162,13 @@ int Pui::aplicarNuevaMascaraCalibrador(int idMarcador,int tipoMascara){ }else{ //Cuando el marcador es no visible entonces el area no esta precalculada por ARtoolkit y es necesario calcularla area = aproximarArea(this->dataArtoolkit.coordenadas_marcadores[indice].vertex); printf("El area NO esta calculada. Su aproximacino es %d\n",area); + if(area==0){ + printf("ERROR AREA 0! --> indice=%d --- visible=%d ---- v0=(%d,%d) - v1=(%d,%d) -v2=(%d,%d) -v3=(%d,%d) \n",indice,this->dataArtoolkit.coordenadas_marcadores[indice].visible, + this->dataArtoolkit.coordenadas_marcadores[indice].vertex[0][0],this->dataArtoolkit.coordenadas_marcadores[indice].vertex[0][1], + this->dataArtoolkit.coordenadas_marcadores[indice].vertex[1][0],this->dataArtoolkit.coordenadas_marcadores[indice].vertex[1][1], + this->dataArtoolkit.coordenadas_marcadores[indice].vertex[2][0],this->dataArtoolkit.coordenadas_marcadores[indice].vertex[2][1], + this->dataArtoolkit.coordenadas_marcadores[indice].vertex[3][0],this->dataArtoolkit.coordenadas_marcadores[indice].vertex[3][1]); + } } //area = (radio)*(radio)*PI ==> radio = SQRT(area/PI) @@ -1236,6 +1279,16 @@ int Pui::aplicarMascaraCalibrador(int tipoMascara){ return MASCARA_APLICADA; } + +void Pui::setAchicarRadioMascaraCircular(int restarAlRadio){ + this->propiedades.restarAlRadio = restarAlRadio; +} + +int Pui::getAchicarRadioMascaraCircular(){ + return this->propiedades.restarAlRadio; +} + + unsigned char* Pui::getCalibrationImage(){ if(this->imageColor!=NULL){ return (unsigned char*)this->imageColor->imageData; @@ -1446,18 +1499,18 @@ int Pui::cargarConfiguracionDeteccionApuntadorDesdeArchivo(char * fileName) { if(fich != NULL) { fscanf(fich," %c",&c); if(c=='#'){ //si el separador es correcto y no es fin de fichero carga valores; - fscanf(fich,"%d",&this->propiedades.resultado_rangos_color.hmin); - fscanf(fich,"%d",&this->propiedades.resultado_rangos_color.hmax); - fscanf(fich,"%d",&this->propiedades.resultado_rangos_color.smin); - fscanf(fich,"%d",&this->propiedades.resultado_rangos_color.smax); - fscanf(fich,"%d",&this->propiedades.resultado_rangos_color.vmin); - fscanf(fich,"%d",&this->propiedades.resultado_rangos_color.vmax); - fscanf(fich,"%d",&this->propiedadesDeteccion.min_area); - fscanf(fich,"%f",&this->propiedadesDeteccion.factorProporcionApuntadorMarcador); - fscanf(fich,"%d",&this->propiedadesDeteccion.erode); - fscanf(fich,"%d",&this->propiedadesDeteccion.dilate); - fscanf(fich,"%d",&this->propiedadesDeteccion.smooth); - fscanf(fich,"%d",&this->propiedadesDeteccion.enclosing_circle); + fscanf(fich,"%d",&(this->propiedades.resultado_rangos_color.hmin)); + fscanf(fich,"%d",&(this->propiedades.resultado_rangos_color.hmax)); + fscanf(fich,"%d",&(this->propiedades.resultado_rangos_color.smin)); + fscanf(fich,"%d",&(this->propiedades.resultado_rangos_color.smax)); + fscanf(fich,"%d",&(this->propiedades.resultado_rangos_color.vmin)); + fscanf(fich,"%d",&(this->propiedades.resultado_rangos_color.vmax)); + fscanf(fich,"%d",&(this->propiedadesDeteccion.min_area)); + fscanf(fich,"%f",&((this->propiedadesDeteccion.factorProporcionApuntadorMarcador))); + fscanf(fich,"%d",&(this->propiedadesDeteccion.erode)); + fscanf(fich,"%d",&(this->propiedadesDeteccion.dilate)); + fscanf(fich,"%d",&(this->propiedadesDeteccion.smooth)); + fscanf(fich,"%d",&(this->propiedadesDeteccion.enclosing_circle)); } fclose(fich); printf("*** Configuración HSV cargada ***\n"); @@ -1486,14 +1539,18 @@ int Pui::cargarConfiguracionDeteccionApuntadorDesdeArchivo(char * fileName) { void Pui::initImagenesOpenCVApuntador(){ /*Estas imagenes seran procesadas por funciones de opencv para detectar el apuntador*/ + printf("Inicialización de imagenes OpenCV para detección de apuntador (%d,%d)\n",this->dataArtoolkit.xsize,this->dataArtoolkit.ysize); + this->imageColorApuntador = crearImagenCv2((uchar*)this->dataArtoolkit.dataPtr,this->dataArtoolkit.xsize,this->dataArtoolkit.ysize); - this->imageMonoApuntador = cvCreateImage( cvGetSize(this->imageColorApuntador), 8, 3 );//convertImageRGBtoHSV(imageColor); + this->imageMonoApuntador = cvCreateImage( cvGetSize(this->imageColorApuntador), 8, 1); } int Pui::initDeteccionApuntador(char* configuracionFileName){ int res = cargarConfiguracionDeteccionApuntadorDesdeArchivo(configuracionFileName); if(res){ initImagenesOpenCVApuntador(); + }else{ + fprintf(stderr, "No se pudo cargar configuracion para la detección del apuntador\n"); } return res; } @@ -1702,6 +1759,55 @@ RangosColorApuntador Pui::getResultadosRangosColor(){ return this->propiedades.resultado_rangos_color; } + +void Pui::setHminApuntador(int hMin){ + +} + +int Pui::getHminApuntador(){ + +} + +void Pui::setHmaxApuntador(int hMax){ + +} + +int Pui::getHmaxApuntador(){ + +} + +void Pui::setSminApuntador(int vMin){ + +} + +int Pui::getSminApuntador(){ + +} + +void Pui::setSmaxApuntador(int vMax){ + +} + +int Pui::getSmaxApuntador(){ + +} + +void Pui::setVminApuntador(int vMin){ + +} + +int Pui::getVminApuntador(){ + +} + +void Pui::setVmaxApuntador(int vMax){ + +} + +int Pui::getVmaxApuntador(){ + +} + /** * Con la implementacion actual de video.c que trae artoolkit, * esta operacion NO HACE NADA, siempre retorna TRUE diff --git a/Utilidades/src/Pui.h b/Utilidades/src/Pui.h index 5ef6c44..4f58bd3 100644 --- a/Utilidades/src/Pui.h +++ b/Utilidades/src/Pui.h @@ -6,6 +6,7 @@ */ /*Incluyo Artoolkit*/ +#include <fcntl.h> #include <AR/param.h> #include <AR/ar.h> #include <AR/arMulti.h> @@ -20,11 +21,12 @@ #include <sys/ioctl.h> #include <linux/videodev.h> -#include <fcntl.h> #include "cvUtilities.h" #include "Estructuras.h" #include "Funciones.h" + + #ifndef PUI_H_ #define PUI_H_ @@ -109,9 +111,9 @@ private: IplImage* s_plane; IplImage* v_plane; - float h_ranges[]; - float s_ranges[]; - float v_ranges[]; + float h_ranges[2]; + float s_ranges[2]; + float v_ranges[2]; double resulCalc[2];//={-1,-1}; int debugMode ;//=0; int zoomFactor ;//= 1; @@ -299,6 +301,10 @@ public: * si antes no se llama al menos una vez a aplicarNuevaMascaraCalibrador entonces no se aplicara la mascara*/ int aplicarMascaraCalibrador(int tipoMascara); + void setAchicarRadioMascaraCircular(int restarAlRadio); + + int getAchicarRadioMascaraCircular(); + unsigned char* getCalibrationImage(); //TODO @@ -309,6 +315,10 @@ public: int calcularResultadosCalibracionApuntador(int factorThreshH,int minPorcentajeRuido); + void guardarSoloRangosColorApuntador(char * nombreArchivo); + + void guardarCalibracionApuntador(char * nombreArchivo,int area_min,float factorProporcionUnico,int erode, int dilate,int smooth,int usarEnclosingCircle); + //Setea la propiedad debug_imagenes en las props del calibrador void setDebugCalibracion(bool debug); |