Práctica

Práctica

En este apartado se presenta al alumno la librería Artoolkit y se explica el código de algunos de los ejemplos básicos con los que viene la librería, pudiendo comprobar de forma práctica la teoría comentada en el tema.

Sin embargo, antes de comenzar con las pruebas será necesario instalar una serie de librerías. La librería Artoolkit, como se ha comentado, es multiplataforma, por lo que se puede instalar tanto en Linux como en Windows o MacOS. En el presente texto se comentará como instalar la librería en linux, concretamente en Ubuntu 12.04. Para instalar la librería en windows se recomienda mirar el siguiente enlace.

Práctica: Instalar Artoolkit

Para empezar con la práctica, y suponiendo que el alumno tiene instalado el sistema operativo Ubuntu 12.04 en su ordenador, el alumno tendrá que descargarse e instalar los siguientes paquetes para poder compilar programas así como para obtener la librería ARToolkit:

  • build-essential
  • libgstreamer0.10-dev
  • freeglut3
  • freeglut3-dev
  • libxmu-dev
  • libv4l-dev
  • libxi-dev
Para instalarlos, podrá utilizar cualquier programa para instalación de paquetes (synaptic, aptitude) o bien, en consola, escribir la siguiente instrucción:

sudo apt-get install build-essential libgstreamer0.10-dev freeglut3 freeglut3-dev libxmu-dev libv4l-dev libxi-dev

Tras instalar estos paquetes hay que descargar artoolkit de la página oficial y descomprimir. Si se está trabajando con Ubuntu 10.04 la versión actual de ARToolkit (la 2.72.1) debería compilar sin problemas. Si se está trabajando con Ubuntu 12.04 la versión de ARToolkit 2.72.1 falla en la compilación por cambios en nombres de algunos ficheros en dicha versión de Ubuntu. En ese caso, antes de hacer ./Configure hay que abrir el fichero Configure con un editor de texto y justo tras la línea 210 (cat > $SED <<EOF) añadir lo siguiente:
s/\$(LDFLAG) \$(LIBS)/\$(LIBS) \$(LDFLAG)/
Tras el cambio las líneas 210 a 212 deberían quedar así:
cat > $SED <<EOF
s/\$(LDFLAG) \$(LIBS)/\$(LIBS) \$(LDFLAG)/
s/@VIDEO_DRIVER@/$VIDEO_DRIVER/
Tras hacer esto, cerrar el fichero Configure, abrir una consola y, dentro de la carpeta donde se haya descomprimido ARToolkit, teclear:
./Configure
Se debería obtener el siguiente menú:
Select a video capture driver.
1: Video4Linux
2: Video4Linux+JPEG Decompression (EyeToy)
3: Digital Video Camcoder through IEEE 1394 (DV Format)
4: Digital Video Camera through IEEE 1394 (VGA NONCOMPRESSED Image Format)
5: GStreamer Media Framework
Enter :
Aquí hay que seleccionar la opción 5 y pulsar intro. Se obtendrá el siguiente menú:
Do you want to create debug symbols? (y or n)
Enter :
Escoger 'y', y pulsar intro. A continuación se obtendrá el siguiente menú:
Build gsub libraries with texture rectangle support? (y or n)
GL_NV_texture_rectangle is supported on most NVidia graphics cards
and on ATi Radeon and better graphics cards
Enter :
Se escoge 'y' e intro. Tras esto se generaran los makefiles para compilar la librería. Ahora tan solo hay que hacer make, y esperar a que compile. Si se ha conseguido compilar correctamente Artoolkit, se tendrá una estructura de directorios como la siguiente:
  • bin. Aquí están los ejemplos y utilidades ejecutables de la librería Artoolkit.
  • doc. Documentación de la librería en formato html.
  • examples. Código fuente de los ejemplos.
  • include. Cabeceras de la librería Artoolkit.
  • libs. Librerías de Artoolkit.
  • patterns. Patrones en formato pdf para imprimir y usar. También hay una imagen con un patrón en blanco que permite crear nuestros propios patrones.
  • util. Código fuente de las utilidades.
Una vez familiarizado con la estructura de directorio, y antes de comenzar con los ejemplos, hay que comprobar que la cámara y gstreamer están correctamente configurados. Para ello probad alguno de los siguientes comandos:
gst-launch-0.10 v4l2src device=/dev/video0 ! ffmpegcolorspace ! identity name=artoolkit ! xvimagesink
gst-launch-0.10 v4l2src device=/dev/video0 ! ffmpegcolorspace ! identity name=artoolkit ! ximagesink
Esto debería abrir una ventana en la que se muestre la cámara. Si alguno de estos comandos funciona, entonces exportar la siguiente variable de entorno:
export ARTOOLKIT_CONFIG="v4l2src device=/dev/video0 use-fixed-fps=false ! ffmpegcolorspace ! capsfilter caps=video/x-raw-rgb,bpp=24 ! identity name=artoolkit ! fakesink"
Que permitirá indicar a Artoolkit que dispositivo de vídeo usar para abrir la cámara. Esta variable de entorno debe exportarse siempre que se ejecute un programa de ARToolkit, por lo que se recomienda insertar el comando en el fichero .bashrc. Si todo ha ido bien, dentro del directorio bin, ejecute:

videoTest

