Mostrando entradas con la etiqueta renderización. Mostrar todas las entradas
Mostrando entradas con la etiqueta renderización. Mostrar todas las entradas

viernes, 26 de septiembre de 2014

Motivación de mi proyecto: Publicidad y Realidad Aumentada

La Realidad Aumentada es una tecnología incipiente en el mundo de la publicidad. La posibilidad de incluir contenido digital en una secuencia de vídeo o en la realidad observada a través de una cámara permite la generación de anuncios virtuales sobre imágenes reales. Datos, logotipos, fotografías e incluso secuencias de vídeo son añadidas sobre la realidad, perfectamente alineados con ésta, para generar novedosos anuncios publicitarios que parecen cobrar vida. La Realidad Aumentada no sustituye la realidad sino que la complementa, permitiendo personalizar, dotar de movimiento y sonido, la medición de resultados y la interactuación de las personas con los anuncios. En definitiva, el uso de tecnologías de Realidad Aumentada en publicidad permite a los nuevos anuncios llamar la atención de potenciales clientes.


publicidad en fachada
ejemplo de publicidad en fachada
conseguido
Son ya numerosas las aplicaciones de Realidad Aumentada que conectan el mundo real con el mundo virtual a partir de la detección de patrones. Las más prestigiosas marcas utilizan estas tecnologías en sus campañas publicitarias: IKEA, Adidas, Ford, BMW, Lego, FOX, Paramount, Ray Ban, Mac-Donalds son algunos de los ejemplos más conocidos, y muchas otras marcas están utilizado ya la Realidad Aumentada para llegar mejor a sus clientes potenciales.

El principal reto al que deben enfrentarse los sistemas de Realidad Aumentada es el denominado registro, que consiste en calcular la posición relativa de la cámara real respecto de la escena para poder generar imágenes virtuales correctamente alineadas con esa imagen real. Este registro debe ser preciso y robusto, y puede realizarse empleando diferentes tipos de sensores y técnicas. Las técnicas más extendidas son las que utilizan la geolocalización (localización por GPS) o el tracking visual (que emplea técnicas de visión por computador). Dentro de las segundas, las más utilizadas son las técnicas de tracking con marcas. La posibilidad de detectar un patrón en una secuencia de vídeo o en la realidad observada a través de una cámara permite la inclusión de contenido virtual sobre imágenes reales.

Los principales problemas que presentan las técnicas de geolocalización son los llamados "cañones urbanos", las zonas en las que las señales GPS de satélite se bloquean. Mientras que las técnicas de tracking con marcas presentan otro tipo de problemas como la identificación (oclusiones, puntos de vista, mala iluminación, etc), el seguimiento (inicio automático y recuperación del tracking al perder las referencias) y los entornos no controlados (tracking sin referencias previamente conocidas).

Dentro del tracking visual se están desarrollando alternativas al tracking con marcas como las nuevas tecnologías de tracking sin marcas, que emplean únicamente características naturales de la escena, sin la necesidad de llenar de patrones el campo de visión de la cámara. Muy al contrario, la posibilidad de detectar estructuras físicas que sean altamente detectables desde el punto de vista de la visión por computador como objetos, edificios, etc, permite situar sobre ellas anuncios virtuales; abriendo un amplio mundo de posibilidades para el sector publicitario.

Mi motivación

La motivación de este proyecto de "Detección y localización de estructuras planas para aplicaciones de Realidad Aumentada en Publicidad" es la aplicación de las nuevas tecnologías de Realidad Aumentada basadas en tracking sin marcadores dentro del mundo de la publicidad. Técnicas que son diferentes a las ya existentes de uso de marcadores o posicionamiento por geolocalización. Así, la principal aportación de este proyecto es una solución técnica para la detección y localización de estructuras planas en una secuencia de vídeo o en una imagen real sin el uso de técnicas de geolocalización o marcadores y la posibilidad de añadir sobre ella información virtual, tanto en ámbitos interiores como exteriores.

