Os presento ahora una importante mejora que podemos introducir en nuestros programas de Realidad Aumentada: se trata de mejorar el tracking de marcadores para conseguir una imagen capturada más estabilizada. Para ello, utilizaremos la función histórica de ARToolKit.
ARToolKit incorpora una función de tratamiento del histórico de percepciones para estabilizar el tracking. Este histórico se implementa en una función alternativa a arGetTransMat que, en realidad, utiliza únicamente la percepción anterior, llamada arGetTransMatCont. Mediante el uso de esta función se elimina gran parte del efecto de registro tembloroso.
Salida del programa con histórico |
La función histórica requiere como parámetro la percepción anterior y no podrá utilizarse hasta que no dispongamos (al menos) de una percepción. Por esta razón, es necesario llamar primero a la función sin histórico arGetTransMat y, con la primera percepción, llamar a la función de histórico arGetTransMatCont. Esto lo conseguimos modificando ligeramente el código de la función mainLoop, una vez detectado el marcador, de la siguiente forma:
// transformacion relativa entre marca y la camara real
if (useCont && contAct) {
arGetTransMatCont(&marker_info[k], patt_trans, p_center,
p_width, patt_trans);
printf ("Usando historico!!!\n");
}
else {
useCont = 1; // En la siguiente iteracion lo podemos usar!
arGetTransMat(&marker_info[k], p_center, p_width, patt_trans);
printf ("Sin historico...\n");
}
draw(); // Dibujamos los objetos de la escena
} else {
useCont = 0;
printf ("Reset Historico (fallo de deteccion)\n");
}
Utilizamos la variable useCont (definida anteriormente) para indicarnos si ya podemos utilizar la función con histórico o no, en función de que tengamos capturado o no el primer frame. Esta variable de comportamiento booleano se tendrá que poner a false (valor 0) cuando no se detecte la marca. De este modo, si el usuario activó el uso del histórico (y ya tenemos al menos una percepción previa de la marca, utilizamos la función con histórico. En otro caso, llamaremos a la función de detección sin histórico y activaremos el uso del histórico para la siguiente llamada.
En nuestro programa, imtroducimos también una función de callback de teclado que permite activar el uso del histórico mediante la tecla h:
// ======== keyboard ================================================
static void keyboard(unsigned char key, int x, int y) {
switch (key) {
case 'H': case 'h':
if (contAct) {contAct = 0; printf("Historico Desactivado\n");}
else {contAct = 1; printf("Historico Activado\n");}
break;
case 0x1B: case 'Q': case 'q':
cleanup(); exit(1);
break;
}
}
static void keyboard(unsigned char key, int x, int y) {
switch (key) {
case 'H': case 'h':
if (contAct) {contAct = 0; printf("Historico Desactivado\n");}
else {contAct = 1; printf("Historico Activado\n");}
break;
case 0x1B: case 'Q': case 'q':
cleanup(); exit(1);
break;
}
}
Salida del programa
Esta es la salida del programa y los siguientes enlaces permiten descargar el código y el marcador utilizado (imagen para impresión y datos para el programa) y los ficheros de inicialización de la cámara. Todos los ficheros deberán estar en ...artoolkit\bin\Data.
código del programa histórico
marcador meditel
ficheros cámara
Salida del programa |
código del programa histórico
marcador meditel
ficheros cámara
No hay comentarios:
Publicar un comentario