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-07-27 05:03:53 (GMT)
committer pgperui <pgperui@65703dd9-322d-4ecd-a169-f49c4620ba53>2011-07-27 05:03:53 (GMT)
commitca3ff44009c333510439b490690380d87c0ebbc7 (patch)
treec13e4ef0bf5c9a6b9be09665d4e05ac90a7a035b
parent6c5754e5d80995c2b5554fb1f8cb453f4cc181b2 (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.cpp35
-rw-r--r--Utilidades/src/Pui.h126
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>
*
*
*