Realidad Aumentada:
ARToolkit para animación de personajes
1.Realidad Aumentada:
1.1 ¿Qué es?
La realidad aumentada, consiste en la superposición de objetos o imágenes virtuales, sobre las imágenes del mundo real. Supone una inmersión, por parte del usuario, en un mundo que resulta de la “unión” entre el mundo real y el mundo virtual, ya que el usuario de este tipo de aplicaciónes, podrá ver (a traves de una cámara, o de dispositivos especiales de visión) objetos generados por ordenador que se integran en el mundo real.
1.2 Realidad Aumentada VS Realidad Virtual:
La realidad virtual pretende la inmersión del usuario en un mundo totalmente virtual, donde todo aquello que percibe ha sido generado por ordenador. El usuario se encuentra en un mundo distinto, aislado del mundo real, rodeado de objetos virtuales que no existen en la realidad, pero puede interactuar con ellos como si de verdad existieran.
En cambio, la realidad aumentada no pretende aislar al usuario del mundo real, sino complementar éste mediante objetos virtuales e imágenes generadas por ordenador. El usuario se encuentra inmerso en un mundo que tiene a la vez elementos virtuales y elementos reales con los que puede interactuar.
2. ARToolKit
2.1 ¿Qué es?
ArToolKit es un conjunto de librerias para C/C++ que sirven para la creación de aplicaciones de realidad aumentada. Para ello proporciona una serie de funciones para la captura de video y para la búsqueda de ciertos patrones ,en las imágenes capturadas, mediante técnicas de visión por computador. También proporciona una serie de ejemplos y utilidades de gran ayuda al programador que quiera realizar este tipo de aplicaciones.
2.2 ¿Cómo funciona?
Algo muy importante en las aplicaciones de realidad aumentada, es la necesidad de calcular el punto de vista de la cámara, para así poder realizar las operaciones necesarias sobre los objetos virtuales, para que estos se integren correctamente en el mundo real. Es decir, si queremos mostrar objetos virtuales, de modo que el usuario realmente se crea que existen en el mundo real, tendremos que realizar transformaciones sobre esos objetos de modo que el usuario los vea (a través de la cámara o dispositivo de captura utilzado) en la posición, tamaño, orientación e iluminación, en que esos objetos serían percibidos por el usuario en el mundo real en caso de que realmente estuvieran allí.
Para ello se utilizan unas plantillas de forma cuadrada, que se componen de un cuadrado negro con un cuadrado blanco cuatro veces más pequeño en su centro, y un dibujo sencillo en el interior del cuadrado blanco. La aplicación, utilizando las funciones y utilidades proporcionadas por ARToolKit, será capaz de detectar una de estas plantillas en las imágenes de video captutaradas.
Aquí se muestra un ejemplo de plantilla:
Una vez detectada una plantilla en una imagen, estudiando la orientación, posición y tamaño de la plantilla, la aplicación es capaz de calcular la posición y orientación relativa de la cámara respecto a la plantilla, y usando esta información podrá pasar a dibujar el objeto correspondiente sobre la imagen capturada mediante librerias externas a ARToolKit (por ejemplo glut y openGL), de modo que el objeto aparezca sobre la plantilla en la posición, orientación y tamaño correspondiente al punto de vista de la cámara, siempre que el programador de la aplicación así lo haya decidido, pues las posibilidades son muchas y pudiera ser que una vez obtenida esta información el programador decidiese utilizarla de otra forma, hacer otras operaciones distintas, etc.
El funcionamiento básico de una aplicación de ARToolkit es el siguiente:
Primero se captura un fotograma del mundo real mediante la cámara.
A continuación la imagen se umbraliza con cierto valor del umbral (threshold), de forma que los pixels cuya intensidad supere el valor del umbral son transformados en pixels de color negro. El resto se transforman en píxels blancos.
Se buscan y encuentran todos los marcos negros como los de la plantilla existentes en la imagen (en realidad al umbralizar la imagen el marco aparece blanco y el cuadrado blanco aparece negro).
Se compara el interior del marco con las plantillas de las que se tiene información almacenada.
Si la forma de la plantilla analizada y la plantilla almacenada coincide, se utiliza la información de tamaño y orientación de la plantilla almacenada para compararla con la plantilla que se ha detectado y así poder calcular la posición y orientación relativas de la camara a la plantilla, y se guarda en una matriz.
Se utiliza esta matriz para establecer la posición y orientación de la cámara virtual (transformación de la vista), lo que equivale a una transformación de las coordenadas del objeto a dibujar.
Al haber puesto la camara virtual en la misma posición y orientación que la camara real, el objeto virtual se dibuja sobre la plantilla, se renderiza y se muestra la imagen resultante, que contiene la imagen del mundo real y el objeto virtual superpuesto, alineado sobre la plantilla.
Se realiza el mismo proceso con los siguientes fotogramas.
El siguiente diagrama muestra el funcionamiento que se acaba de describir:
2.3 Instalación
2.3.1 Instalación en Windows
Software necesario:
ARToolkit 2.70 y DSVideoLib-0.0.4-win32: http://sf.net/projects/artoolkit
DirectX 9.0b SDK o superior (si se va a usar VC6 la version del directX SDK no puede ser otra que la 9.0b): http://msdn.microsoft.com/library/default.asp?url=/downloads/list/directx.asp
Extras del directX 9.0 SDK para C++: http://www.microsoft.com/downloads/details.aspx?FamilyID=bc7ddedd-af62-493d-8055-5e57bab71e1a
Pasos de instalación usando Microsoft Visual Studio 6:
Instalar el DirectX 9.0b SDK
Descomprimir ARToolKit (version 2.70) en la carpeta ARToolkit
Descomprimir DSVideoLib en ARToolKit\DSVideoLib
Copiar los ficheros DSVideoLib.dll y DSVideoLibd.dll desde ARToolKit\DSVideoLib\bin.vc60 al directorio bin de ARToolkit
Ejecutar el script register_filter.bat del directorio ARToolKit\DSVideoLib\bin.vc60
Descomprimir e instalar las librerías GLUT, para ello, se situarán (manualmente) los ficheros *.h y *.lib en los directorios ARToolKit\include\GL y ARToolKit\lib, respectivamente. Los ficheros *.dll se colocan o bien en el directorio system32 de windows o en el directorio en que van a estar los ejecutables (directorio ARToolKit\bin).
Ejecutar ARToolKit\Configure.win32.bat con lo que se creará el fichero ARToolKit\include\AR\config.h
Descomprimir en el directorio dx9sdkcp el fichero con los extras del directX 9 SDK para C++ (dx9sdkcp.exe) y copiar el directorio
dx9sdkcp\SDK (c++)\include a ARToolKit\directX\
Copiar el directorio dx9sdkcp\SDK (C++)\Samples\C++\DirectShow\BaseClasses a ARToolKit\directX\ (una vez se haya copiado este directorio,
y el directorio dx9sdkcp\SDK (c++)\include del punto anterior, si se desea puede borrarse el directorio dx9sdkcp ya que no lo necesitaremos más).
Abrir el proyecto de VS6 (fichero .dsw) con microsoft visual studio
Configurar los directorios include y lib en el microsoft visual studio (Menu Tools --> Options):
Include:
Añadir el directorio ARToolKit\include
Añadir el directorio ARToolKit\DsVideoLib\SRC
Añadir el directorio ARToolkit\directX\BaseClasses
Añadir el direcorio ARToolKit\directX y situarlo el primero de la lista, es muy importante que esté el primero
Lib:
Añadir a los directorios lib el directorio ARToolKit\lib
Compilar y construir las clases del proyecto: Si todo ha ido bien, se habrán generado los ficheros de ejemplo en el directorio ARToolKit\bin
Nota: En caso de tener tarjeta de TV, puede ser necesario desinstalarla o deshabilitarla, ya que sino al ejecutar los ejecutables podría aparecer la señal de TV en lugar de la de la camara.
2.3.2 Instalación en Linux
2.4 Ejemplos
ARToolKit 2.70 viene con los siguientes ejemplos:
calib_camera2d: Sirve para medir la distancia focal de la cámara y otros parámetros.
calib_cparamd: Sirve para medir las propiedades de la cámara.
calib_Distorsiond: Para medir la distorsion de la cámara.
collideTestd: Detecta colisiones entre plantillas. Marca las plantillas detectadas con líneas rojas y cuando están a cierta distancia una de otra, las marca en verde.
exviewd: Calcula y muestra la posición de la cámara a partir de la plantilla “Hiro”. Presionando 'd' muestra en una esquina al imagen umbralizada. Presionando 't' deja ajustar el valor del umbral.
graphicsTestd: Simplemente muestra una tetera girando para hacer una prueba de los gráficos.
loadMultipled: Reconoce las plantillas “Hiro” y el kanji “Hito”, y dibuja una esfera sobre la primera y un cubo sobre la segunda. Presionando 'd' muestra en una esquina la imagen umbralizada y con 't' permite ajustar el valor del umbral.
mkpattd: Sirve para crear nuevas plantillas a partir de una imagen de la plantilla capturada por la cámara. Presionando 't' se puede ajustar umbral.
modeTestd: Dibuja un cubo sobre la plantilla “Hiro”, un toroide sobre el kanji “Hito”, un cono sobre “samppatt1”, y una esfera sobre “samppatt2”. Presionando 'd' muestra en una esquina la imagen umbralizada. Y con 't' permite ajustar el valor del umbral.
multid: Muestra la señal de video de la cámara. Presionando 'd' muestra en una venana grande la imagen umbralizada y con 't' deja ajustar el valor del umbral. Si encuentra alguna de las plantillas, las marca en rojo sobre la imagen umbralizada.
opticald: Sirve para calibrar dispositivos de visión. Dibuja un cubo sobre “hiro”, un toroide sobre el kanji "Hito", un cono sobre “samppatt1”, y una esfera sobre “samppatt2”. Presionando 'd' muestra en una esquina la imagen umbralizada. Con 't' deja ajustar el valor del umbral
paddleInteraction: Dibuja una raqueta de paddle sobre “hiro”. Presionando 'd' muestra en una esquina la imagen umbralizada. Con 't' permite ajustar el valor del umbral utilizado.
paddleTestd: Dibuja una raqueta de paddle sobre “hiro”. Presionando 'd' muestra en una esquina la imagen umbralizada y pulsando la tecla 't' se puede ajustar el valor del umbral.
rangeTestd: Interacción entre la cámara y las plantillas. Dibuja una tetera sobre la plantilla “Hiro”, conforme la marca se acerca a la cámara el objeto aparece más pequeño.
relationTestd: Muestra un cono sobre el kanji “hito” y una esfera sobre “Hiro”, y además cuando encuentra las dos plantillas, muestra por consola una matriz 3x4 que refleja la diferencia de posición y rotación entre una plantilla y la otra.
simpleTestd: Muestra un cubo sobre la plantilla “Hiro”.
simpleTest2d: Muestra un cubo sobre la plantilla “Hiro”.
simpleLited: Muestra un cubo con una textura formada por degradados de color sobre la plantilla “Hiro”.
twoViewd: Para dispositivos con vision estereoscópica.
videoTestd: Muestra la señal de video de la cámara.