Archivos de Tags: 2.9.6 @es

osgART 2.0 RC3 con OpenSceneGraph 2.9.7 o posterior (incluyendo 3.0.0)

Hace bastante tiempo tuve problemas para usar osgART 2.0 RC3 con OpenSceneGraph 2.9.7 o cualquier versión posterior, no conseguía que el video de la cámara web se mostrara en el fondo así que siempre me limitaba a usar OpenSceneGraph 2.9.6. Hoy me he dado cuenta de que mi aplicación osgART podía funcionar con OpenSceneGraph 2.9.7 o superior (la versión actual 3.0.0 también funciona!), pero como siempre me quedaba en la 2.9.6 no sabía que había solucionado el problema!

NOTA: Si quieres instalar OpenSceneGraph 3.0.0 en Ubuntu 11.10 o Ubuntu 12.04 tendrás que aplicar los parches que he creado y subido a mi repositorio de github.

La clave del problema esta que al configurar el osgART::VideoGeode para el fondo se puede usar TEXTURE_2D o TEXTURE_RECTANGLE. Si usas TEXTURE_RECTANGLE funcionará en versiones nuevas de OpenSceneGraph. Se puede ver un ejemplo en la línea 40 de “examples/osgartsimple/osgartsimple.cpp” en el código fuente de osgART 2.0 RC3:

osg::Group* createImageBackground(osg::Image* video) {
	osgART::VideoLayer* _layer = new osgART::VideoLayer();
	_layer->setSize(*video);
	osgART::VideoGeode* _geode = new osgART::VideoGeode(osgART::VideoGeode::USE_TEXTURE_2D, video);
	addTexturedQuad(*_geode,video->s(),video->t());
	_layer->addChild(_geode);
	return _layer;
}

Si tienes instalado OpenSceneGraph 2.9.7 o superior con osgART 2.0 RC3 tal cual viene el código fuente, al ejecutar este ejemplo desde “/usr/local/bin/osgartsimple” verás algo como esto al mostrar el típico patrón “Hiro” a la cámara:

Si modificas el código anterior a esto:

osg::Group* createImageBackground(osg::Image* video) {
	osgART::VideoLayer* _layer = new osgART::VideoLayer();
	_layer->setSize(*video);
	osgART::VideoGeode* _geode = new osgART::VideoGeode(osgART::VideoGeode::USE_TEXTURE_RECTANGLE, video);
	addTexturedQuad(*_geode,video->s(),video->t());
	_layer->addChild(_geode);
	return _layer;
}

Y luego compilas e instalas osgART 2.0 RC3 otra vez, “/usr/local/bin/osgartsimple” funcionará sin problemas.

Instalar osgART 2.0 RC3 con OpenSceneGraph 2.8.3 o 2.9.6 y soporte para Collada en Ubuntu 12.04

Antes de instalar osgART tenemos que instalar ARToolKit, collada-dom y OpenSceneGraph así que echar un vistazo a los siguientes post antes de continuar:

Una vez instaladas las dependencias para osgART descargarse el código de osgART 2.0 RC3 de aquí y descomprimirlo. Ejecutar los siguientes comandos:

mkdir build
cd build
cmake .. -DCMAKE_CXX_FLAGS=-fpermissive -DCMAKE_MODULE_LINKER_FLAGS=-lgstreamer-0.10 -DCMAKE_SHARED_LINKER_FLAGS=-lgstreamer-0.10
make
sudo make install

Se puede quitar la opción “-DCMAKE_CXX_FLAGS=-fpermissive” si se añaden los siguientes includes en el fichero “include/osgART/Utils” justo después de “#include <iostream>“:

#include <cstdlib>
#include <limits>

Configurar la variable de entorno ARTOOLKIT_CONFIG (ya deberías tenerla configurada al instalar ARToolKit):

export ARTOOLKIT_CONFIG="v4l2src device=/dev/video0 use-fixed-fps=false ! ffmpegcolorspace ! capsfilter caps=video/x-raw-rgb,bpp=24 ! identity name=artoolkit ! fakesink"

Y ejecutar el ejemplo mientras se muestra el marcador de “Hiro” a la cámara:

cd /usr/local/bin/
./osgartsimple

Si te aparece este error:

Plugin '-1' unknown!
Could not initialize video plugin!

Se debe a que no se han copiado correctamente las librerías de osgART a la carpeta de librerías (“/usr/local/lib“) o a la carpeta de librerías de OSG (“/usr/local/lib/osgPlugins-X.X.X“). Verifica que hay un fichero llamado “libosgART.so” en “/usr/local/lib” y que tienes los ficheros “osgdb_osgart.so“, “osgart_tracker_artoolkit2.so” y “osgart_video_artoolkit2.so” en la carpeta de librerías de OSG (que debería ser “/usr/local/lib/osgPlugins-2.8.3“o “/usr/local/lib/osgPlugins-2.9.6” en función de la versión de OSG que instalaste). Ten en cuenta que si instalas varias versiones de OSG es posible que el plugin de osgART no se copie a la carpeta de plugins de la versión de OSG que tu quieres. Ejecuta esto también por si acaso:

sudo ldconfig /etc/ld.so.conf

Si se ve el fondo negro se debe a un pequeño bug en ARToolKit. Se puede arreglar modificando en ARToolKit la función “ar2VideoCapNext” en el fichero “lib/SRC/VideoGStreamer/video.c en la línea 378 par que devuelva un 0 en vez de TRUE O modificando el fichero de osgART “src/osgART/Video/ARToolKit/ARToolKitVideo.cpp” en la línea 310 de esto:

if (0 == ar2VideoCapNext(video))

A esto:

if (ar2VideoCapNext(video))

Para utilizar la opción de ARToolKit donde cada fotograma se compara con los anteriores para obtener un tracking más suave del marker, se debe cambiar una línea de código de osgART. Dentro del fichero “src/osgART/Traker/ARToolKit/SingleMarker.cpp” descomentar la línea 76 y comentar la línea 77. Es decir pasar de esto:

//arGetTransMatCont(markerInfo, patt_trans, patt_center, patt_width, patt_trans);
arGetTransMat(markerInfo, patt_center, patt_width, patt_trans);

A esto:

arGetTransMatCont(markerInfo, patt_trans, patt_center, patt_width, patt_trans);
//arGetTransMat(markerInfo, patt_center, patt_width, patt_trans);

Fuentes: http://projects.springlobby.info/issues/1575
https://github.com/bitcoin/bitcoin/pull/456
https://code.ros.org/trac/opencv/ticket/1020
http://forum.openscenegraph.org/viewtopic.php?t=7755
http://code.google.com/p/chromium/issues/detail?id=108945

Instalar OpenSceneGraph 2.9.6 con soporte para Collada en Ubuntu 12.04

Aunque normalmente uso OpenSceneGraph 2.8.3 para trabajar con osgART 2.0 RC3 también se puede usar OpenSceneGraph 2.9.6 (de hecho es la última versión compatible con osgART ACTUALIZACIÓN: leer este post para hacer funcionar osgART 2.0 RC3 en la versión 2.9.7 y superiores). Te lo puedes descargar usando SVN:

svn checkout http://www.openscenegraph.org/svn/osg/OpenSceneGraph/tags/OpenSceneGraph-2.9.6 OpenSceneGraph-2.9.6

Los pasos para instalar OSG 2.9.6 con soporte para Collada en Ubuntu 12.04 son los mismos que expliqué en “Instalar OpenSceneGraph 2.8.3 con soporte para Collada en Ubuntu 12.04“, solo que hay que hacer unos cambios más al código fuente por culpa de FFMpeg. Así que tan solo añade estos cambios a los que ya expliqué para OSG 2.8.3 y luego procede a la instalación de manera normal:

/src/osgPlugins/ffmpeg/FFmpegDecoderAudio.cpp
– En la línea 276 cambia esto:

const int bytes_decoded = avcodec_decode_audio2(m_context, reinterpret_cast(buffer), &data_size, m_packet_data, m_bytes_remaining);

Por esto:

#if LIBAVCODEC_VERSION_MAJOR >= 53 || (LIBAVCODEC_VERSION_MAJOR==52 && LIBAVCODEC_VERSION_MINOR>=32)
            AVPacket avpkt;
            av_init_packet(&avpkt);
            avpkt.data = const_cast<uint8_t *>(m_packet_data);
            avpkt.size = m_bytes_remaining;

            const int bytes_decoded = avcodec_decode_audio3(m_context, reinterpret_cast<int16_t*>(buffer), &data_size, &avpkt);
#else
            // fallback for older versions of ffmpeg that don't have avcodec_decode_audio3.
            const int bytes_decoded = avcodec_decode_audio2(m_context, reinterpret_cast<int16_t*>(buffer), &data_size, m_packet_data, m_bytes_remaining);
#endif

/src/osgPlugins/ffmpeg/FFmpegDecoderVideo.cpp

– En la línea 168 cambia esto:

const int bytes_decoded = avcodec_decode_video(m_context, m_frame.get(), &frame_finished, m_packet_data, m_bytes_remaining);

Por esto:

#if LIBAVCODEC_VERSION_MAJOR >= 53 || (LIBAVCODEC_VERSION_MAJOR==52 && LIBAVCODEC_VERSION_MINOR>=32)
            AVPacket avpkt;
            av_init_packet(&avpkt);
            avpkt.data = const_cast<uint8_t *>(m_packet_data);
            avpkt.size = m_bytes_remaining;

            const int bytes_decoded = avcodec_decode_video2(m_context, m_frame.get(), &frame_finished, &avpkt);
#else
            // fallback for older versions of ffmpeg that don't have avcodec_decode_video2.
            const int bytes_decoded = avcodec_decode_video(m_context, m_frame.get(), &frame_finished, m_packet_data, m_bytes_remaining);
#endif

Fuentes: http://code.metager.de/source/xref/OpenSceneGraph/src/osgPlugins/ffmpeg/FFmpegDecoderAudio.cpp