publicidad en fachada e interiores publicidad en fachada
publicidad en fachada publicidad en fachada
ejemplos conseguidos de publicidad en fachada e interiores


Los campos de aplicación de las técnicas propuestas en este proyecto pueden ser muchos, industria, diseño, medicina, arquitectura, educación y formación, ocio, etc. No obstante, el proyecto se plantea dentro del mundo de la publicidad por ser éste un sector de potencial crecimiento para estas tecnologías de Realidad Aumentada  en el presente y en el futuro.

Adicionalmente, una vocación personal por la formación y el gusto por comunicar, interactuar y compartir han motivado la creación de este blog ARexperience, en el que poder reflejar todos aquellos conceptos y experiencias relacionados con la Realidad Aumentada que han sido fundamentales para la búsqueda de información, preparación e inmersión inicial en el mundo de la Realidad Aumentada y de la Visión por Computador. En el blog se pueden encontrar pequeñas aplicaciones ARToolKit que se han realizado para experimentar y comprender mejor el funcionamiento de sus funciones, el manejo de sus variables, etc. También es posible encontrar en él algunos de los conceptos básicos de la visión por computador, el blending y la visualización 3D; conceptos a los que se irán añadiendo otros en futuras entradas. 

domingo, 22 de junio de 2014

Texturización con OpenGL

La texturización es una técnica ampliamente utilizada en el diseño de objetos 2D y 3D. Es, por tanto, muy útil a la hora del realizar el blending de objetos virtuales sobre una imagen real y perfectamente integrados en ella, que se realiza en la mayoría de las aplicaciones de Realidad Aumentada. Por este motivo, dedicaré un post a comentar los aspectos esenciales del proceso de texturización con primitivas OpenGL. Toda la información está extraída de un fantástico manual de José María Buades, el cual os recomiendo para completar lo aquí apuntado.


Gracias a la texturización el número de polígonos para representar un objeto se ve reducido enormemente. La texturización consiste en "pegar" un póster (una imagen) a una primitiva (un polígono) que sustituye (o complementa) el color de la primitiva. Si deseamos renderizar una pared de ladrillos, necesitamos un polígono para cada ladrillo, además de otros tantos para renderizar el espacio que hay entre estos, en cambio con texturas podemos renderizar una pared entera con solo un polígono y una textura que se repite a lo largo del polígono.

textura
ejemplo de textura
proceso texturización
proceso de texturización

En este caso la textura es 2D, pero puede ser de una dimensión o tres dimensiones (textura 3D). Además la textura puede contener una, dos, tres (R, G, B) o cuatro (R, G, B, A) componentes por texel (equivalente al pixel de una imagen). Lo más usual es tener una textura de dos dimensiones con tres componentes RGB.

Para OpenGL las texturas 1D, 2D o 3D son arrays uni, bi o tri-dimensionales respectivamente, que le pasaremos mediante una dirección de memoria. OpenGL no ofrece ningún mecanismo para llevar la textura desde un fichero hasta memoria, si deseamos cargar una textura debemos ser nosotros quienes usando alguna librería o el API correspondiente del SO cargue la imagen. Posteriormente debemos pasarla a un formato aceptado por OpenGL y finalmente se la entregamos a OpenGL como un puntero a memoria.

Pasos en la texturización
  1. Crear un objeto textura y especificar la textura para este objeto
  2. Indicar como como se aplica la textura a cada vértice
  3. Habilitar el mapeo de texturas
  4. Dibujar la escena, indicando las coordenadas de la textura y las coordenadas geométricas (vértices)
  5. Objetos textura
Los objetos textura son la encapsulación de una textura, al objeto textura le identifica un entero sin signo. Los objetos textura son creados y destruidos, pero no se comparten entre los distintos contextos de OpenGL (distintas ventanas). Las funciones relacionadas con los objetos texturas son las siguientes:

