Archivos de Categoría: Visión por Computador

Instalar OpenCV 2.4.2 con soporte para ffmpeg en Mac OS X 10.8

Para instalar OpenCV 2.4.2 con soporte ffmpeg tenemos que instalar primero lamemp3, faac, faad y por supuesto ffmpeg. He añadido un nuevo script en mi repositorio installation-scripts de Github pero voy a poner de todas formas aquí como se instala cada librería paso a paso.

Recuerda también que para poder compilar desde la linéa de comandos con Xcode 4.4 hay que instalar antes las “Command Line Tools”. Echa un vistazo a “No puedo configurar con cmake en Mac OS X 10.8 con Xcode 4.4” antes de continuar con la instalación.

mp3lame:

$ curl -L -o lame-3.99.5.tar.gz http://sourceforge.net/projects/lame/files/lame/3.99/lame-3.99.5.tar.gz/download
$ tar xzvf lame-3.99.5.tar.gz
$ cd lame-3.99.5
$ ./configure --disable-dependency-tracking CFLAGS="-arch i386 -arch x86_64" LDFLAGS="-arch i386 -arch x86_64"
$ make
$ sudo make install
$ cd ..

faac (observar que solo se compila para for x86_64):

$ curl -L -o faac-1.28.tar.gz http://sourceforge.net/projects/faac/files/faac-src/faac-1.28/faac-1.28.tar.gz/download
$ tar xzvf faac-1.28.tar.gz
$ cd faac-1.28
$ ./configure --disable-dependency-tracking CFLAGS="-arch x86_64" LDFLAGS="-arch x86_64"
$ make
$ sudo make install
$ cd ..

faad:

$ curl -L -o faad2-2.7.tar.gz http://sourceforge.net/projects/faac/files/faad2-src/faad2-2.7/faad2-2.7.tar.gz/download
$ tar xvzf faad2-2.7.tar.gz
$ cd faad2-2.7
$ ./configure --disable-dependency-tracking CFLAGS="-arch i386 -arch x86_64" LDFLAGS="-arch i386 -arch x86_64"
$ make
$ sudo make install
$ cd ..

ffmpeg:

$ curl -O http://ffmpeg.org/releases/ffmpeg-0.11.5.tar.gz
$ tar xzvf ffmpeg-0.11.5.tar.gz
$ cd ffmpeg-0.11.5
$ ./configure --enable-libmp3lame --enable-libfaac --enable-nonfree --enable-shared --enable-pic --disable-mmx --arch=x86_64
$ make
$ sudo make install
$ cd ..

OpenCV 2.4.2:

$ curl -L -o OpenCV-2.4.2.tar.bz2 http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.4.2/OpenCV-2.4.2.tar.bz2/download
$ tar xvzf OpenCV-2.4.2.tar.bz2
$ cd OpenCV-2.4.2

Si configuramos y compilamos OpenCV 2.4.2 tal cual nos aparecerá un error de linkado más o menos al 34% del proceso de compilación de esta manera:

Linking CXX shared library ../../lib/libopencv_highgui.dylib
Undefined symbols for architecture x86_64:
  "_faacEncClose", referenced from:
      _Faac_encode_close in libavcodec.a(libfaac.o)
      _Faac_encode_init in libavcodec.a(libfaac.o)
  "_faacEncEncode", referenced from:
      _Faac_encode_frame in libavcodec.a(libfaac.o)
  "_faacEncGetCurrentConfiguration", referenced from:
      _Faac_encode_init in libavcodec.a(libfaac.o)
  "_faacEncGetDecoderSpecificInfo", referenced from:
      _Faac_encode_init in libavcodec.a(libfaac.o)
  "_faacEncOpen", referenced from:
      _Faac_encode_init in libavcodec.a(libfaac.o)
  "_faacEncSetConfiguration", referenced from:
      _Faac_encode_init in libavcodec.a(libfaac.o)
  "_lame_close", referenced from:
      _mp3lame_encode_close in libavcodec.a(libmp3lame.o)
      _mp3lame_encode_init in libavcodec.a(libmp3lame.o)
  "_lame_encode_buffer", referenced from:
      _mp3lame_encode_frame in libavcodec.a(libmp3lame.o)
  "_lame_encode_buffer_float", referenced from:
      _mp3lame_encode_frame in libavcodec.a(libmp3lame.o)
  "_lame_encode_buffer_int", referenced from:
      _mp3lame_encode_frame in libavcodec.a(libmp3lame.o)
  "_lame_encode_buffer_interleaved", referenced from:
      _mp3lame_encode_frame in libavcodec.a(libmp3lame.o)
  "_lame_encode_flush", referenced from:
      _mp3lame_encode_frame in libavcodec.a(libmp3lame.o)
  "_lame_get_encoder_delay", referenced from:
      _mp3lame_encode_init in libavcodec.a(libmp3lame.o)
  "_lame_get_framesize", referenced from:
      _mp3lame_encode_init in libavcodec.a(libmp3lame.o)
  "_lame_init", referenced from:
      _mp3lame_encode_init in libavcodec.a(libmp3lame.o)
  "_lame_init_params", referenced from:
      _mp3lame_encode_init in libavcodec.a(libmp3lame.o)
  "_lame_set_VBR", referenced from:
      _mp3lame_encode_init in libavcodec.a(libmp3lame.o)
  "_lame_set_VBR_quality", referenced from:
      _mp3lame_encode_init in libavcodec.a(libmp3lame.o)
  "_lame_set_bWriteVbrTag", referenced from:
      _mp3lame_encode_init in libavcodec.a(libmp3lame.o)
  "_lame_set_brate", referenced from:
      _mp3lame_encode_init in libavcodec.a(libmp3lame.o)
  "_lame_set_disable_reservoir", referenced from:
      _mp3lame_encode_init in libavcodec.a(libmp3lame.o)
  "_lame_set_in_samplerate", referenced from:
      _mp3lame_encode_init in libavcodec.a(libmp3lame.o)
  "_lame_set_mode", referenced from:
      _mp3lame_encode_init in libavcodec.a(libmp3lame.o)
  "_lame_set_num_channels", referenced from:
      _mp3lame_encode_init in libavcodec.a(libmp3lame.o)
  "_lame_set_out_samplerate", referenced from:
      _mp3lame_encode_init in libavcodec.a(libmp3lame.o)
  "_lame_set_quality", referenced from:
      _mp3lame_encode_init in libavcodec.a(libmp3lame.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [lib/libopencv_highgui.2.4.2.dylib] Error 1
make[1]: *** [modules/highgui/CMakeFiles/opencv_highgui.dir/all] Error 2
make: *** [all] Error 2

Para resolver este problema tenemos que modificar el fichero modules/highgui/CMakeLists.txt y añadir lo siguiente justo antes de if(HAVE_FFMPEG) (en la línea 158):

if(APPLE)
  list(APPEND HIGHGUI_LIBRARIES ${BZIP2_LIBRARIES} -lmp3lame -lfaac -lbz2)
endif(APPLE)

O podemos aplicar el siguiente parche a OpenCV 2.4.2:

--- modules/highgui/CMakeLists.txt.old	2012-06-19 19:17:35.000000000 +0200
+++ modules/highgui/CMakeLists.txt	2012-06-19 22:48:58.000000000 +0200
@@ -145,6 +145,10 @@
   list(APPEND HIGHGUI_LIBRARIES m3api)
 endif(HAVE_XIMEA)
 
+if(APPLE)
+  list(APPEND HIGHGUI_LIBRARIES ${BZIP2_LIBRARIES} -lmp3lame -lfaac -lbz2)
+endif(APPLE)
+
 if(HAVE_FFMPEG)
   if(UNIX AND BZIP2_LIBRARIES)
     list(APPEND HIGHGUI_LIBRARIES ${BZIP2_LIBRARIES})

Ahora ya podemos configurar, compilar e instalar OpenCV como siempre. Si quieres saber más acerca de los parámetros de configuración de cmake para OpenCV puedes echar un vistazo a “Instalar OpenCV 2.3.1a en Mac OS X 10.6“.

$ mkdir build
$ cd build
$ cmake ..
$ make
$ sudo make install
$ cd ..

Fuente: http://blog.yageek.net/2012/06/compile-opencv-241-on-mac-os-x-lion.html

No puedo configurar con cmake en Mac OS X 10.8 con Xcode 4.4

Acababa de hacer una instalación limpia de Mac OS X 10.8 Mountain Lion y Xcode 4.4 y cuando me disponía a compilar (otra vez) OpenCV 2.4.2 me apareció este error al hacer “cmake ..”:

$ cmake ..
CMake Error: CMake was unable to find a build program corresponding to "Unix Makefiles".  CMAKE_MAKE_PROGRAM is not set.  You probably need to select a different build tool.
CMake Error: Error required internal CMake variable not set, cmake may be not be built correctly.
Missing variable is:
CMAKE_CXX_COMPILER_ENV_VAR
CMake Error: Error required internal CMake variable not set, cmake may be not be built correctly.
Missing variable is:
CMAKE_CXX_COMPILER
CMake Error: Could not find cmake module file:/Users/enekochan/compilaciones/OpenCV-2.4.2/build/CMakeFiles/CMakeCXXCompiler.cmake
CMake Error: Error required internal CMake variable not set, cmake may be not be built correctly.
Missing variable is:
CMAKE_C_COMPILER_ENV_VAR
CMake Error: Error required internal CMake variable not set, cmake may be not be built correctly.
Missing variable is:
CMAKE_C_COMPILER
CMake Error: Could not find cmake module file:/Users/enekochan/compilaciones/OpenCV-2.4.2/build/CMakeFiles/CMakeCCompiler.cmake
CMake Error: CMAKE_CXX_COMPILER not set, after EnableLanguage
CMake Error: CMAKE_C_COMPILER not set, after EnableLanguage
-- Configuring incomplete, errors occurred!

Las nuevas versiones de Xcode (4.4 y siguientes) no se instalan en /Developer por lo que pensé que podía ser un problema de paths, pero lo que sucede en realidad es que ya no se instalan por defecto con Xcode las utilidades de terminal. Puedes instalarlas y aceptar la licencia desde el terminal:

sudo xcode-select --install
sudo xcodebuild -license

O bajártelas por separado de https://developer.apple.com/downloads/ (necesitas una Apple ID). Buscar ahí la última “Command Line Tools” para vuestro sistema:

Instalarlo y ya podréis compilar desde el terminal sin problemas.

Source: http://www.cmake.org/pipermail/cmake/2009-February/027317.html

ARSlides v1.0: Aplicación de presentación de diapositivas en realidad aumentada

Me alegra informaros de que (por fin) he publicado el código de la aplicación en realidad aumentada que he estado desarrollando últimamente. Esta es una pequeña demo de cómo funciona (perdón por la mala calidad de la imagen):

Esta aplicación puede mostrar diapositivas de imágenes (JPG, GIF y también imagenes con transparencia PNG y TGA) y modelados 3D (DAE, 3DS, OSG, OBJ y FBX). Tan solo tienes que añadir la ruta de tus ficheros al archivo de configuración XML del programa y usar la tecla derecha para avanzar a la siguiente o la tecla izquierda para retroceder. También puede mostrar textos en diferentes colores y tipografías pero aún tengo que hacer algunos cambios para poder integrarlos en el fichero de configuración XML.

Ahora mismo estoy trabajando en añadir diapositivas de video (AVI, MOV, etc.) y sonido (WAV, MP3, etc.) y aunque he conseguido que funcione en el pasado algunos problemas con FFMpeg hacen que la aplicación casque de manera aleatoria. Es por eso que no lo he añadido en la primera versión. He creado un nuevo branch en Github por si alguien quiere ver como va el proceso de desarrollo de esta parte.

Podéis descargaros el código fuente desde este repositorio de Github. Y por supuesto podéis contribuir al proyecto si queréis. ¡Me alegraría mucho!

Esta aplicación usa ARToolKit, Collada-dom, OpenSceneGraph y osgART así que si necesitas ayuda para instalarlos en tu sistema puedes usar los scripts que hice hace un tiempo. También hay varias guias en este blog donde se explica paso a paso como instalar las diferentes librerías.

demo1

Solución a texturas negras en modelos 3D de Collada-dom

Antes tenía problemas al cargar modelos 3D con Collada-dom porque salían algunas texturas en negro. Como en este caso por ejemplo:

Hace un tiempo descubrí que se debía al locale (idioma) en el que estaba instalado el sistema operativo Ubuntu. Yo siempre lo instalo en inglés y por eso no había tenido el probema, pero una vez un compañero me dejo su Ubuntu en español para que le instalara todo y me surgió el fallo. Estuve todo el fin de semana intentando encontrar el problema, pero como no recibía ningún tipo de mensaje de error no tenía ninguna pista. Al final me di cuenta de que el problema era el idioma y como no teníamos tiempo para encontrar otra solución mejor instalamos el Ubuntu en inglés y listo.

Hoy he cometido el error de instalar las locales de español junto con las de inglés para poder ver las fechas y los números a nuestra manera y entonces… texturas en negro otra vez. Así que sin más he quitado las locales en español y entonces la aplicación cascaba al intentar cargar un modelo 3D con Collada-dom… pero esta vez si que tenía un mensaje de error en la consola!

locale::facet::_S_create_c_locale name not valid

Con esto ya podía empezar a buscar. Y he descubierto que el causante del problema es la librería boost. En función de la versión que uses (yo uso la 1.46 pero se supone que en la 1.48 esto ya está arreglado) falla si no tienes la locale configurada a “C”.

Así que un arreglo rápido es configurar la variable de entorno LC_ALL al valor C. Se puede hacer de manera permanente en el sistema poniéndolo en tu fichero profile (en tu carpeta home) o sin más ejecutando esto en el terminal antes de ejecutar tu aplicación (en ese mismo terminal claro):

export LC_ALL=C

Como yo uso Eclipse-CDT para desarrollar la manera más fácil es configurar la variable de entorno solo para mi aplicación usando las Debug/Run Configurations. Haz click en la flecha pequeña de los botones Degug o Run y selecciona “Debug Configurations…” o “Run Configurations…”. Luego ve a la pestaña de “Environment” y configura la variable así:

Espero que esto os sirva de ayuda porque la verdad ¡a mi me ha dado muchos dolores de cabeza! Y así es como se debería ver el modelo en 3D:

UPDATE: Una vez había cambiado los locales me di cuenta de que al intentar instalar cualquier cosa con apt-get me aparecía el siguiente error diciendo que mis locales no estaban bien configuradas:

perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
	LANGUAGE = "en_US:en",
	LC_ALL = (unset),
	LC_TIME = "es_ES.UTF-8",
	LC_MONETARY = "es_ES.UTF-8",
	LC_ADDRESS = "es_ES.UTF-8",
	LC_TELEPHONE = "es_ES.UTF-8",
	LC_NAME = "es_ES.UTF-8",
	LC_MEASUREMENT = "es_ES.UTF-8",
	LC_IDENTIFICATION = "es_ES.UTF-8",
	LC_NUMERIC = "es_ES.UTF-8",
	LC_PAPER = "es_ES.UTF-8",
	LANG = "en_US.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
locale: Cannot set LC_ALL to default locale: No such file or directory

Como se puede ver mis locales para time, monetary, address, telephone, name, measurement, identification, numeric y paper están configuradas a español (es_ES.UTF-8), mi idioma está configurado a inglés (es_US.UTF-8) pero no tengo nada configurado para LC_ALL. Para arreglar este error ejecuté los siguientes comandos en un terminal:

export LC_ALL=en_US.UTF-8
sudo locale-gen en_US.UTF-8
sudo dpkg-reconfigure locales

Y ahora ya el problema está solucionado porque todas mis locales están configuradas a en_US.UTF-8. Se puede ver como se tienen configuradas las variables de locale ejecutando “locale”:

$ locale
LANG=en_US.UTF-8
LANGUAGE=en_US:en
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=en_US.UTF-8

Sources: https://svn.boost.org/trac/boost/ticket/4688
https://svn.boost.org/trac/boost/ticket/5928
http://www.becodemyfriend.com/2011/11/perl-warning-falling-back-to-the-standard-locale-%E2%80%9Cc%E2%80%9D/

Scripts para instalar ARToolKit, Collada DOM, OpenSceneGraph y osgART

He creado unos scripts y parches para que la instalación de todas estas librerías sean menos “dolorosa”. Los parches solucionan los problemas de compatibilidad de OpenSceneGraph con Ubuntu 11.10 y 12.04 como ya expliqué en otro post y unos pequeños bugs en osgART y ARToolKit (tambien se puede añadir soporte para V4L2 a este, creditos a Kameda Yoshinari por esto). Todavía me falta probarlos en las versiones de Ubuntu aunque si tienes algún problema son bastante fáciles de entender y los podrás arreglar sin problemas (estaría bien que me dijeras qué has cambiado para arreglarlos y así los actualice para que todos los tengamos disponibles ;)). Si encuentras algún error o alguna manera de mejorarlos no dudes en escribirme aquí o en mi página de Github. Puedes descargarte todos los ficheros de aquí:

https://github.com/enekochan/installation-scripts

Tienes que bajarte todos los ficheros y ponerlos en la misma ruta para ejecutar la instalación. El orden correcto para ejecutarlos es:

  1. installARToolKit.sh
  2. installCollada.sh
  3. installOpenSceneGraph.sh
  4. installosgART.sh

Una vez tengas todas las librerías instaladas podrás usar osgART con ficheros Collada (.dae) de la misma manera que hago yo en esta imagen:

No te preocupes que pronto explicaré (con código fuente por supuesto) cómo se hace.

ACTUALIZACIÓN: Puedes encontrar aquí el código fuente para esta aplicación de realidad aumentada.