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-07 04:35:42 (GMT)
committer pgperui <pgperui@65703dd9-322d-4ecd-a169-f49c4620ba53>2011-06-07 04:35:42 (GMT)
commit638e1993b83bdb6cf9a0ba298610ce98888f449d (patch)
tree14cf5361ef2cd5ebcaec3521dcdf3ecf0a2042ca
parent1bf95b711899c53024284d359dfc1d43ba171a52 (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.h5
-rw-r--r--Utilidades/src/Pui.cpp166
-rw-r--r--Utilidades/src/Pui.h18
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);