Para crear objetos textura:
void glGenTextures(GLsizei n, GLuint *textureNames): Solicitamos n objetos textura, el nombre o identificador de estos objetos son devueltos en textureNames que previamente le habremos reservado espacio.

Para eliminar objetos textura:
void glDeleteTextures(GLsizei n, GLuint *textures): Solicitamos que los n objetos textura especificados en textures sean borrados.

Para usar un objeto textura:
void glBindTexture(GLenum target, GLuint textureName): Selecciona la textura textureName como textura activa para el target especificado (GL_TEXTURE_1D, GL_TEXTURE_2D, GL_TEXTURE_3D). Con esta función marcamos el objeto textura como el objeto activo, tener un objeto textura como objeto activo tiene dos funcionalidades, indicar que textura se utiliza y sobre que textura modificamos los parámetros de texturización, estos parámetros los veremos más adelante

Para especificar la textura disponemos de tres funciones, una para cada dimensión, veremos la función para 2D glTexImage2D y es extensible lo mismo para 1D y 3D.

void glTexImage2D(GLenum target, GLint level, GLint internalFormat, GLsizi width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *texels)
  • target debe ser GL_TEXTURE2D.
  • level nivel de detalle, se usa cuando aplicamos técnicas de mipmapping, en nuestro caso cero.
  • internalFormat podemos elegir entre una variedad, generalmente GL_RGB. Hace referencia al tipo de textura que deseamos.
  • width, height y border indican el tamaño que debe ser (2n+b)x(2m+b). Normalmente el borde (b) es cero, un tamaño posible es 64x128. Si no especificamos un tamaño correcto la textura no se muestra.
  • format generalmente GL_RGB o GL_EXT_BGR.
  • type tipo en el que esta almacenada la textura, puede ser GL_BYTE, GL_UNSIGNED_BYTE, GL_SHORT, GL_UNSIGNED_SHORT, GL_INT, GL_UNSIGNED_INT, GL_FLOAT, GL_BITMAP. 
  • texels array que contiene la textura, de izquierda a derecha y de abajo a arriba.
Especificamos cual es la textura para el objeto textura activo. Es conveniente por cuestiones de rendimiento que por cada textura que utilicemos tengamos un objeto textura y mantener los objetos textura durante toda la aplicación, en lugar de crearlo y destruirlo cada vez que se usa la textura, o tener un solo objeto textura y modificar la textura que se utiliza.

Habilitar texturas

Ya hemos visto como crear texturas, especificar cual es la textura que contiene el objeto. Para habilitar o deshabilitar la texturización lo indicamos con la instrucción glEnable() pasando como parámetro el tipo de textura GL_TEXTURE_1D, GL_TEXTURE_2D o GL_TEXTURE_3D. En caso de que este habilitada más de uno se aplicará el tipo de mayor dimensión.

Dibujar la primitiva

Cuando renderizamos la primitiva, debemos asignar una coordenada textura a cada vértice. Podemos especificar la coordenada o dejar a OpenGL que la genere automáticamente a partir de un método seleccionado.

Para especificarla nosotros mismos lo hacemos con la función glTexCoord*(). A cada pixel se le asigna un texel interpolando las coordenadas textura de los vértices de la misma forma que se hacia para el color. Recordar que la coordenada de la textura igual que el color, la normal u otros parámetros se especifican antes de indicar el vértice, una vez indicado no se puede modificar.

Las coordenadas de la textura (s, t) varían de 0 a 1. Por ejemplo un textura de 128x64 su rango viene dado por [0,1]x[0x1], los números mayores a 1 representan que la textura se repite, p.e:

glBegin(GL_QUADS);
glColor3f(1.0, 1.0, 1.0);glTexCoord2f(0.0, 0.0);// s = 0 t = 0
glVertex3f(-1.0, -2.0, 0.0);

glTexCoord2f(0.0, 3.0);// s = 0 t = 3
glVertex3f(-1.0, 2.0, 0.0);

glTexCoord2f(2.0, 3.0);// s = 2 t = 3
glVertex3f(1.0, 2.0, 0.0);

