lunes, 29 de septiembre de 2014

Fundamentos técnicos de mi proyecto: Publicidad y Realidad Aumentada

Punto de partida para la realización de este proyecto de "Detección y localización de estructuras planas para aplicaciones de Realidad Aumentada en Publicidad" han sido las propuestas técnicas que comento en este post. Son algunas de las más relevantes en este ámbito. Todas ellas fundamentan y contribuyen al desarrollo de este trabajo. 



ARToolKit (Dr. Hirokazu Kato, 1999)
ARToolKit
ejemplo de renderizado de un objeto 3D
sobre un patrón detectado por
ARToolKit

ARToolKit es una librería de software para la creación de aplicaciones de Realidad Aumentada. ARToolKit utiliza algoritmos de visión por computador para realizar el tracking visual desde el punto de vista del usuario, con el fin de saber de qué punto de vista dibujar la imagen virtual. Para ello, la aplicación necesita saber dónde está el usuario en el mundo real. Las librerías de seguimiento de vídeo ARToolKit permiten estimar la posición de la cámara real y su orientación relativa a los marcadores físicos, en tiempo real. Esto permite el fácil desarrollo de una amplia gama de aplicaciones de Realidad Aumentada.

Algunas de las características de ARToolKit incluyen:
  • Seguimiento de la posición de la cámara simple / orientación. 
  • Código de seguimiento que utiliza marcas negras simples. 
  • Capacidad de usar cualquier patrón de marcadores cuadrados. 
  • Fácil código de calibración de la cámara. 
  • Rapidez suficiente para aplicaciones de RA en tiempo real. 
  • Distribuciones SGI IRIX, Linux, MacOS y Windows OS. 
  • Distribuido con el código fuente completo.
Desarrollado en 1999 por el Dr. Hirokazu Kato, en la actualidad es una tecnología liberada bajo licencia GPL, debido a lo cual se ha hecho muy popular y es ampliamente utilizada.


Detecting Planes and Estimating their Orientation from a single image. (O. Haines, 2012)

En este trabajo O. Haines propone un algoritmo para detectar zonas planas en una imagen individual de una escena de exteriores urbanos, capaz de identificar múltiples zonas planas distintas, y la estimación de su orientación. Mediante el uso de técnicas de machine learning, se extrae la relación entre la apariencia y estructura a partir de un amplio conjunto de ejemplos. La detección de zonas planas se logra mediante la clasificación de la superposición de múltiples zonas de la imagen, con el fin de obtener una estimación inicial de planicidad para un conjunto de puntos, que se segmentan en regiones planas y no planas usando una secuencia de campos aleatorios de Markov. Este trabajo difiere de los métodos anteriores en que no se basa en detección de líneas, y es capaz de predecir una orientación real para las zonas planas. Se demuestra que el método es capaz de extraer de forma fiable zonas planas en una variedad de escenas, y se compara favorablemente con los métodos existentes.

Resultados Haines
resultados obtenidos por el algoritmo de Haines


 Detecting Planar Surfaces in Outdoor Urban Environments. (P. David, 2008)


P. David describe un método para detectar automáticamente las fachadas de edificios en imágenes de entornos exteriores urbanos para su aplicación en navegación basada en visión, reconocimiento de marcas y de aplicaciones de vigilancia. En particular, la proliferación de Smartphones con cámara y funcionalidad GPS, hace necesario un sistema de backup de geolocalización cuando las señales GPS de satélite se bloquean en los llamados "cañones urbanos". El método que propone, localiza en primer lugar los segmentos de línea de la imagen y extrae los puntos de fuga de éstos mediante el algoritmo de estimación robusta de RANSAC. A continuación, las intersecciones de los segmentos de línea asociados con cada uno de los pares de puntos de fuga son utilizados para generar el plano de apoyo de cada una de las fachadas según su orientación. Seguidamente, se agrupan los puntos pertenecientes a cada plano de apoyo utilizando un algoritmo que no requiere el conocimiento del número de agrupaciones o de su proximidad espacial. Por último, las fachadas del edificio se identifican mediante el ajuste de cuadriláteros alineados con los puntos de fuga de cada uno de los grupos de puntos de apoyo. Los experimentos muestran un buen rendimiento en una serie de entornos urbanos complejos. La principal contribución de este algoritmo es un rendimiento mejorado sobre los algoritmos existentes y la no imposición de restricciones sobre las fachadas en cuanto a número u orientación, estableciendo unas mínimas restricciones en la longitud de los segmentos de línea detectados y de la verticalidad de las paredes.

