Inicio | Software y utilidades | Introducción a la Fotogrametría con VisualSFM

Introducción a la Fotogrametría con VisualSFM

Lunes, 08 de Octubre de 2012 16:41

fotogrametria La fotogrametría es la disciplina que se encarga del estudio de las propiedades geométricas de objetos o escenas así como sus características espaciales a partir de fotografías. El principal atributo de estas técnicas, es que mientras la fotografía  sólo representa atributos bidimensionales, la fotogrametría trabaja con información tridimensional, obtenida a partir de diversas imágenes bidimiensionales solapadas. A través de estas zonas de solape se pueden determinar puntos comunes con los que se recrean las vistas 3D.

A lo largo de este artículo, y seguramente en artículos próximos, voy hablar de de forgrametría, pero en realidad estos modelos fotogramétricos los voy obtener por técnicas de Structure from Motion. Aunque ambas estrategias tienen como resultado un modelo 3D, son tecnologías sensiblemente diferentes. La fotogrametría es una técnica bastante antigua fundamentada en el establecimiento de puntos comunes entre imágenes tomadas de forma controlada y con cámaras calibradas, con el fin esencial de tomar mediciones entre dichos puntos, aunque en la práctica moderna sea posible extraer modelos 3D más o menos eficaces. Sin embargo el Structure from Motion, es una técnica que aunque se inspira en la fotogrametría procede del mundo de la visión artificial y permite realizar modelos 3D a partir de colecciones de imágenes no estructuradas, ni cámaras calibradas, e incluso usar distintas cámaras, por lo cual se propone como una estrategia más polivalente y robusta. En la actualidad fotogrametría y SfM se entremezclan en los diversos programas que dan soporte a este tipo de tareas, reduciéndolo todo a simples procesos de fotogrametría, cuando más bien deberíamos hablar de SfM, aunque finalmente nuestros resultados van a ser aproximadamente parecidos.

Los trabajos realacionados con la fotogrametría estan bastante en auge en los campos de la arqueología, arte rupestre, conservación de bienes culturales y en general todas las disciplinas relacionadas con la protección, documentación, digitalización o virtualización del patrimonio, ya que se trata de una herramienta bastante asequible, no sólo en lo relativo a los costes, sino que tambien a la simpleza de su uso y  que se puede constituir en una fuente de documentación bastante relevante.

No existe una gran oferta en el mercado de este tipo de herramientas, siendo la más destacada la veterana Photomodeler de la empresa Eos Systems con más de dos décadas de experiencia en este campo y que si es propiamente una herramienta de fotogrametría, que en sus últimas versiones incorpora procesos automáticos, claramente inspirados en el SfM. Otra herramienta muy usada en este campo es Photoscan de la empresa rusa Agisoft, cuyo funcionamiento, aunque sus desarrolladores no lo dejan claro, es exclusivamente SfM.

Dentro de las alternativas libres o gratuitas no disponemos de grandes posibilidades: por una parte tenemos la aplicación online desarrollada por Microsoft denominada Photosynth  la cual para poder descargar los trabajos realizados online, necesitamos una herramienta intermedia denominada SynthExport disponible sólo para las plataformas de Microsoft. En el terreno online tenemos otra herramienta denominada Hypr3D que nos permite crear modelos 3D a partir de fotografías y exportarlos a otros entornos. Otra alternativa es INSIGHT3D  disponible para Win y Linux, pero cuyo desarrollo se encuentra obsoleto, siendo muy difícil su instalación ya que no es compatible con las últimas librerías de OpenCV, presentando además una cierta inestabilidad. Como última opción tambien tenemos a nuestro alcance ARC3D una herramienta con una orientación hacia usos relativos a la digitalización 3D del patrimonio, que esta disponible de forma a través de un cliente que acceder por servicios web a un servidor online, donde se realizan todos los procesos, al igual que el resto de soluciones web hay que estar registrado previamente en la plataforma.