glTexCoord2f(2.0, 0.0);// s = 2 t = 0
glVertex3f(1.0, -2.0, 0.0);
glEnd();


Este ejemplo extiende la textura en el cuadrado repitiéndola 3 veces verticalmente y 2 veces horizontalmente. Otra posibilidad es que asigne el ultimo texel de la textura cuando la coordenada sale del rango [0, 1]. La selección entre un método u otro se hace con la función siguiente:

void glTexParameter{if}(GLenum target, GLenum pname, TYPE param): Indica como se trata la textura, target puede valer GL_TEXTURE_1D, GL_TEXTURE_2D o GL_TEXTURE_3D.

En función de pname tiene un significado u otro, aquí solo queda explicado lo referente a la extensión de la textura.

ParametroValores posiblesSignificado
GL_TEXTURE_WRAP_SGL_CLAMP, GL_CLAMP_TO_EDGE, GL_REPEATGL_CLAMP utiliza el color de borde en las coordenadas fuera del rango [0, 1]
GL_TEXTURE_WRAP_TGL_CLAMP, GL_CLAMP_TO_EDGE, GL_REPEATGL_CLAMP_TO_EDGE ignora el color de borde y usa el texel más próximo del rango [0, 1]
GL_TEXTURE_WRAP_RGL_CLAMP, GL_CLAMP_TO_EDGE, GL_REPEATGL_REPEAT repite la textura, usa como coordenada el modulo 1 de la coordenada especificada
GL_TEXTURE_BORDER_COLORUn array RGBEspecifica el color del borde


Aplicar texturas

Una textura es un póster que adherimos al polígono, este póster los podemos combinar con el color del polígono, lo que nos abre un abanico de posibilidades. Podemos elegir entre cuatro modos de combinar el color del polígono con el color de la textura. La asignación del método para combinar el color y la textura se realiza con la función glTexEnv* :

void glTexEnv{if}{v}(GLenum target, GLenum pname, TYPE param): Indica cual es la función de texturización, target debe valer GL_TEXTURE_ENV.

Si pname vale GL_TEXTURE_ENV_MODE param puede valer GL_DECAL, GL_REPLACE, GL_MODULATE o GL_BLEND, para especificar como se mezcla el color del polígono con la textura. Si pname vale GL_TEXTURE_ENV_COLOR param es un array de cuatro puntos flotantes representando las componentes R, G, B, A. Estos valores solo se usan si se ha especificado el modo GL_BLEND.

Para simplificar veremos por encima que es cada modo cuando la textura es RGB, a continuación veremos una tabla donde se puede ver las fórmulas de combinación para cada modo, estos dependen de las componentes que especifica la textura.

GL_DECAL, GL_REPLACE : Usa el color de la textura, ignora el color del polígono.
GL_MODULATE : Usa el color de la textura multiplicado por el color del polígono, es útil para renderizar con iluminación las texturas. Con la iluminación activa, se renderiza el polígono en color blanco, que multiplicado por la textura, nos servirá como escalar de la cantidad de iluminado que esta.
GL_BLEND : Mezcla el color del polígono y el color especificado en GL_TEXTURE_ENV_COLOR, en las proporciones definidas por la textura.

Formato TexturaGL_REPLACEGL_MODULATEGL_DECALGL_BLEND
GL_ALPHAC = CfA = AtC = Cf
A = Af·At
undefinedC = Cf
A = Af·At
GL_LUMINANCEC = LtA = AfC = Cf·Lt
A = Af
undefinedC = Cf·(1 - Lt) + Cc·Lt
A = Af
GL_LUMINANCE_ALPHAC = ItA = AtC = Cf·Lt
A = Af·At
undefinedC = Cf·(1 - Lt) + Cc·Lt
A = Af·At
GL_INTENSITYC = ItA = ItC = Cf·It
A = Af·It
undefinedC = Cf·(1 - It) + Cc·It
A = Af·(1 - It) + Ac·It
GL_RGBC = CtA = AfC = Cf·Ct
A = Af
C = Ct
A = Af
C = Cf·(1 - Ct) + Cc·CtA = Af
GL_RGBAC = CtA = AtC = Cf·Ct
A = Af·At
C = Cf·(1 - At) + Ct·At
A = Af·At
C = Cf·(1 - Ct) + Cc·CtA = Af·At