Resultados David
resultados obtenidos por el algoritmo de P. David


Computer Vision Centric Hybrid Tracking for Augmented Reality in Outdoor Urban Environments. (W.T. Fong, S.K. Ong, A.Y.C. Nee, 2009)

El trabajo liderado por  W.T.Fong presenta un sistema de seguimiento híbrido para Realidad Aumentada en ambientes urbanos exteriores, que integra la visión por computador (CV), GPS y sensores de inercia. El sistema está diseñado para superficies exteriores planas en ambientes urbanos, proporcionando aumento con gran precisión y libre de jitter. Para ello, se parte de dos algoritmos de CV de seguimiento, “Keypoint Signatures for Fast Learning and Recognition” y “Second-order Minimization for Outdoor Tracking”, que al no escalar a entornos de gran tamaño y no ser del todo robustos, son completados con GPS y detección inercial. De esta manera, primero se define una región de búsqueda limitada para después inicializar el seguimiento mediante CV. Se consigue así un sistema con la precisión y estabilidad requeridas para aplicaciones de Realidad Aumentada. El trabajo presenta las modificaciones de los dos algoritmos de CV junto con las consideraciones de diseño para construir el sistema de seguimiento híbrido propuesto. Presenta, también, los resultados de experimentación del sistema y el aumento en las superficies del mundo real.

Resultados Fong
resultados obtenidos por el algoritmo de Fong



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, 16 de junio de 2014

Ubicando mi proyecto: Publicidad y Realidad Aumentada

Numerosísimos son los ejemplos de utilidad y aplicación de la Realidad Aumentada que en la actualidad existen en el campo de la Publicidad. Igualmente, y en consecuencia si se tiene en cuenta la aplicación de estas innovadoras tecnologías en otros muchos campos, existen numerosas propuestas técnicas desarrolladas y/o en continuo desarrollo que posibilitan la creación de aplicaciones y la explotación de todas las posibilidades que la Realidad Aumentada ofrece. En este post citaré algunas aplicaciones representativas que me han llevado a descubrir la necesidad de proponer una solución técnica a las necesidades de detección y localización de objetos planos en una imagen real sin la existencia de marcadores y el “blending” de una imagen virtual 2D sobre estos que se proponen en este proyecto.  



London National Gallery
AR london national gallery
AR London National Gallery
Los principales museos del mundo están apuntándose al uso de la Realidad Aumentada para publicitarse y para potenciar la iteración de los visitantes con sus colecciones. La London National Gallery   hizo una campaña publicitaria en Trafalgar Square para publicitarse. En ella,  apuntando con un dispositivo móvil hacia la fachada del museo aparecía un anuncio publicitario sobre sus nuevas aplicaciones, apuntando hacia una de las estatuas de la plaza aparecía un vídeo explicativo, o en las escaleras de la Galería aparecía un dragón. Este es un buen ejemplo de detección y localización en exteriores y sin marcadores.


Catálogo IKEA
No por archiconocido y renombrado se puede dejar de nombrar un clásico en el mundo de la publicidad con realidad aumentada. Desde hace algunos años, la marca IKEA  permite al cliente visualizar sus productos y colocarlos en su ubicación final, perfectamente alineados con el entorno real. Este es un buen ejemplo de utilización de marcadores en ambiente interior. La solución que se propone en este proyecto puede evitar el uso de marcadores para conseguir las mismas prestaciones.

