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
sudo apt-get install build-essential libgstreamer0.10-dev freeglut3 freeglut3-dev libxmu-dev libv4l-dev libxi-dev
s/\$(LDFLAG) \$(LIBS)/\$(LIBS) \$(LDFLAG)/
cat > $SED <<EOF
s/\$(LDFLAG) \$(LIBS)/\$(LIBS) \$(LDFLAG)/
s/@VIDEO_DRIVER@/$VIDEO_DRIVER/
./Configure
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 :
Do you want to create debug symbols? (y or n)
Enter :
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 :
-
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.
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 ! ximagesinkEsto 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"
videoTest
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:
- 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.
- 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.
- 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).
- 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.