Este es el resultado de un buen texturizado

texturización
ejemplo de imagen texturizada



lunes, 12 de mayo de 2014

AR Conceptos III

Esta es la tercera entrada de la serie de AR Conceptos, como en las anteriores, realizaré un listado y una breve explicación de los más importantes sin dejar, por ello, de dedicar diferentes entradas a otros tantos conceptos que requieran una explicación mayor.


Visualización 3D o gráficos 3D por ordenador

Es es conjunto de tecnologías y técnicas gráficas desarrolladas mediante software específico para crear objetos o diseños gráficos tridimensionales. Un gráfico 3D difiere de uno bidimensional principalmente por la forma en que ha sido generado. Este tipo de gráficos se originan mediante un proceso de cálculos matemáticos sobre entidades geométricas tridimensionales producidas en un ordenador, y cuyo propósito es conseguir una proyección visual en dos dimensiones para ser mostrada en una pantalla o impresa en papel.

Alrededor de  la visualización 3D existen diferentes técnicas y conceptos.

Modelado
La etapa de modelado consiste en ir dando forma a objetos individuales que luego serán usados en la escena creada. Existen diversos tipos de modelado, con NURBS y modelado poligonal o subdivisión de superficies. Además, aunque menos usado, existe otro tipo llamado Image Based Modeling (IBM) que consiste en convertir una fotografía a 3D mediante el uso de diversas técnicas, de las cuales, la más conocida es la fotogrametría cuyo principal impulsor es Paul Debevec. El Modelado de Superficies no tiene curvas calculadas en cada linea (ejemplo SketchUp).

modelado por superficies
Modelado por superficies NURBS

Iluminación
Creación de luces de diversos tipos puntuales, direccionales en área o volumen, con distinto color o propiedades. Esto es la clave de una animación. Gran parte de la iluminación en 3D requiere del entendimiento físico de la luz en la realidad, este entendimiento puede ir desde lo más básico en el tema como por ejemplo el concepto de iluminación global hasta comportamientos complejos y extraños de la luz como la dispersión en superficies y subsuperficies

Animación
La animación es muy importante dentro de los gráficos porque en estas animaciones se intenta imitar a la realidad misma; por esto es un trabajo que usualmente requiere muchas horas. Los objetos se pueden animar en cuanto a:
  • Transformaciones básicas en los tres ejes (XYZ), rotación, escala y traslación.
  • Forma: mediante esqueletos, mediante deformadores o dinámicas.

Renderizado
renderizado
Renderizado
Mediante el renderizado se consiguen imágenes realistas. Proceso de generar una imagen o vídeo mediante el calculo de iluminación global (GI) partiendo de un modelo en 3D. Este término técnico es utilizado por los animadores o productores audiovisuales (CG) y en programas de diseño en 3D como por ejemplo 3DMax, Maya, Blender, etc.

El proceso de renderizado se desarrolla con el fin de generar en un espacio 3D formado por estructuras poligonales; una simulación realista del comportamiento tanto de luces, texturas y materiales (agua, madera, metal, plástico, tela, etcétera) como también de los comportamientos físicos y animación, es el caso de la simulación de colisiones y fluidos, simulando ambientes y estructuras físicas verosímiles. Una de las partes más importantes de los programas dedicados a la renderización es el motor de renderizado, el cual es capaz de realizar complejos cálculos como radiosidad, raytrace (trazador de rayos), canal alfa, reflexión, refracción o iluminación global (GI).