AR ikea
AR en el catálogo de IKEA


Edificio N Building
AR edificio N Building
AR en edificio N Building
N building es un edificio comercial que está situado cerca de Tachikawa (Tokio). Su principal característica son sus paredes, forradas de códigos QR permiten dar información a sus visitantes sobre los establecimientos que allí se encuentran y sobre sus productos y servicios. Mediante la descarga de una aplicación para Smartphones, es posible enfocar su cámara sobre el edificio y obtener abundante información sobre los establecimientos presentes. Éstos pueden publicitarse y, además, según la época del año mostrar algún otro tipo de información; por ejemplo, un árbol de navidad en diciembre.

Este es otro buen ejemplo de utilización de marcadores en ambiente exterior. Al igual que en el ejemplo anterior, la solución propuesta puede evitar el uso de marcadores para conseguir las mismas prestaciones.



domingo, 15 de junio de 2014

Mi proyecto de Realidad Aumentada y Publicidad

El primer post de presentación de ARexperience ya comentaba el inicio de este blog como consecuencia de mis trabajos en el mundo de la Realidad Aumentada para aplicaciones de Publicidad, dentro de  un proyecto relacionado con mis estudios de ingeniería electrónica en la Universitat Politècnica de Catalunya (UPC): "DETECCION Y LOCALIZACION DE PLANOS  PARA APLICACIONES DE REALIDAD AUMENTADA EN PUBLICIDAD". Inicio ahora una secuencia de entradas en las que comentaré los pormenores de este proyecto y sus resultados. Espero que los encontréis interesantes y sean de vuestro agrado. Como siempre, comentad por favor todo lo que consideréis que pueda aportar. Vuestra participación siempre es importante. Gracias!!



detección planar en exteriores
Detección planar en exteriores
La Realidad Aumentada es una tecnología incipiente en el mundo de la publicidad. La posibilidad de detectar un patrón en una secuencia de video o en la realidad observada a través de una cámara permite la inclusió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 alineadas con ésta para generar novedosos anuncios publicitarios que parecen cobrar vida. La Realidad Aumentada permite personalizar, dotar de movimiento y sonido, medir los resultados y conseguir la interactuación de las personas con los anuncios; en definitiva, permite llamar la atención de potenciales clientes.

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  y un sinfín de marcas están utilizado la Realidad Aumentada para llegar mejor a sus clientes potenciales.

Sin embargo, nuevas tecnologías permiten los mismos objetivos sin la necesidad de llenar de patrones el campo de visión de la cámara. Muy al contrario, la posibilidad de detectar directamente objetos, edificios, etc, y situar sobre ellos anuncios virtuales abre un amplio mundo de posibilidades para el mundo publicitario. El reto: la detección y localización de objetos en una imagen real sin la necesidad de marcadores.

Y es aquí en donde se enmarca este proyecto. Se plantea en él la posibilidad de añadir información virtual sobre objetos planos detectados y localizados en una imagen real sin necesidad de marcadores, tanto en ámbitos interiores como exteriores. Más concretamente, este proyecto desarrolla un algoritmo de “Blending” de imágenes virtuales 2D sobre las paredes planas de un objeto detectado, por ejemplo un edificio, sin la necesidad de existencia de marcadores.

Si bien es cierto que 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, el proyecto se enmarca dentro del mundo de la publicidad simplemente para poder concretar algunos aspectos. El siguiente vídeo muestra un ejemplo de Realidad Aumentada en l presentación del nuevo Volkswagen Beetle; impresionante:



 Los objetivos iniciales que nos marcamos son:

  1. Detección de planos en imágenes interiores y exteriores
  2. Localización de estos planos
  3. Calibración de la cámara y obtención de sus parámetros intrínsecos
  4. Blending de imágenes virtuales sobre los planos
  5. Implementación en tiempo real
  6. Integración en un sistema de realidad Aumentada. 