Otra alternativa libre son las herramientas tipo Bundler, las cuales abordaré en artículos posteriores, que se fundamentan en procesos similares de SfM al que descibiré a continuación, pero su uso suele ser por línea de comandos, lo cual se hace más tedioso.

Afortunadamente desde la universidad de Seattle, de la mano del joven ingeniero Changchang Wu, nos llega VisualSFM una herramienta que nos permite realizar modelos 3D a partir de imágenes 2D.

VisualSFM de forma similar al resto de herramientas, su objetivo es crear una nube de puntos en 3D, con la ayuda de diversas herramientas. Estas nubes de puntos estan formadas por simples puntos descritos por unas coordenadas espaciales XYZ y unos valores RGB que serán los encargados de restituir la textura original a través de lo que se conoce como nubes de puntos densas. El concepto de trabajo se acerca a Photomodeler, sin embargo con VisualSFM no es necesario establecer puntos de referencia entre imágenes ni calibrar nuestra cámara, lo cual agiliza el proceso y nos permite trabajar con grandes cantidades de imágenes sin mucha dificultad. VisualSFM tampoco no incorpora herramientas de medición, proceso que debemos dejar para otras herramientas como MeshLab, aunque en las últimas versiones si disponemos de herramientas de georreferenciando de nubes de puntos por GCP (ground control points) y GPS.

El proceso de funcionamiento de VisualSFM, como el de muchas herramientas de SfM se fundamenta en los siguientes pasos:

  1. SIFT: o detección de puntos clave o coincidentes entre las múltiples imágenes
  2. Bundle Adjustment: Crea la nube de puntos dispersa a partir de los puntos clave detectados en el paso anterior. En este paso se puede intuir la forma de nuestro modelo y disponer de la posición de las cámaras.
  3. Multi-View Stereo: Será el proceso encargado de generar la nube de puntos densa a partir de todos los datos anteriores. De este proceso se encargan las herramientas CMVS y PMVS2 de Yasutaka Furukawa, ingeniero de Google Maps, de hecho PMVS2 es una herramienta usada en dicha tecnología.

VisualSFM esta disponible para WIN, Mac y Linux. Siendo este último sistema sobre el que me he decido a instalar, no sin cierta dificultad.

En esta primera parte de una serie de artículos sobre el tema de la fotogrametría vamos a proceder a instalar Visual SFM para Ubuntu 12. El siguiente tutorial esta tomado en gran parte del trabajo de Scott Sawyer  al cual he introducido ciertos aspectos con los que me he encontrado que no habían sido descritos en este trabajo anterior, el cual puede resultar de interés por si os surge alguna dificultad que yo no he contemplado.

De todas formas en la web de VisualSFM hay un tutorial más o menos efectivo para la instalación en diversos sistemas, el cual es conveniente que repasemos brevemente.

Primeramente necesitamos los siguientes archivos:

Dependencias:

sudo apt-get install libgtk2.0-dev libglew-dev libdevil-dev libboost-all-dev  libatlas-cpp-0.6-dev libatlas-dev 
imagemagick libatlas3gf-base libcminpack-dev libgfortran3 libmetis-edf-dev libparmetis-dev freeglut3-dev
libgsl0-dev libboost-all-dev liblapack-dev

estructuraAntes de comenzar es conveniente crear un único directorio denominado por ejemplo vsfm y descomprimir todos los paquetes descargados dentro con unzip o el habitual tar xf archivo.tar.gz

La idea inicial de la instalación es compilar VisualSFM e ir instalando ciertas librerías y binarios en su directorio bin. En la captura de pantalla de la izquierda se pueden ver los directorios necesarios y el resultado de la instalación en la ruta vsfm/bin.


Podemos comenzar con compilar VisualSFM:

unzip VisualSFM_linux_64bit.zip
cd vsfm
make

A continuación procedemos a compilar SiftGPU y copiamos la librería a la raíz de vsfm