El proceso de rénder necesita una gran capacidad de cálculo, pues requiere simular gran cantidad de procesos físicos complejos. La capacidad de cálculo se ha incrementado rápidamente a través de los años, permitiendo un grado superior de realismo en los rénders. Los estudios de cine que producen animaciones generadas por ordenador hacen uso, en general, de lo que se conoce como render farm (granja de rénder) para acelerar la producción de fotogramas.


Radiosidad
La radiosidad es un conjunto de técnicas para el cálculo de la iluminación global que tratan de resolver el problema básico de la renderización de la forma más realista posible en el campo de los gráficos 3D por computadora. Dicho problema es el transporte de la luz que sólo se puede modelar de forma óptima considerando que cada fuente luminosa emite un número enorme de fotones, que rebotan al chocar contra una superficie describiendo una cantidad de trayectorias imposibles de simular en un computador. Una de las técnicas empleadas en el cálculo de la radiosidad es el método de Montecarlo para resolver este problema mediante números aleatorios y de forma estadística.

Raytrace
Determina las superficies visibles en la escena que se quiere sintetizar trazando rayos desde el observador (cámara) hasta la escena a través del plano de la imagen. Se calculan las intersecciones del rayo con los diferentes objetos de la escena y aquella intersección que esté más cerca del observador determina cuál es el objeto visible.

El algoritmo de trazado de rayos extiende la idea de trazar los rayos para determinar las superficies visibles con un proceso de sombreado (cálculo de la intensidad del píxel) que tiene en cuenta efectos globales de iluminación como pueden ser reflexiones, refracciones o sombras arrojadas. Para simular los efectos de reflexión y refracción se trazan rayos recursivamente desde el punto de intersección que se está sombreando dependiendo de las características del material del objeto intersecado. Para simular las sombras arrojadas se lanzan rayos desde el punto de intersección hasta las fuentes de luz. Estos rayos se conocen con el nombre de rayos de sombra (shadow rays).

El algoritmo básico de trazado de rayos fue mejorado por Robert Cook (1985) para simular otros efectos en las imágenes mediante el muestreo estocástico usando un método de Montecarlo; entre estos efectos podemos citar el desenfoque por movimiento (blur motion), la profundidad de campo o el submuestreo para eliminar efectos de aliasing en la imagen resultante.

En la actualidad, el algoritmo de trazado de rayos es la base de otros algoritmos más complejos para síntesis de imágenes (mapeado de fotones, Metropolis, entre otros) que son capaces de simular efectos de iluminación global complejos como la mezcla de colores (color blending) o las cáusticas.

Proyección
Es la transformación de coordenadas para convertir cada objeto 3D desde el sistema de coordenadas de visualización (coordenadas de la cámara) en un objeto 2D dibujado sobre en el plano de visualización (coordenadas de pantalla). Ecomputer vision existen distintos modelos de proyección, aunque los más utilizados son:

  1. Modelo de proyección paralelaConsiste en proyectar puntos del espacio contra el plano de proyección mediante haces de rectas siempre paralelas entre sí. Esta técnica de representación gráfica se utiliza en diseños de ingeniería y arquitectura ya que su principal ventaja es que mantiene las proporciones relativas de lo representado y se puede medir sobre él directamente. De esta manera se puede reconstruir el objeto fácilmente a partir de representaciones concretas.
  2. Modelo de proyección en perspectivaConsiste en la proyección de los vértices de los objetos de la escena mediante trayectorias convergentes en un punto central del plano de proyección. Se consigue efecto distancia al quedar representados los objetos más alejados con un menor tamaño. Las escenas generadas utilizando este modelo de proyección son más realistas, ya que ésta es la manera en que el ojo humano y las cámaras físicas forman imágenes.
    proyección en perspectiva
    Modelo de proyección en perspectiva


jueves, 8 de mayo de 2014

ARToolKit: funcionamiento básico

Para los que hayáis leído mi entrada "Mi primera aplicación de Realidad Aumentada" en la que explico a través de un sencillo programa la estructura y funcionamiento básico de una aplicación de Realidad Aumentada, en este post desarrollaré algo más el funcionamiento básico de ARToolKit.