lunes, 19 de mayo de 2014

Mejoramos nuestra aplicación RA: estabilizamos el tracking

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.

programa historico
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:

   if(k != -1) {   // Si ha detectado el patron en algun sitio... obtenemos
                   // 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;
      }
   }


Salida del programa

ARToolKit
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

miércoles, 14 de mayo de 2014

Modificamos nuestra aplicación RA para detectar varios patrones

Con unos sencillos cambios podemos modificar nuestra primera aplicación de Realidad Aumentada para que reconozca en la escena varios marcadores, asociando a cada uno de ellos una imagen tridimensional diferente. Os mostraré cómo reconocer cinco marcadores para dibujar cinco objetos diferentes. Podéis descargaros el código y los ficheros necesarios mediante los links correspondientes en este post.



A la hora de realizar una aplicación de Realidad Aumentada que sea capaz de reconocer diferentes patrones asignando imágenes u objetos 3D distintos a cada uno de ellos, tendremos que tener en cuenta las siguientes cambios: (en la imagen se ve la salida del programa ejemplo para dos marcadores distintos)


  1. Cargaremos un fichero de datos que contenga información sobre varios patrones en lugar del fichero de patrón ya utilizado pattMeditel.
  2. Utilizaremos, también, una estructura de datos asociada a los patrones diferente; que permita almacenar varios patrones.
  3. Modificaremos la función de dibujo draw para poder dibujar diferentes objetos en función del patron detectado.

Carga del fichero de datos de los patrones

El fichero de datos que contiene información de todos los marcadores es mi_object_data (es un fichero de texto con una estructura muy sencilla que contiene, para cada marcador, su nombre, el nombre de su fichero de datos y la anchura y centro del marcador; puedes descargarlo aquí). Para cargarlo en el programa, primero definiremos las variables:

   // ==== Fichero Object Data =========================================
   char            *model_name = "Data/mi_object_data";
   ObjectData_T    *object;

   int             objectnum;

A continuación, en la función init, cargamos el fichero mediante una función de ARToolKit definida en object.c llamada read_ObjData a la que le pasamos el fichero de datos y el número de marcadores definidos en él. Los datos referentes a las marcas quedan almacenados en una estructura de datos ObjectData_T específica de ARToolKit. Aquí os dejo el código que hace esto:

  // Cargamos el fichero mi_object_data 
  if ((object = read_ObjData(model_name, &objectnum)) == NULL) exit(0);
  printf("Objectfile num = %d\n", objectnum);


Detección de patrones


ARToolKit puede ahora tratar de identificar varios patrones en la rutina arDetectMarker. Puesto que ahora la detección es para múltiples marcadores, una vez detectado una marca con mayor fiabilidad, habrá que comprobar si se trata de un patrón conocido (presente en el fichero cargado). En este ejemplo, dibujamos también sus bordes cuando esto ocurre. Por otra parte, también es necesario mantener la transformación específica para cada uno de los marcadores detectados. La parte de código que hace esto será:

   // busca patrones conocidos en los marcadores detectados y dibuja un cuadrado
   // de otro color sobre los patrones reconocidos
   for (i = 0; i < objectnum; i++) {
      k = -1;
      for (j = 0; j < marker_num; j++) {
      if (object[i].id == marker_info[j].id) {   //si reconoce un patron
          glColor3f(0.0, 1.0, 0.0);
          argDrawSquare(marker_info[j].vertex, 0, 0);
              if (k == -1) k = j;
          else       // Vemos donde detecta el patron con mayor fiabilidad
           if (marker_info[k].cf < marker_info[j].cf) k = j;
         }
      }
       if (k == -1) {
          object[i].visible = 0;
          continue;
          }

       // calculamos la transformada para cada patron reconocido.
       object[i].visible = 1;
       arGetTransMat(&marker_info[k], object[i].marker_center, 
       object[i].marker_width,
       object[i].trans);
    }