unzip SiftGPU-V382.zip 
cd SiftGPU
make 
cp bin/libsiftgpu.so ../vsfm/bin

Si queremos usar CUDA, algo factible siempre y cuando tengamos targetas gráficas nVidia, además de descargar el framework debemos tomar algunas precauciones: El fichero makefile de SiftGPU hace un locate libcudart.so para verificar si esta instalado Cuda o no, si la bd de locate no esta actualizada puede que no reconozca que cuda esta instalada, o actualizamos nuestra bd o nos saltamos la condicion que verifica si libcudart.so esta instalada forzando a continuación un siftgpu_enable_cuda = 1. Por otra parte debemos revisar el path de Cuda, por defecto se ubica en /usr/local/cuda pero en las últimas versiones esta en /usr/local/cuda-5.0 por eso es necesario actualizar el parámetro CUDA_INSTALL_PATH

Si compilamos con CUDA es probable que al iniciar VisualSFM nos encontremos con el error "unable to load libsiftgpu.so" esto sucede porque siftGPU no localiza libcudart.so.4, para ello copiamos este archivo desde /usr/local/cuda/lib64/libcudart.so.4 al directorio donde tengamos libsiftgpu.so

En el paso siguiente podemos proceder a trabajar con PBA, por una parte necesitamos modificar el archivo pba/src/pba/SparseBundleCU.h  y añadirmos el siguiente include:

#include <stdlib.h>

A continuación procemos a compilar PBA. Si instalamos previamente CUDA Toolkit podemos hacer simplemente un make, pero sin embargo si no disponemos de soporte de CUDA debemos hacer una compilación con:

make -f makefile_no_gpu

Posteriormente copiaremos el archivo generado libpba_no_gpu.so a vsfm/bin/. Hay que prestar atención que si estamos usando CUDA, la librería generada será libpba.so, por la contra esta librería será libpba_no_gpu.so, que posteriormente habrá que renombrarla a libpba.so.

El siguiente paso será compilar Graclus 1.2, el cual previamente deberemos editar Makefile.in y ajustar el -DNUMBITS=64 si procede para adecuarlo a nuestro sistema. Con un make, ya podemos compilar sin problemas.

Posteriormente procedemos a compilar  PMVS-2. Durante la compilación de este binario pueden surgir un par de problemas, por un lado ciertos errores en la librería mylapack, que podemos solucionar con la siguiente secuencia:

tar xf pmvs-2.tar.gz
cd pmvs-2/program/main/
make cp mylapack.o mylapack.o.backup make clean cp mylapack.o.backup mylapack.o make depend make

Por otra parte es probable que las librerías de clapack (clapack.h y f2c.h ). Dichas librerías pueden descargarse de http://www.netlib.org/clapack/ , las podemos instalar en nuestro sistema, por ejemplo pegando el directorio en "/usr/include" o simplemente modificar el archivo mylapack.cc en las líneas:

#include <clapack/f2c.h>
#include <clapack/clapack.h>

Para definir la ruta correcta, sustituyendo los < > por comillas, por ejemplo podemos pegar el directorio clapack en la ruta "program/base/numeric/", en caso de que necesitemos describir la ruta exacta de estos archivos, sin embargo la forma correcta de hacerlo indicando la ruta del directorio en el parametro YOUR_INCLUDE_PATH del archivo makefile.

Finalmente debemos configurar y compilar CMSVS, para ello tras descomprimirlo con el habitual:

tar xf cmvs-fix2.tar.gz

Vamos a copiar el archivo mylapack.o desde PMVS-2 hasta CMVS con:

cp pmvs-2/program/main/mylapack.o cmvs/program/main/

Ahora debemos editar el archivo cmvs/program/base/cmvs/bundle.cc y añadir la siguiente llamada:

#include <vector>
#include <numeric>

Hacemos algo parecido con cmvs/program/main/genOption.cc instertando al principio:

#include <stdlib.h>