Lo esencial en todas las aplicaciones de Realidad Aumentada, es la  necesidad de calcular correctamente 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 crea que existen en el mundo real, tendremos que realizar transformaciones sobre dichos objetos de modo que el usuario los vea (a través de la cámara o dispositivo de captura utilizado) en la posición  con el 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í.

marcador meditel
Marcador meditel
Para ello, herramientas como ARToolKit utilizan unas plantillas (marcadores) de forma cuadrada normalmente, formadas por un cuadrado negro con un cuadrado blanco unas cuatro veces más pequeño en su centro, y un dibujo (patrón) en el interior del cuadrado blanco. Este dibujo debe ser sencillo y evitar las simetrías. Nuestro programa será capaz de detectar una de estas plantillas en las imágenes de vídeo capturadas utilizando mediante un potente algoritmo de detección de contornos implementado en las funciones y utilidades proporcionadas por ARToolKit.

Una vez detectado el marcador en una imagen, a partir de su orientación, posición y tamaño, la aplicación es capaz de calcular la posición y orientación relativa de la cámara real respecto al marcador y dibujar el objeto 3D sobre la imagen capturada de modo que aparezca sobre el marcador en la posición, orientación y tamaño correspondiente al punto de vista de la cámara (perfectamente alineado). Esto 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. Para el renderizado del objeto se utilizan librerías externas a ARToolKit (por ejemplo GLUT y OpenGL).

El proceso básico de una aplicación ARToolkit es el siguiente:

proceso detección marcas
Proceso de detección
de  marcas en ARToolKit
  1. Primero se captura un fotograma del mundo real mediante la cámara.
  2. A continuación se detectan marcas. Para ello, la imagen se convierte a escala de grises y se binariza (según parámetro umbral threshold que indica a partir de que gris todo pixel será negro, dejando blancos el resto: compromiso entre rapidez y precisión en detección). después, se detectan todas las posibles marcas y se les asigna mediante un parámetro un valor de fidelidad para decidir cual de las marcas posibles es la real. 
  3. Se normaliza la marca, se detectan los contornos de la región que la contiene (vértices y lados del cuadrado) y después se extrae el contenido de la marca comparándola con patrones de las plantillas de las que se tiene información almacenada.
  4. Si la forma del patrón del marcador detectado coincide con el de la plantilla almacenada, se utiliza la información y el tamaño de marcador y plantilla almacenada para calcular la posición y orientación de la cámara respecto al marcador detectado, y se guarda en una matriz llamada Matriz de Transformación. (en el post AR Conceptos II se explica con detalle cómo es esta matriz). Conociendo las posiciones 2D de las aristas y vértices que definen el marcador 2D y el modelo de proyección de la cámara (matriz de parámetros intrínsecos P) es posible estimar la posición y rotación 3D de la cámara respecto a la marca y, por tanto la matriz de transformación T (matriz de parámetros extrínsecos). Esto se hace mediante un proceso de cálculo iteractivo.
  5. La matriz de Transformación se utilizará 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 de la marca a las coordenadas de la cámara y por tanto se transforman las coordenadas del objeto a dibujar. Se usa la matriz T (para hacer transformaciones geométricas) e implícitamente la P (para hacer transformaciones de proyección y visualización de la cámara).
  6. Al haber puesto la cámara virtual en la misma posición y orientación que la cámara real, el objeto virtual se renderiza sobre el marcador y se muestra la imagen resultante, que contiene la imagen del mundo real y el objeto virtual superpuesto, alineado sobre el marcador. Se dibujan, por tanto, los objetos 3D alineados con la escena. 
  7. Se realiza el mismo proceso con los siguientes fotogramas.

coordenadas ARToolKit
Sistema de coordenadas de ARToolKit

El siguiente diagrama muestra el funcionamiento que se acaba de describir:
.
proceso AR
Esquema funcional de ARToolKit