Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/Utilidades/src/Utilidades.h
blob: 399b3a5ad1c0e9353d6bbd37b7e7dd2d1b046ac1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
/*
 * Utilidades.h
 *
 *  Created on: 26/05/2010
 * @author Sebastián Marichal
 * 		   sebastian_marichal@hotmail.com
 * 		   sebarocker@gmail.com
 *
 * Universidad de la República, Montevideo , Uruguay
 */

/*Incluyo Artoolkit*/
#include <AR/param.h>
#include <AR/ar.h>
#include <AR/arMulti.h>
#include <AR/gsub_lite.h>
#include <AR/gsub.h>
#include <AR/video.h>



/*Incluyo OpenGL*/
#include <GL/gl.h>
#include <GL/glut.h>

#include "cvUtilities.h"
#include "Estructuras.h"


#ifndef UTILIDADES_H_
#define UTILIDADES_H_


#define FORMA_APUNTADOR_CIRCULO	1
#define FORMA_APUNTADOR_RECTANGULAR	2
#define FORMA_APUNTADOR_MANO	3

#define ERROR_DETECTANDO_MARCADORES 4
#define ERROR_CALCULANDO_MATRIZ_TRANSFORMACION 5
#define ERROR_NINGUN_MARCADOR_DETECTADO 6
#define ERROR_IMAGEN_NULL 7
#define DETECCION_CORRECTA 8

#define MASCARA_APLICADA 9
#define MASCARA_NO_APLICADA 10

#define TIPO_MASCARA_BINARIA 11
#define TIPO_MASCARA_ATENUANTE 12

#define ERROR_TOMAR_MUESTRA_FORMA_NO_IMPLEMENTADA 13
#define ERROR_TOMAR_MUESTRA_OK 14


typedef struct {
	ARUint8 *dataPtr;	/*Imagen RBG*/
	ARMultiMarkerInfoT  *config;/*Estructura donde se almacena la informacion de configuracion de los marcadores y las matrices de transformacion*/
	ARMarkerInfo    *marker_info; /*Estructura donde se guarda la informacion de los marcadores detectados*/
	ARCoordMarcador *coordenadas_marcadores; /*Arreglo de tamano data->config->marker_num con las posiciones tanto de los marcadores detectados como los no detectados*/
	int marker_num;				/*Cantidad de marcadores detectados*/
	int thresh;					/*threshold que usa el algoritmo de deteccion de marcadores de artookit*/
	int usarAlgoritmoLite;		/*Indica si usar el algoritmo lite (mas rapido) o el algortimo no lite (mas lento pero mas preciso)*/
	int xsize,ysize;
	char           *cparam_name;
	ARParam         cparam;
}ArtoolkitData;


typedef struct {
	int threshCalculado; //Threshold resultado
	double* cf;			 //Promedio de cf (confidence value) para cada marcador usando threshCalculado.
						 //si cf[i]==-1 entonces no es posible detectar el marcador i
}ARMultiCalibracionData;

void initPropiedadesCalibracion(int veces_por_marcador,PropiedadesCalibracion *propiedades,ResultadosCalibracion *resultados, int cant_marcadores, int metodo,int debug);

void obtenerCoordenadasIdealesMarcadorNoDetectado(double markerToCameraMatrix[3][4],ARMultiEachMarkerInfoT marker,double hXi_hYi[3][4],double vertex[4][2]);

void dibujarPuntosMarcadorNoDetectado(double Xi, double Yi,double vertex[4][2]);

void dibujarLimitesPantalla(int xsize, int ysize);

void dibujarMiniMarcador(double xCenter, double yCenter, double vertex[4][2], int detectado);

void draw( double trans1[3][4], double trans2[3][4], int mode );

/*
 * Devuelve los extremos opuestos del cuadrado defindo por puntos del parametro vertex.
 *
 * 		--------> x
 * 		|   v0     v1			minimo = v0 ( v0.x + v0.y es la menor de las sumas)
 * 		|						maximo = v2 ( v2.x + v2.y es la mayor de las sumas)
 * 		|	v3	   v2
 * 	   y\/
 */
void calcularPuntoOrigen(double vertices[4][2],int* resultado );

int leerConfiguracionElementos(const char* archivoConfiguracion,  Elemento* elementos, int MAX_ELEMENTOS, char * clickSound, char *errorSound);