Ahora nos vamos al archivo Makefile en la ruta cmvs/program/main y lo editamos de forma que especifiquemos ciertas rutas de nuestro sistema de forma que:

#Your INCLUDE path (e.g., -I/usr/include)
YOUR_INCLUDE_PATH =
#Your metis directory (contains header files under graclus1.2/metisLib/)
YOUR_INCLUDE_METIS_PATH = -I/opt/vsfm/graclus1.2/metisLib
#Your LDLIBRARY path (e.g., -L/usr/lib)
YOUR_LDLIB_PATH = -L/opt/vsfm/graclus1.2

En la versión que me he descargado los comentarios “Your...” venían sin declarar con la correspondiente almohadilla, si nos sucede lo mismo hay que prestar atención en declarar estas líneas correctamente. El parámetro YOUR_INCLUDE_PATH se puede dejar vacío o especificar la ruta a clapack.

Con estos pasos ya hemos terminado la instalación, ahora debemos añadir ciertas variables de entorno a nuestro sistema con el fin de localizar el ejecutable VisualSFM:

export PATH=$PATH:/opt/vsfm/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/vsfm/bin

Si estamos usando Ubuntu debemos añadir estas líneas al final del archivo:

vim /etc/bash.bashrc

Sin embargo esta opción sólo nos permitiria lanzar VisualSFM desde la terminal. Si estamos usando Ubuntu 12, lo más adecuado es crear un lanzador del tipo .desktop en la ruta "/usr/share/applications" para ello creamos un archivo en esta ruta que denominaremos "visualsfm.desktop"

#!/usr/bin/env xdg-open
[Desktop Entry]
Encoding=UTF-8
Name=VisualSFM
Icon=/usr/share/icons/VisualSFM.png
Comment=VisualSFM
Exec=env LD_LIBRARY_PATH=/opt/vsfm/bin /opt/vsfm/bin/VisualSFM
Type=Application
Categories=Application

De esta forma ya introducimos en el parámetro "Exec" nuestras variable de entorno. El icono es opcional, yo he creado un pequeño icono para la aplicación en la ruta "/usr/share/icons/".

Breve introducción a VisualSFM

El uso de VisualSFM es bastante sencillo, y aunque me explayaré mas en detalle en artículos posteriores, para crear un primer modelo necesitamos simplemente:

  1. Una serie de imágenes con diversos puntos de vista de un mismo objeto o escena.
  2. Se cargan en la aplicación con el icono de la carpeta acompañada del símbolo +.
  3. A continuación se buscan las coincidencias con las imágenes, esto se hace con el botón simbolizado con las cuatro flechas opuestas.
  4. Cuando este proceso finaliza, usamos el botón contiguo formado por dos puntas flecha (roja y azul)
  5. Finalmente con el botón simbolizado por las siglas CMSVS, reconstruimos la textura. En este punto se nos indicará la ruta para guardar el proyecto.
  6. Cuando el proceso anterior finalice, puede llevar algunos minutos, para ver el resultado final vamos al menú View y activamos Dense 3D Points.

fotogrametriaComo vemos en el resultado, la recreación 3D es un poco tosca, ya que se forma numeroso ruido entorno al objeto inicial fruto de los fondos de las imágenes, por lo que será necesario limpiar la imagen para obtener una buena recreación de la misma, de forma similar se puede observar diversos “agujeros” provocados por la falta de información o densidad de puntos comunes que dificulta la reconstrucción exacta de la textura. Resulta interesante observar como podemos observar los diferentes puntos de vista.

En siguientes artículos profundizaré un poco más sobre el tratamiento del proyecto resultante con herramientas libres como MeshLab así cómo los aspectos de rendimiento colorimétrico de estas nubes de puntos, que es un poco a donde quería llegar con esta aproximación a la fotogrametría con una orientación a la digitalización y documentación del patrimonio cultural.

x-rite Professional LED Lighting, DSLR Support and Accessories for Photo and Video BabelColor asociacion española de imagen cientifica y forense