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-05-27 02:11:51 (GMT)
committer pgperui <pgperui@65703dd9-322d-4ecd-a169-f49c4620ba53>2011-05-27 02:11:51 (GMT)
commit6d5baf9e40ed428904fc8ff7a8cc3690dfd7409f (patch)
treea45302af7c5a0346deb965bd2f17115ce60e3313
parent40ce6c1d7b3184249bf8a86e03ad14e6bb5f7dd3 (diff)
git-svn-id: svn+ssh://lulu.fing.edu.uy/ens/home01/pgperui/repoSVN@174 65703dd9-322d-4ecd-a169-f49c4620ba53
-rw-r--r--multi/SRC/TocarAnimalesPUI.cpp507
1 files changed, 507 insertions, 0 deletions
diff --git a/multi/SRC/TocarAnimalesPUI.cpp b/multi/SRC/TocarAnimalesPUI.cpp
new file mode 100644
index 0000000..af85b76
--- /dev/null
+++ b/multi/SRC/TocarAnimalesPUI.cpp
@@ -0,0 +1,507 @@
+/*
+ * TocarAnimalesPui.cpp
+ * Author: smarichal
+ */
+#include "Pui.h"
+#include "UtilidadesSDL.h"
+#include <AR/gsub.h>
+#include <GL/gl.h>
+#include <GL/glut.h>
+
+ /*************************************************************************************************************************
+ * CONFIGURACIONES GENERALES DE LA APLICACION
+ *************************************************************************************************************************/
+int mostrarVideo = 0;
+int dibujarCubos = 0;
+int mostrarRadar = 1;
+
+ /*************************************************************************************************************************
+ * CONFIGURACION DE RECONOCIMIENTO DE COLORES
+ *************************************************************************************************************************/
+#define MIN_AREA 500
+//#define MAX_AREA 1500
+
+int min_area = MIN_AREA;
+//int max_area = MAX_AREA;
+float factor =1;
+#define MIN_H 0
+#define MAX_H 0
+#define MIN_S 0
+#define MAX_S 0
+#define MIN_B 0
+#define MAX_B 0
+#define CANT_HISTORIA 4
+#define UMBRAL 5
+#define UMBRAL_AREA_APUNTADOR 20 //El area del apuntador y el area del marcador tienen una relacion definida mediante calibracion. Usamos un
+ //umbral de error al que declaramos como UMBRAL_AREA_APUNTADOR. Es decir si la zona de estudio donde buscamos el
+ //apuntador mide 300 y la relacion es de 1/2 (el apuntador mide la mitad del marcador) entonces buscaremos apuntadores entre
+ //las cotas (150 - UMBRAL_AREA_APUNTADOR) y (150 - UMBRAL_AREA_APUNTADOR)
+#define ERODE 1
+#define DILATE 1
+#define SMOOTH 1
+#define OFFSET_ROI 5 //Cuanto mas grande mas grande sera el ROI donde busco el apuntador
+#define MIN_AREA_WIDTH_HEIGHT 5 //Este valor sirve para indicar cual es el area minima en la cual se busca un apuntador.
+ //Por ejemplo si el marcador se encuentra apenas dentro de la pantalla y el height o el width no superan este valor entonces
+ //el area no sera analizada en busca de un apuntador
+
+int umbral = UMBRAL;
+int minH = MIN_H, maxH = MAX_H, minS = MIN_S, maxS = MAX_S, minB = MIN_B,maxB = MAX_B;
+int num_apuntadores =0;
+int mostrarImagenDebug = 0;
+int debugImg = 0; //Parametro para hayObjetoColor. Si se le pasa 1 y se le pasa una ventana entonces va reproduciendo el ROI. Sino crea una ventana nueva pero detiene la aplicacion hasta tocar una tecla
+int idMarcadorMostrarImagenDebug = -1;
+
+ /********************************************************************************************************************************
+ * CONFIGURACION DE ARTOOLKIT Y MARCADORES
+ ********************************************************************************************************************************/
+
+#define MAX_MARCADORES 30
+/* set up the video format globals */
+
+#ifdef _WIN32
+char *vconf = "Data\\WDM_camera_flipV.xml";
+#else
+char *vconf = "";
+#endif
+
+int xsize, ysize;
+int thresh = 100;
+int count = 0;
+
+char *cparam_name = "Data/camera_para.dat";
+ARParam cparam;
+
+char *config_name = "Data/prototipo1/prototipo1.dat";
+ARMultiMarkerInfoT *config;
+
+
+IplImage* img =NULL;
+uchar* data1 =NULL;
+IplImage* mono_Image = NULL;
+
+/*La posicion i del arreglo corresponde al marcador con con patt_id=i*/
+ARCoordMarcador marcadoresOcultos[MAX_MARCADORES]; //MAX_MARCADORES es la maxima cantidad -1 de marcadores que la aplicacion puede manejar.
+
+
+Pui* pui;
+
+/**************************************************************************************************************************************
+ * ************************************************************************************************************************************
+ * VARIABLES DEL PROTOTIPO
+ * ************************************************************************************************************************************
+ * ************************************************************************************************************************************/
+
+typedef struct {
+ int idImagenSDL;
+}ElementoEnPantalla;
+
+
+
+/* Representacion de los elementosEnPantalla*/
+ElementoEnPantalla elementosEnPantalla[MAX_MARCADORES]; //El indice el elemento coincide con el id del elemento que tambien coincide con el id del marcador artoolkit
+int cantElementosCargados = 0;
+
+int idObjetoPUIActual = -1; //id del objeto PUI que esta en pantalla, con este elemento deberia corresponderse la seleccion del usuario para obtener una respuesta exitosa
+int idObjetoPUISeleccionado = -1; //id del objeto PUI que se ha seleccionado
+
+int correspondenciaCorrecta = 0; //indica si el elemento del conjunto A y el del conjunto B
+ // que se seleccionaron se corresponden
+int correspondenciaIncorrecta = 0;
+
+int xNombreRelacion = 200;
+int yNombreRelacion = 15;
+
+int xImagen = 135;
+int yImagen = 100;
+
+
+int anchoPantalla = 655;
+int altoPantalla = 700;
+
+//Son los id de las imagenes actualmente desplegadas en la pantalla
+int idSDLImagenPantalla = -1;
+
+int mostrarDebugAR = 0;
+#define CONJUNTO_A 0
+#define CONJUNTO_B 1
+
+
+
+ /***************************************************************************************************************************************
+ * DECALRACIONES DE FUNCIONES AUXILIARES
+ ****************************************************************************************************************************************/
+static void init(void);
+static void cleanup(void);
+static void keyEvent( unsigned char key, int x, int y);
+static void mainLoop(void);
+static void draw();
+
+int main(int argc, char **argv)
+{
+ pui = new Pui();
+ printf("InitAR\n");
+ pui->initPuiConCapturaDeVideo("pui.config",config_nameCalibrador,"Data/camera_para.dat",vconf,usarAlgoritmoRapido,pui->NORMAL_SPEED_LOOP,2.0);
+ pui->abrirVentanaGrafica();
+ pui->capStart();
+
+ init();
+ printf("main loop\n");
+ argMainLoop( NULL, keyEvent, mainLoop );
+ printf("---------------------");
+ return (0);
+}
+
+
+void proximoElemento(){
+ if(idObjetoPUIActual == cantElementosCargados -1){//TODO Vuelve a comenzar o mensaje de exito y finaliza??
+ idObjetoPUIActual = 0;
+ }else{
+ idObjetoPUIActual++;
+ }
+}
+
+void actualizarPantalla(){
+ if(idObjetoPUIActual!=-1){
+ if(elementosEnPantalla[idObjetoPUIActual].idImagenSDL == idSDLImagenPantalla && idSDLImagenPantalla >= 0){
+ printf("Se sigue con la misma imagen, no se hace nada");
+ }else{
+ if(idSDLImagenPantalla!=-1){
+ OcultarImage(idSDLImagenPantalla,0);
+ }
+ if( (elementosEnPantalla[idObjetoPUIActual].idImagenSDL == -1) ){ //Todavia no se cargo la imagen para este elemento
+ printf("voy a desplegar la imagen: %s\n",elementosEnPantalla[idObjetoPUIActual].imagen);
+ elementosEnPantalla[idObjetoPUIActual].idImagenSDL = PlayImageConTitulo(pui->getImagenObjetoPUI(idObjetoPUIActual),pui->getNombreObjetoPUI(idObjetoPUIActual),xImagen,yImagen,0);
+ idSDLImagenPantalla = elementosEnPantalla[idObjetoPUIActual].idImagenSDL; //Actualizo el id de la imagen mostrada actualmente
+ printf("IdSDLA = %d\n",idSDLImagenPantalla);
+ }else{
+ mostrarImagen(elementosEnPantalla[idObjetoPUIActual].idImagenSDL,0);
+ idSDLImagenPantalla = elementosEnPantalla[idObjetoPUIActual].idImagenSDL;
+ }
+ }
+
+ if(correspondenciaCorrecta){
+ OcultarZona(xNombreRelacion,yNombreRelacion,anchoPantalla - xNombreRelacion,yImagen - yNombreRelacion,0); //Borro la zona superior de la pantalla que es donde esta escrito el texto
+ EscribirTexto(elementosEnPantalla[idObjetoPUIActual].nombreRelacion,xNombreRelacion,yNombreRelacion,0);
+ PlaySound(elementosEnPantalla[idObjetoPUIActual].sonido);
+ }else if(correspondenciaIncorrecta){
+ PlaySound(errorSound);
+ }
+
+ }else{
+ EscribirTexto("Prototipo - Estado Inicial",xNombreRelacion,yNombreRelacion,0);
+ }
+ //Actualizo la pantalla
+ printf("Flip antes\n");
+ flip();
+ printf("Flip dsps\n");
+}
+
+
+static void keyEvent( unsigned char key, int x, int y)
+{
+ /* quit if the ESC key is pressed */
+ if( key == 0x1b ) {
+ printf("*** %f (frame/sec)\n", (double)count/arUtilTimer());
+ cleanup();
+ exit(0);
+ }
+
+
+ if( key == 'v' ) {
+ mostrarVideo = 1 - mostrarVideo;
+ if(!mostrarVideo){
+ argCleanWindow(0,0);
+ }
+ }
+
+ if( key == 'm' ) {
+ mostrarImagenDebug= 1 - mostrarImagenDebug;
+ }
+
+ if(key == 'i'){
+ printf("Ingrese marcador para debug (actual %d): ",idMarcadorMostrarImagenDebug);
+ scanf("%d",&idMarcadorMostrarImagenDebug); while( getchar()!='\n' );
+ printf("\n");
+ }
+
+ if( key == 'c' ) {
+ dibujarCubos = 1 - dibujarCubos;
+ if(!dibujarCubos){
+ argCleanWindow(0,0);
+ }
+ }
+
+ if( key == 'r' ) {
+ printf("Mostrar Radar\n");
+ mostrarRadar = 1 - mostrarRadar;
+ if(!mostrarRadar){
+ argCleanWindow(2,1);
+ }
+ }
+
+ if( key == SDLK_RETURN ) {
+ printf("Proximo\n");
+ proximoElemento();
+ actualizarPantalla();
+
+ }
+
+ if( key == 't' ) {
+ printf("count = %d\n",count);
+ printf("timer = %f\n",arUtilTimer());
+ printf("*** %f (frame/sec)\n", (double)count/arUtilTimer());
+ printf("Enter new threshold value (current = %d): ", thresh);
+ scanf("%d",&thresh); while( getchar()!='\n' );
+ pui->setARThreshold(thresh);
+ printf("\n");
+ count = 0;
+ }
+
+ /* turn on and off the debug mode with right mouse */
+ if( key == 'd' ) {
+ printf("*** %f (frame/sec)\n", (double)count/arUtilTimer());
+ mostrarDebugAR = 1 - mostrarDebugAR;
+ pui->desplegarImagenAR(mostrarDebugAR);
+ }
+
+ if( key == '+' ) {
+ pui->setHminApuntador(pui->getHminApuntador()+5);
+ pui->setHmaxApuntador(pui->getHmaxApuntador()+5);
+ printf("*** Aumento hue: [%d,%d]\n", pui->getHminApuntador(),pui->getHmaxApuntador());
+ }
+
+ if( key == '-' ) {
+ pui->setHminApuntador(pui->getHminApuntador()-5);
+ pui->setHmaxApuntador(pui->getHmaxApuntador()-5);
+ printf("*** Disminuyo hue: [%d,%d]\n", pui->getHminApuntador(),pui->getHmaxApuntador());
+ }
+
+}
+
+/* main loop */
+static void mainLoop(void)
+{
+ ARUint8 *dataPtr;
+ int err_deteccion;
+
+ /* VIEJO1
+ arUtilSleep(90000);
+ if( (dataPtr = (ARUint8 *)arVideoGetImage()) == NULL ) {
+ printf("sleep\n");
+ arUtilSleep(2);
+ return;
+ }
+ if( count == 0 ) arUtilTimerReset();
+ count++;
+
+ if(img==NULL){
+ img = crearImagenCv2(dataPtr,xsize,ysize);
+ }
+ */
+
+ /***** NUEVO 1 *****/
+ if(dataPtr=pui->capturarImagenAR()==NULL){
+ return;
+ }else{
+
+ /* VIEJO 2
+ // detect the markers in the video frame
+ if( arDetectMarkerLite(dataPtr, thresh, &marker_info, &marker_num) < 0 ) {
+ cleanup();
+ exit(0);
+ }
+ */
+ /* NUEVO 2*/
+ err_deteccion = pui->detectarYCalcularPosicionTodosMultiMarkers();
+ if(err_deteccion==DETECCION_CORRECTA){
+ /* *************** NO APLICA MAS, YA ESTA INCLUIDO EN NUEVO 3 **********************
+ * if( (err=arMultiGetTransMat(marker_info, marker_num, config)) < 0 ) {
+ argSwapBuffers();
+ return;
+ }
+
+ if(err > 100.0 ) {
+ printf("saliendo 2\n");
+ argSwapBuffers();
+ return;
+ }
+
+ if(mostrarVideo || dibujarCubos){
+ argDrawMode3D();
+ argDraw3dCamera( 0, 0 );
+ glClearDepth( 1.0 );
+ glClear(GL_DEPTH_BUFFER_BIT);
+ }
+ */
+
+ /**** VIEJO 4
+ if(marker_num>0){
+ for( i = 0; i < config->marker_num; i++ ) {
+ if( (dibujarCubos)&&(config->marker[i].visible >= 0) ){
+ draw( config->trans, config->marker[i].trans, 0 );
+ }else {
+ //printf("No visible: Width> %f",config->marker[i].width);
+ //printf("No visible: Center> (%f,%f)",config->marker[i].center[0],config->marker[i].center[1]);
+
+ /*
+ * MARCADOR NO DETECTADO.
+ * * TENEMOS SUS COORDENADAS
+ * - Marker Coordinates (Xm,Ym)
+ * - Camera Coordinates (Xc,Yc)
+ * * NECESITAMOS SUS COORDENADAS
+ * - Ideal Screen Coordinates (xc,yc)
+ *
+ */
+ /* double hXi_hYi[3][4];
+ obtenerCoordenadasIdealesMarcadorNoDetectado(config->trans,config->marker[i],hXi_hYi,marcadoresOcultos[i].vertex);
+
+ double Xi,Yi;
+ if(hXi_hYi[2][3]!=0){ //TODO que pasa si h==0?
+ marcadoresOcultos[i].centro[0] = hXi_hYi[0][3]/hXi_hYi[2][3];
+ marcadoresOcultos[i].centro[1] = hXi_hYi[1][3]/hXi_hYi[2][3];
+ }else{
+ marcadoresOcultos[i].centro[0] = hXi_hYi[0][3];
+ marcadoresOcultos[i].centro[1] = hXi_hYi[1][3];
+ }
+
+ if(dibujarCubos){
+ dibujarPuntosMarcadorNoDetectado(Xi,Yi,marcadoresOcultos[i].vertex);
+ }
+ if(mostrarRadar){
+ argDrawMode2D();
+ dibujarMiniMarcador(0,0,marcadoresOcultos[i].vertex,0);
+ }
+
+ int area = hayColision(i,dataPtr); //Chequea que algun apuntado este colisionando con el marcador i
+ if(area>0){
+ int cant = registrarColision(i,&historico);
+ if(cant>=CANT_HISTORIA){
+ correspondenciaCorrecta = 0;
+ correspondenciaIncorrecta = 0;
+ //printf("es de conjunto A y ")
+ if(config->marker[i].patt_id == idObjetoPUIActual){
+ correspondenciaCorrecta = true;
+ printf("&&&&&&&&&&& COLISION CON MARCADOR %d &&&&&&&&&&&&&&&\n",i);
+ actualizarPantalla();
+ correspondenciaCorrecta = false;
+ }else{
+ correspondenciaIncorrecta = false;
+ printf("&&&&&&&&&&& COLISION CON MARCADOR %d &&&&&&&&&&&&&&&\n",i);
+ actualizarPantalla();
+ }
+
+ break; // Por ahora cuando se detecta la primera colision ya frenamos
+ }else{
+ printf("Colision nro %d con marcador %d\n",cant,i);
+ }
+ }
+
+ }
+
+ }
+ }*/
+
+ /*********** NUEVO 4 ***********/
+ idObjetoPUISeleccionado = pui->detectarSeleccion();
+ if(idObjetoPUISeleccionado!=-1){
+ printf("&&&&&&&&&&& COLISION CON MARCADOR %d &&&&&&&&&&&&&&&\n",idObjetoPUISeleccionado);
+ correspondenciaCorrecta = false;
+ correspondenciaIncorrecta = false;
+ if(pui->esRelacionCorrecta(idObjetoPUIActual,idObjetoPUISeleccionado)){
+ correspondenciaCorrecta = true;
+ actualizarPantalla();
+ correspondenciaCorrecta= false;
+ }else{
+ correspondenciaIncorrecta=false; //FIXME tendriamos que poner correspondencia incorrecta en true
+ actualizarPantalla();
+ }
+ }
+ }else if(err_deteccion==ERROR_NINGUN_MARCADOR_DETECTADO){
+ //Equivalente a marker_num<=0
+ }else if(err_deteccion==ERROR_DETECTANDO_MARCADORES){
+ printf("Error detectando marcadores\n");
+ }else if(err_deteccion==ERROR_CALCULANDO_MATRIZ_TRANSFORMACION){
+ printf("Error calculando matriz de trasnformacion\n");
+ }else if(err_deteccion==ERROR_IMAGEN_NULL){
+ printf("Error! imagen es NULL\n");
+ }else{
+ printf("err_deteccion= %d \n",err_deteccion);
+ }
+
+ if(mostrarVideo){
+ /*VIEJO 3
+ * argDrawMode2D();
+ if( !arDebug ) {
+ argDispImage( dataPtr, 0,0 );
+ }
+ else {
+ argDispImage( dataPtr, 1, 1 );
+ if( arImageProcMode == AR_IMAGE_PROC_IN_HALF )
+ argDispHalfImage( arImage, 0, 0 );
+ else
+ argDispImage( arImage, 0, 0);
+
+ glColor3f( 1.0, 0.0, 0.0 );
+ glLineWidth(6.0);
+ for( i = 0; i < marker_num; i++ ) {
+ argDrawSquare( marker_info[i].vertex, 0, 0 );
+ }
+ glLineWidth( 1.0 );
+ }*/
+
+ /* NUEVO 3*/
+ if(err_deteccion!=ERROR_IMAGEN_NULL){
+ pui->desplegarImagenAR(false);
+ }
+ }
+
+ //TODO como mostramos el radar con Pui?
+ /* if(mostrarRadar){
+ argDrawMode2D();
+ argCleanWindow(2,1);
+ dibujarLimitesPantalla(xsize, ysize);
+ for( i = 0; i < marker_num; i++ ) {
+ dibujarMiniMarcador(0,0,marker_info[i].vertex,1);
+ //printf()
+ //argDrawSquare( marker_info[i].vertex, 2, 1 );
+ }
+ }
+ */
+
+ }
+}
+
+
+static void init( void )
+{
+
+ //Cargo archivo de configuracion de los elementosEnPantalla a detectar
+ // cantElementosCargados = leerConfiguracionElementos("prototipo1_SeleccionSimple.config",elementosEnPantalla,MAX_MARCADORES,clickSound,errorSound);
+ cantElementosCargados = pui->leerConfiguracionObjetosPUI("prototipo1_SeleccionSimple.config",MAX_MARCADORES);
+ printf("Se cargaron %d elementos\n",cantElementosCargados);
+ pui->imprimirPropiedadesObjetosPUI();
+
+ //Inicializacion de sdl
+ if(!initSDL(anchoPantalla,altoPantalla)){
+ cleanup();
+ exit(0);
+ }
+ CargarFondo("Data/prototipo1/fondoPrototipo1.bmp",1);
+
+
+ //Inicializo historial
+ pui->habilitarHistorico(true,CANT_HISTORIA,-1);
+
+ idObjetoPUIActual = 0;
+ actualizarPantalla();
+
+}
+
+/* cleanup function called when program exits */
+static void cleanup(void)
+{
+ arVideoCapStop();
+ arVideoClose();
+ argCleanup();
+ cleanUpSDL();
+}