diff options
author | pgperui <pgperui@65703dd9-322d-4ecd-a169-f49c4620ba53> | 2011-07-27 05:03:53 (GMT) |
---|---|---|
committer | pgperui <pgperui@65703dd9-322d-4ecd-a169-f49c4620ba53> | 2011-07-27 05:03:53 (GMT) |
commit | ca3ff44009c333510439b490690380d87c0ebbc7 (patch) | |
tree | c13e4ef0bf5c9a6b9be09665d4e05ac90a7a035b | |
parent | 6c5754e5d80995c2b5554fb1f8cb453f4cc181b2 (diff) |
Al detectar los marcadores, si ocurre un error en ardetectmarker o getmultitransmat
entonces seteo la info de los marcadores en valores por defecto
git-svn-id: svn+ssh://lulu.fing.edu.uy/ens/home01/pgperui/repoSVN@193 65703dd9-322d-4ecd-a169-f49c4620ba53
-rw-r--r-- | Utilidades/src/Pui.cpp | 35 | ||||
-rw-r--r-- | Utilidades/src/Pui.h | 126 |
2 files changed, 97 insertions, 64 deletions
diff --git a/Utilidades/src/Pui.cpp b/Utilidades/src/Pui.cpp index b4bc932..83f11b4 100644 --- a/Utilidades/src/Pui.cpp +++ b/Utilidades/src/Pui.cpp @@ -183,7 +183,7 @@ void Pui::obtenerCoordenadasIdealesMarcadorNoDetectado(double markerToCameraMatr 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]; - 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 + arUtilMatMul(C_Por_Tcm,marker.trans,auxiliar); if(auxiliar[2][3]!=0){ vertex[i][0] = auxiliar[0][3]/auxiliar[2][3]; vertex[i][1] = auxiliar[1][3]/auxiliar[2][3]; @@ -953,6 +953,26 @@ void Pui::setAutoWhiteBalance(int habilitado, char * device){ } +void Pui::setearTodosLosMarcadoresNoVisibles(){ + for( int i = 0; i < this->dataArtoolkit.config->marker_num; i++ ) { + this->dataArtoolkit.coordenadas_marcadores[i].area = 0; + //Seteo centro + this->dataArtoolkit.coordenadas_marcadores[i].centro[0]= -1; + this->dataArtoolkit.coordenadas_marcadores[i].centro[1]= -1; + //Seteo vertices + this->dataArtoolkit.coordenadas_marcadores[i].vertex[0][0] = -1; + this->dataArtoolkit.coordenadas_marcadores[i].vertex[0][1] = -1; + this->dataArtoolkit.coordenadas_marcadores[i].vertex[1][0] = -1; + this->dataArtoolkit.coordenadas_marcadores[i].vertex[1][1] = -1; + this->dataArtoolkit.coordenadas_marcadores[i].vertex[2][0] = -1; + this->dataArtoolkit.coordenadas_marcadores[i].vertex[2][1] = -1; + this->dataArtoolkit.coordenadas_marcadores[i].vertex[3][0] = -1; + this->dataArtoolkit.coordenadas_marcadores[i].vertex[3][1] = -1; + + this->dataArtoolkit.coordenadas_marcadores[i].cf = 0; + this->dataArtoolkit.coordenadas_marcadores[i].visible = 0; + } +} /*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 */ @@ -969,36 +989,36 @@ int Pui::detectarYCalcularPosicionTodosMultiMarkers(){ if(debugMode){ printf("data->dataPtr es NULL\n"); } + this->setearTodosLosMarcadoresNoVisibles(); return ERROR_IMAGEN_NULL; } -printf("Detect 1\n"); + /*------------------- DETECCION DE LOS MARCADORES -----------------------------*/ if(this->dataArtoolkit.usarAlgoritmoLite){ - printf("Detect 1.1 lite\n"); res = arDetectMarkerLite(this->dataArtoolkit.dataPtr, this->dataArtoolkit.thresh, &this->dataArtoolkit.marker_info, &this->dataArtoolkit.marker_num); }else{ - printf("Detect 1.1 NO lite\n"); res = arDetectMarker(this->dataArtoolkit.dataPtr, this->dataArtoolkit.thresh, &this->dataArtoolkit.marker_info, &this->dataArtoolkit.marker_num); } if( res < 0 ) { - printf("Detect 1.2\n"); + this->setearTodosLosMarcadoresNoVisibles(); return ERROR_DETECTANDO_MARCADORES; }else{ -printf("Detect 2\n"); + /*----------------------------CALCULO POSICIONES RELATIVAS DE LOS MARCADORES------------------------------*/ if( (err=arMultiGetTransMat(this->dataArtoolkit.marker_info, this->dataArtoolkit.marker_num,this->dataArtoolkit.config)) < 0 ) { if(debugMode){ printf("detectarMultiMarkers: Error obteniendo matriz de transformacion\n"); } + this->setearTodosLosMarcadoresNoVisibles(); return ERROR_CALCULANDO_MATRIZ_TRANSFORMACION; }else if(err > 100.0){ if(debugMode){ printf("detectarMultiMarkers: Error elevado al calcular matriz de transformacion\n"); } + this->setearTodosLosMarcadoresNoVisibles(); return ERROR_CALCULANDO_MATRIZ_TRANSFORMACION; }else if(this->dataArtoolkit.marker_num>0){ - printf("Detect 3\n"); /*for( int i = 0; i < data->config->marker_num; i++ ) { if(data->config->marker[i].visible>=0){ @@ -1081,6 +1101,7 @@ printf("Detect 2\n"); } } }else{ //Ningun marcador detectado + this->setearTodosLosMarcadoresNoVisibles(); return ERROR_NINGUN_MARCADOR_DETECTADO; } } diff --git a/Utilidades/src/Pui.h b/Utilidades/src/Pui.h index 694b184..58c645f 100644 --- a/Utilidades/src/Pui.h +++ b/Utilidades/src/Pui.h @@ -263,6 +263,17 @@ private: * */ void initARConVideo(char * config_name,char * camera_para,char *vconf,int usarAlgoritmoRapido,int loopSpeed,double zoom); + /** + * Se invoca cuando no se puede detectar ningun marcador. + * En dichos casos se setean las propiedades de la estructura ARCoordMarcador con los + * siguientes valores: + * area = 0 + * vertices = (-1,-1) en todos los casos + * centro = (-1,-1) + * cf=0 + * visible=0 + */ + void setearTodosLosMarcadoresNoVisibles(); //TODO //void initAR(int usarAlgoritmoRapido);-->permitir no inicializar la captura de video @@ -370,68 +381,69 @@ public: char * getNombreRelacionObjetoPUI(int idObjeto); - /* Si hay algun apuntador tocando un marcador entonces devuelve el indice del marcador, + /** + * Si hay algun apuntador tocando un marcador entonces devuelve el indice del marcador, * de lo contrario retorna -1. Como máximo retorna el id de un sólo marcador aunque * puedan existir multiples selecciones * * Algoritmo de detección: * - * 1- Para cada marcador M no detectado: - * 1.1 - hay apuntador en el área correspondiente a M? - * 1.1.1 - Si ==> MarcadorSeleccionado = M - * break //termina el loop - * - * 2- Está habilitada la funciónalidad de historico? - * 2.1 - cantDeteccionesMarcador = Registrar detección (M) - * 2.2 - cantDeteccionesMarcador >= CANT_HISTORICO? - * 2.1 - Si ==> retorno M.id - * 2.2 - No ==> retonro -1 (aun no se llegó a detectar la selección sobre el mismo marcador la cantidad mínima - * de veces seguidas para decidir que realmente se haya producido una selección. Esta funcionalidad - * se denomina histórico y agrega robustez al algoritmo de detección evitando falsos positivos en - * los casos en que el apuntador no se detenga encima del marcador o que simplemente se haya introducido - * ruido en la imágen) - * - * Desarrollo del punto 1.1: - * Función hayApuntador: - * 1- Transformar la imagen original img a su respectiva representación en HSV(H:0-360,S:0-100,V:0-100) : img_hsv - * 2- Binarización de la imágen: - * 2.1: Para cada píxel P perteneciente a img_hsv: - * 2.1.1 : P está dentro de los rangos de color (definidos en la estructura RangosColorApuntador) ? - * 2.1.1.1 Si ==> img_mono[indice(P)] = 1 - * 2.1.1.2 No ==> img_mono[indice(P)] = 0 - * - * 3 - Aplicar cvSmooth (openCV) para eliminar ruido - * Si PropiedadesDeteccionApuntador.smooth El smooth o también conocido como blur (desenfoque) genera un borroneo en la - * ==> img_mono = cvSmooth(img_mono) imagen y se utiliza para reducir el ruido de la imagen. Se utiliza un vecindario de 7x7 píxeles para este filtro - * ------------------------------------------------------ - * 4 - Aplicar cvErode (openCV) para eliminar ruido. - * Si PropiedadesDeteccionApuntador.erode > 0 Esta operación se utiliza para eliminar las pequeñas manchas aisladas en - * ==> img_mono = cvErode(img_mono,PropiedadesDeteccionApuntador.erode) la imagen. La idea es que las pequeñas manchas desaparezcan pero que - * las áreas mas grandes y significativas queden visibles. Luego de aplicar - * este filtro deberían permanecer en la imágen binaria solamente aquellos - * objetos de tamaño significativo cuyo color estaba comprendido dentro de los - * rangos aplicados en la binarización. - * ------------------------------------------------------ - * 5- Aplicar cvDilate (openCV). - * Si PropiedadesDeteccionApuntador.dilate > 0 Se aplica dilate para conectar regiones cercanas y asi encontrar componentes - * ==>img_mono = cvDilate(img_mono,PropiedadesDeteccionApuntador.dilate) conectados. Muchas veces algunas regiones quedan con vacios que pueden ser producidos - * por ejemplo por un punto de luz u otro tipo de ruido. Una pequeña dilatación alrededor - * de estas regiones vacias puede terminar rellenandolas y produciendo un componente conexo sin - * agujeros. (luego se aproximan los componentes a polígonos y se hayan sus contornos) - * 6- Deteccion de contornos y calculo del area - * 6.1- contornos = calcularContonosExteriores(img_mono) Calcula solamente los contornos exteriores, no interesan aquellos contornos que estén anidados - * Si: PropiedadesDeteccionApuntador.enclosing_circle - * ==> area = area del circulo que circunscribe al contorno -- Se utiliza cvMinEnclosingCircle - * No: - * ==> area = area de la aproximacion por poligono del contorno -- Se utiliza poly = cvApproxPoly y area = cvContourArea(poly) - * 6.2 (area>=PropiedadesDeteccionApuntador.min_area && - * area<=(areaMarcador/PropiedadesDeteccionApuntador.factorProporcionApuntadorMarcador))? --Actualmente los chequeos de proporcion entre el area del - * Si:==>retorna area apuntador y el marcador no son de mucha utilidad porque no se - * No:==>retorna -1 logró una precisión tan exacta en los calculos de ambas áreas y - * los resultados son muy variables. - * En cambio es importante establecer un area minima y chequear que el - * area encontrada al menos la iguale, esto evita falsos positivos por ruido - * en la imagen u objetos con tonalidades similares al apuntador + * 1- Para cada marcador M no detectado: <br> + * 1.1 - hay apuntador en el área correspondiente a M? <br> + * 1.1.1 - Si ==> MarcadorSeleccionado = M <br> + * break //termina el loop <br> + * + * 2- Está habilitada la funciónalidad de historico? <br> + * 2.1 - cantDeteccionesMarcador = Registrar detección (M) v + * 2.2 - cantDeteccionesMarcador >= CANT_HISTORICO? <br> + * 2.1 - Si ==> retorno M.id <br> + * 2.2 - No ==> retonro -1 (aun no se llegó a detectar la selección sobre el mismo marcador la cantidad mínima <br> + * de veces seguidas para decidir que realmente se haya producido una selección. Esta funcionalidad <br> + * se denomina histórico y agrega robustez al algoritmo de detección evitando falsos positivos en <br> + * los casos en que el apuntador no se detenga encima del marcador o que simplemente se haya introducido <br> + * ruido en la imágen) <br> + * + * Desarrollo del punto 1.1: <br> + * Función hayApuntador: <br> + * 1- Transformar la imagen original img a su respectiva representación en HSV(H:0-360,S:0-100,V:0-100) : img_hsv <br> + * 2- Binarización de la imágen: <br> + * 2.1: Para cada píxel P perteneciente a img_hsv: <br> + * 2.1.1 : P está dentro de los rangos de color (definidos en la estructura RangosColorApuntador) ? <br> + * 2.1.1.1 Si ==> img_mono[indice(P)] = 1 <br> + * 2.1.1.2 No ==> img_mono[indice(P)] = 0 <br> + * + * 3 - Aplicar cvSmooth (openCV) para eliminar ruido <br> + * Si PropiedadesDeteccionApuntador.smooth El smooth o también conocido como blur (desenfoque) genera un borroneo en la <br> + * ==> img_mono = cvSmooth(img_mono) imagen y se utiliza para reducir el ruido de la imagen. Se utiliza un vecindario de 7x7 píxeles para este filtro <br> + * ------------------------------------------------------ <br> + * 4 - Aplicar cvErode (openCV) para eliminar ruido. <br> + * Si PropiedadesDeteccionApuntador.erode > 0 Esta operación se utiliza para eliminar las pequeñas manchas aisladas en <br> + * ==> img_mono = cvErode(img_mono,PropiedadesDeteccionApuntador.erode) la imagen. La idea es que las pequeñas manchas desaparezcan pero que <br> + * las áreas mas grandes y significativas queden visibles. Luego de aplicar <br> + * este filtro deberían permanecer en la imágen binaria solamente aquellos <br> + * objetos de tamaño significativo cuyo color estaba comprendido dentro de los <br> + * rangos aplicados en la binarización. <br> + * ------------------------------------------------------ <br> + * 5- Aplicar cvDilate (openCV). <br> + * Si PropiedadesDeteccionApuntador.dilate > 0 Se aplica dilate para conectar regiones cercanas y asi encontrar componentes <br> + * ==>img_mono = cvDilate(img_mono,PropiedadesDeteccionApuntador.dilate) conectados. Muchas veces algunas regiones quedan con vacios que pueden ser producidos <br> + * por ejemplo por un punto de luz u otro tipo de ruido. Una pequeña dilatación alrededor <br> + * de estas regiones vacias puede terminar rellenandolas y produciendo un componente conexo sin <br> + * agujeros. (luego se aproximan los componentes a polígonos y se hayan sus contornos) <br> + * 6- Deteccion de contornos y calculo del area <br> + * 6.1- contornos = calcularContonosExteriores(img_mono) Calcula solamente los contornos exteriores, no interesan aquellos contornos que estén anidados <br> + * Si: PropiedadesDeteccionApuntador.enclosing_circle <br> + * ==> area = area del circulo que circunscribe al contorno -- Se utiliza cvMinEnclosingCircle <br> + * No:<br> + * ==> area = area de la aproximacion por poligono del contorno -- Se utiliza poly = cvApproxPoly y area = cvContourArea(poly) <br> + * 6.2 (area>=PropiedadesDeteccionApuntador.min_area && <br> + * area<=(areaMarcador/PropiedadesDeteccionApuntador.factorProporcionApuntadorMarcador))? --Actualmente los chequeos de proporcion entre el area del <br> + * Si:==>retorna area apuntador y el marcador no son de mucha utilidad porque no se <br> + * No:==>retorna -1 logró una precisión tan exacta en los calculos de ambas áreas y <br> + * los resultados son muy variables. <br> + * En cambio es importante establecer un area minima y chequear que el <br> + * area encontrada al menos la iguale, esto evita falsos positivos por ruido <br> + * en la imagen u objetos con tonalidades similares al apuntador <br> * * * |