int leerConfiguracionCalibracion(const char* archivoConfiguracion, int cantMarcadores, char** imagenes);
void imprimirPropiedadesElementos(Elemento* elementos,int cantidadElementos);

/*Iniciliza el historico. En todas las posiciones setea valorInicial*/
void initHistorico(Historico *historico, int cantHistorico,int valorInicial);
/*Registra la colisino del marcador en el historico*/
int registrarColision(int idMarcador, Historico *historico);



//Calcula el promedio de los elementos. largo indica el largo del arreglo elementos
//double calcularPromedio(double* elementos,int largo);

//double calcularPromedio(int* elementos,int largo);

void procesarDatosCalibracion(PropiedadesCalibracion *propiedades,ResultadosCalibracion *resultados, int cantidad_marcadores);

void guardarDatosCalibracion(ResultadosCalibracion *resultados,const char* nombreArchivo,int cantidad_marcadores);
/**
 * busca el apuntador en toda la imagen
 * */
int detectarApuntador(ARUint8 *dataPtr,int invert,int minH,int maxH,int minS, int maxS,int minB, int maxB,
				   int area_min, int area_max, int max_apuntadores, CoordApuntador *apuntadores);





ARMultiCalibracionData* arCalibrarThresholdMultiMarker(ArtoolkitData* artoolkitData,int intervaloDescanso, int iteraciones,int imprimirDebug);

/*Se llama cuando el programa finaliza
 * Detiene la captura de video y finaliza SDL*/
void cleanupAll(void);


void setBrillo(int brillo, char * device);
void setAutoWhiteBalance(int habilitado,char * device);
void setAutoGain(int habilitado,char * device);
void setHorizontalFlip(int habilitado,char * device);


/*-------------  ARTOOLKIT Y CALIBRACION AUTOMATICA -------------*/


/*Devuelve la informacion de todos los marcadores
 * Tanto los marcadores  que no figuran en la estructura de dectados pero estan como visible o aquellos
 * que directamente estan como no visibles tendran su area y cf en -1 */
int detectarYCalcularPosicionTodosMultiMarkers(ArtoolkitData* data);

void desplegarImagen(ArtoolkitData* data);
void desplegarImagenLite(ArtoolkitData* data);

void capturarImagenAR(ArtoolkitData* data);

/*Inicializa el histograma en cero
 * Inicializa los resultados en los rangos maximos (H:0-360,S:0-100,V:0-100)
 * Registra la forma que se utilizara para detectar el apuntador (circulo, rectangulo, mano)
 * */
void initPropiedadesCalibracionSoloApuntador(int cantidad_de_muestras,int forma,ArtoolkitData* data, PropiedadesCalibracion *propiedades,
									  RangosColorApuntador rangos_escala,int h_bins, int s_bins, int v_bins,int debug);


/*A partir de los marcadores detectados selecciona uno y aplica la mascara segun la forma seleccionada
Como resultado se deja en data->dataPtr la imagen con la mascara aplicada
En data se debe encontrar el centro y los vertices del marcador de identificador idMarcador*/
int aplicarNuevaMascaraCalibrador(PropiedadesCalibracion* propiedades,ArtoolkitData* data,int idMarcador,int tipoMascara);

/*Solamente aplica una mascara previamente calculada por la funcion aplicarNuevaMascaraCalibrador
 * si antes no se llama al menos una vez a aplicarNuevaMascaraCalibrador entonces no se aplicara la mascara*/
int aplicarMascaraCalibrador(PropiedadesCalibracion* propiedades,ArtoolkitData* data,int tipoMascara);

/*Calcula el histograma filtrado por la mascara lo acumula al histograma calculado con las muestras
anteriores*/
int tomarMuestraApuntador(PropiedadesCalibracion *propiedades,ArtoolkitData* data);

int calcularResultadosCalibracionApuntador(PropiedadesCalibracion *propiedades,ArtoolkitData* data, int factorThreshH,int minPorcentajeRuido);

/**
 * recibe un boleano que indica si se desea mostrar la imagen en modo debug
 */
void mostrarImagenDebugAR(int debug);

/*Inicializacion de artoolkit
 * Si se quiere leer un archivo de configuracion para multi pattern entonces config_name debe contener la ruta del archivo, sino debe ser NULL
 * */
void initAR( ArtoolkitData* data ,char * config_name,char *vconf,int usarAlgoritmoRapido,double zoom);


void cleanupAR(void);

#endif /* UTILIDADES_H_ */