Si aparece una ventana que muestra la imagen capturada de la cámara, es que el vídeo está correctamente configurado en Artoolkit. En ese caso, pulse escape para cerrar la ventana, y a continuación ejecute:

simpleTest

Tras esto, aparecerá una ventana con la imagen capturada por la cámara (aparentemente igual a la abierta con videoTest). Ahora imprime en un folio el archivo patterns/pattHiro.pdf, que contiene un patrón de Artoolkit y muéstralo delante de la cámara (hay que tener en cuenta que el patrón debe mostrarse recto, no curvado, así que hay que intentar apoyarlo en alguna carpeta o en alguna superficie lisa). Tras mostrar el patrón delante de la cámara debería observarse algo parecido a lo siguiente:

Como se puede observar, se está colocando un cubo sobre la marca mostrada, y siempre y cuando el programa detecte la marca, colocará el cubo de forma "realista" sobre la marca. Si al hacer la prueba no se muestra nada sobre la marca, compruebe que hay suficiente luz en la habitación o entorno donde se esté ejecutando el programa.

Práctica: Dependencia con la luminosidad

Como ya se ha comentado, todo sistema basado en visión tiene una gran dependencia de la luminosidad. En este caso se propone una práctica en la que se modificará la luminosidad del entorno, y habrá que variar los parámetros de configuración de Artoolkit para que el programa siga funcionando a pesar de los cambios de luminosidad. En la imagen que se muestra un ejemplo en el que, aunque no ha cambiado la luminosidad del entorno, pero un pequeño cambio de ángulo en la marca hace que una de las esquinas refleje la luz y se deje de detectar, mientras que si se gira levemente se consigue detectar sin problema.

Este es un ejemplo de los problemas que pueden surgir al usar ARToolkit. Para que el alumno compruebe por sí mismo la dependencia con la luminosidad de la librería ARToolkit se pide que, desde consola y en el directorio bin, ejecute el programa: exview. A continuación, pulse la tecla d (teniendo seleccionada la ventana del programa) y ponga la marca Hiro ante la cámara. Si las condiciones luminosas son suficientes, debería mostrarse algo parecido a la siguiente imagen.

Como se puede ver en la ventana de debug (para eso pulsó la tecla d) se muestra la imagen binarizada, y se puede ver como se detecta el cuadrado perfectamente. Sin embargo, si se inclina la marca de forma que el reflejo haga que se pierda parte de la marca o si se cambia el umbral para binarizar (pulse tecla t en la ventana del programa) se perderá la marca, como se puede observar en esta imagen:

Se deja como tarea al alumno comprobar, con el programa y jugando con los niveles de umbral, las situaciones límites en las que se pierde la marca, y configurar el umbral de detección de forma adecuada para que se pueda detectar (en caso de que se pueda).

Práctica: Entendiendo el programa simpleTest

Tras observar una de las limitaciones de la librería ARToolkit, que es la dependencia con la luz y los reflejos, vamos a estudiar un poco como funciona el programa, y especialmente, comentar el código de uno de los ejemplos de ARToolkit, concretamente el ejemplo simpleTest.c (en examples/simpleTest).

Como se puede observar al abrir el fichero, lo primero que se hace en el main es llamar a init (que inicializa la captura de vídeo, lee los parámetros de la cámara y el patrón a detectar) y luego se pasa el bucle principal (la función mainloop), en la que se realizan los pasos indicados anteriormente y que toda aplicación de ARToolkit cumple, y que son:

  1. Captura una imagen de la cámara (función arVideoGetImage, llamada en la función mainLoop en la línea 75). La imagen capturada se almacena en dataPtr.
  2. Busca si hay alguna marca en la imagen (función arDetectMarker, llamada en la función mainLoop en la línea 86). Como se puede observar, se le pasa como parámetro la imagen capturada (dataPtr), el umbral a usar para binarizar (thres) y como salida devuelve la información de la marca detectada y el número de marcas detectadas.
  3. Si se ha detectado alguna marca (bucle for en la línea 95 de la función mainloop) se calcula la matriz de transformación para calcular la posición de la cámara (función arGetTransMat, llamada en la función mainLoop en la línea 107).
  4. Finalmente se dibujan los objetos virtuales sobre la marca si se ha detectado alguna (función draw llamada en la función mainloop en la línea 109).

Estos 4 pasos se repiten indefinidamente hasta que el usuario pulse la tecla escape para finalizar. En ese momento, se llama a la función cleanup, que libera los punteros con memoria reservada y finaliza el flujo de vídeo, permitiendo una finalización correcta el programa. Si el alumno desea estudiar en mayor profundidad el código o tiene alguna duda, se recomienda mirar el siguiente enlace.

Práctica: Cubos y más cubos...

Como práctica para el alumno se deja la tarea de modicar el código de la aplicación simpleTest de forma que en vez de mostrar un único cubo encima de la marca, se muestren 4 cubos alrededor de la marca como se muestra en la figura. Así pues, para empezar el alumno tendrá que identificar en que parte del programa deberá realizar los cambios, y luego aplicarlos.

NOTA: Cuando se modifique el código del fichero simpleTest.c, desde el directorio examples/simpleTest, en una consola, hay que escribir make para compilar el código y que los cambios escritos tengan efecto.

Obra publicada con Licencia Creative Commons Reconocimiento 2.5