martes, 9 de diciembre de 2014

Presentación de mi proyecto de Realidad Aumentada y Publicidad

La pasada semana presenté mi proyecto "DETECCION Y LOCALIZACION DE ESTRUCTURAS PLANAS  PARA APLICACIONES DE REALIDAD AUMENTADA EN PUBLICIDAD" en la Universitat Politècnica de Catalunya (UPC)


Como ya comenté meses atrás en distintos posts, este blog surgió 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 UPC. Terminado este proyecto, tuve la oportunidad de presentarlo la semana pasada en las instalaciones en el Campus Nord de la Escola Tècnica Superior d'Enginyers de Telecomunicació de Barcelona (ETSETB) y exponer con cierto detalle algunos de los trabajos realizados hasta su finalización.


publicidad en fachada e interiorespublicidad en fachada
publicidad en fachadapublicidad en fachada
distintos momentos de la presentación del proyecto


Durante la exposición, hice una breve introducción a la realidad aumentada y a las diferentes tecnologías que posibilitan el registro (cálculo de la posición y orientación relativa de la cámara real respecto de la escena), explicando las ventajas y soluciones que aporta el tracking visual sin el uso de marcadores frente a otras tecnologías más usuales como la geolocalización o el tracking visual con marcadores, que presentan algunos problemas. 

A continuación, comenté muy brevemente algunos ejemplos característicos del uso de la Realidad Aumentada en Publicidad y de las propuestas técnicas consultadas para la elaboración del proyecto. Hice una detallada explicación de los algoritmos que componen la solución técnica propuesta y que permiten la calibración de la cámara, la detección de estructuras planas en una imagen real procedente de un dispositivo de captura, el cálculo de la pose de éstas y el renderizado de una imagen plana perfectamente integrada y orientada con ellas.

Finalmente, comenté los resultados obtenidos a la hora de verificar el buen funcionamiento de la solución propuesta en el proyecto y las conclusiones finales en cuanto a consecución de los objetivos propuesto el la continuación con los futuros trabajos para el desarrollo y mejora de la propuesta.

Dejo a continuación la presentación multimedia que utilicé:



Tuve la oportunidad también de realizar una demostración del funcionamiento de la solución propuesta. La experiencia consistió en la detección a través de una cámara conectada al ordenador de la fachada de uno de los edificios del campus, que se observaba a través de la ventana de la sala. Una vez detectada, la aplicación desarrollada en el proyecto posiciona y orienta dicha fachada para posteriormente renderizar sobre ella una imagen plana perfectamente integrada y orientada, a modo de anuncio publicitario.

Se estableció a continuación una interesantísima conversación e intercambio de impresiones, entre las que no faltaron ideas para el posterior desarrollo de la solución técnica y propuestas de mejora. Todo ello en un ambiente muy distendido y agradable. Puedo afirmar con rotundidad que disfruté presentando mi proyecto y creo que resultó interesante para todos los asistentes.

A la conclusión, tuve la enorme satisfacción de recibir unánimes felicitaciones por el buen trabajo desarrollado, por el entusiasmo y profesionalidad mostrados hasta su finalización y por el buen funcionamiento de la propuesta técnica presentada.

Me gustaría volver a agradecer a los profesores que me escucharon, su atención, comentarios y felicitaciones. Igualmente agradecer a los que me escucharon y tanto me han apoyado durante estos meses de dedicación al proyecto. Solo ellos saben lo que ha supuesto para mí su ayuda y confianza.

Continuaré desarrollando este blog con más entradas en las que comentaré los pormenores de este proyecto y sus resultados. Seguiré hablando de Realidad Aumentada. Espero que las 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!!


jueves, 4 de diciembre de 2014

Talleres de Realidad Aumentada en la Universitat Oberta per a Majors de la UIB

La Universitat Oberta per a Majors de la UIB ha tenido la gentileza de invitarme a realizar unos talleres sobre Realidad Aumentada enmarcados en su programa para este curso 2014/15 en Menorca. 



ARToolKit

UOM - Talleres AR
Me hace especial ilusión poder colaborar con la UOM en esta ocasión para poder acercar estas modernas tecnologías de Realidad Aumentada a los participantes en este curso.

Habitualmente hablo de Realidad Aumentada en ámbitos profesionales de ingeniería y diseño; de la misma manera, tratamos el uso de estas tecnologías en ámbitos educativos en mis clases de metodología del Máster de Formación del Profesorado, también de la UIB, o en charlas dirigidas a alumnos de secundaria.

En esta ocasión he preparado un programa muy descriptivo, atractivo y sobre todo demostrativo y práctico, con el que los asistentes podrán experimentar e interactuar. Demostraremos que las mas modernas tecnologías pueden ser presentadas, entendidas y experimentas por todos, con independencia de nuestra formación, experiencia profesional o edad.

Parafraseando a la Dra. Joana M. Seguí (Directora de la UOM), "en la UOM, lugar de encuentro de personas, de relaciones sociales, de generación de amistades y de socialización del tiempo libre, se aprende disfrutando". Espero poder contribuir a ello.

Durante las sesiones, que tendrán lugar en Alaior, Ciutadella y Maó, hablaré muy brevemente de qué es la Realidad Aumentada, sus principios de funcionamiento y principales usos dentro de nuestra sociedad; navegación, turismo, industria, ocio, educación, medicina, arquitectura... Pero lo más atractivo, en mi opinión, vendrá después cuando experimentemos con distintas herramientas y aplicaciones que tenemos a nuestro alcance y con las que podemos experimentar y utilizar la Realidad Aumentada de una forma sencilla y divertida.

Os muestro el tríptico que he preparado para los talleres y que podéis descargar como siempre en mis perfiles sociales.



En una próxima entrada comentaré como se han desarrollado los talleres y publicaré el material utilizado.

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).