Hay una bandera del visiblitdad asociada con cada marcador, y se realizará una nueva transformación para cada marcador detectado.


Dibujado del objeto asociado al marcador

Para dibujar el objeto asociado al marcador detectado, se llama a la función draw con la estructura ObjectData_T  y el número de objetos como parámetros. Dentro de esta función, se convertimos la matriz de transformación a formato openGL para cada marcador detectado:

    for (i = 0; i < objectnum; i++) {
      if (object[i].visible == 0) continue;
      argConvGlpara(object[i].trans, gl_para);  
          draw_object(object[i].id, gl_para);
    }

Finalmente, dibujamos el objeto asociado al marcador detectado a través de la subrutina draw_object que, mediante la anidación de funciones if selecciona el objeto para cada marcador (pondré solo un ejemplo):

    if (obj_id == 0){
       glMaterialfv(GL_FRONT, GL_SPECULAR, mat_flash_collide);
       glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient_collide);
       glTranslatef(0.0, 0.0, 30.0);
       glutSolidSphere(30, 12, 6);    // dibujamos una esfera
    }


Salida del programa

La salida de este programa detectando dos marcadores diferentes, con sus correspondientes objetos asociados (en este caso una esferarosa y un conjunto esfera-toroide azul) puede verse en la imagen siguiente:

salida varios marcadores
Salida del programa de detección de varios marcadores


lunes, 12 de mayo de 2014

Perspectiva: proyectando objetos en Realidad Aumentada

La Perspectiva es un modelo de proyección que consigue efecto distancia al quedar representados los objetos más alejados con un menor tamaño. En esta entrada, trataré de explicar cómo se realiza la transformación de proyección en perspectiva en el ámbito de la Realidad Aumentada para obtener escenas más realistas, simulando la manera en que el ojo humano y las cámaras físicas forman imágenes. 



El modelo de proyección en perspectiva consiste 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 así un efecto distancia ya que los objetos situados más distantes del plano de visualización aparezcan más pequeños en la imagen. 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.

perspectiva simple
matriz perspectiva
Perspectiva simple y matriz de proyección

Siguiendo la idea de la cámara estenopeica, desplazamos el plano de visualización una distancia d por detrás del origen (en dirección -Z). De esta forma, según la proyección simple, cada punto p se proyecta en el plano de visualización situado en z = -d obteniendo el punto p'=(px',py',-d). Aplicando semejanza de triángulos y un parámetro de homogeneización h = -pz/d, obtenemos la matriz de proyección Mp, que nos aplasta los vértices de los objetos 3D sobre el plano de visualización 2D.

Esta proceso no puede deshacerse; no tiene inverso. Por este motivo es interesante proyectar en lugar de sobre un plano, sobre una pirámide truncada (lo mas estrecha posible) que, una vez normalizada, se convertirá en un cubo unitario  (en lugar de un cuadrado de lado 1), que si podrá deshacerse. Así, definimos la pirámide de visualización (frustrum) cuyas bases son paralelas al plano de proyección (que queda definido por los lados top, bottom, left, right y las distancias near y far). La matriz de perspectiva que transforma la pirámide en el cubo unitario será:

frustrum
Frustrum
matriz perspectiva frustrum
Matriz de perspectiva para el frustrum

Para evitar errores de precisión en el Z-Buffer con distancias grandes, conviene que los planos de la pirámide truncada estén cerca (la distancia far-near sea muy pequeño).

Obtenemos así el volumen de visualización normalizado a un cubo unitario y las coordenadas normalizadas. Hemos pasado los objetos de 3D a 2D y las coordenadas Z de los puntos son almacenadas en un Buffer de profundidad (Z-Buffer).

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