Décomposition des six faces du cube en mosaïque d’images

10 décembre 2009 - Mots-clés : Liens Linux Photographie

Décomposition six faces du cube en une mosaïque de tuiles

Cette décomposition en tuiles est nécessaire pour la visualisation du panorama sphérique par un visualisateur prenant en charge ce format. Un tel exemple de visualisateur est SaladoPlayer que j'utilise pour mon site.

Sur le site de Frank Dürr, j'ai trouvé un script pour effectuer cette convertion. Il utilise des outils écrits en Java. Vous trouverez le script ainsi que les outils Java dans le répertoire tools dans cette archive. Ce script s'appelle prepare_cubic_pano.sh et les deux outils EquirectangularToCubic.jar et DeepZoomTiler.jar. Face à une erreur de mémoire dès le premier essai, j'ai tout de suite décidé d'utiliser une solution éprouvée que je vous décris ci dessous.

Mon script, basé sur celui de Frank, utilise le module Python deep-zoom-tools.

Le script décompose chaque face du cube en tuiles au format deepzoom. La conversion d'une image panoramique équirectangulaire en cube a été traité précédemment dans l'article « Décomposition d’une image panoramique en faces de cube ».

Pour convertir les six faces du cube (.jpg) vers le format deepzoom, j'utilise le script suivant :

cube2tiles.sh

#!/bin/sh

QUALITY=95 # Quality of final jpg files. Value must be in range [0,100]

function usage {
        cat <<EOF
Usage: $0 -q QUALITY INTPUTDIR OUTPUTDIR
Create cubic pano including deep zoom tiles for PanoSalado2 (SaladoViewer).

QUALITY: quality of jpg images in range [0.0,1.0] (0.0 = worst, 1.0 = best)
INPUTDIR: intput directory of cube faces
OUTPUTDIR: output directory of tiles of cubic panorama
EOF
}

# Parse command line options
while getopts "q:h" options; do
        case $options in
                q) QUALITY="$OPTARG";;
                *) usage;
                   exit 1;
        esac
done

# Remove flags, so $1 points to input file
shift $(($OPTIND - 1))

if [ $# -ne 2 ] ; then
        usage
        exit -1
fi

INDIR=$1
OUTDIR=$2

if [ ! -d $INDIR ] ; then
   echo "$INDIR n'existe pas" ; exit 1
fi
if [ ! -d $OUTDIR ] ; then
   echo "$OUTDIR n'existe pas" ; exit 1
fi

# Creates deep zoom tiles for each cube face in sub-dirs
for FACE in face_f face_r face_b face_l face_u face_d ; do
   #img2dzi -s 512 -f jpg -o 1 -q 0.$QUALITY $INDIR/$FACE.tif
   vips dzsave $INDIR/$FACE.tif $OUTDIR/$FACE --tile-size 512 --suffix .jpg[Q=$QUALITY]
   mv $OUTDIR/$FACE.dzi $OUTDIR/$FACE.xml
   mv $OUTDIR/${FACE}_files $OUTDIR/$FACE
   sed -e "s/UTF/utf/" -e "s/2008/2009/" -e "s/xmlns/xmnls/" -e "s/></>\n</g" -i $OUTDIR/$FACE.xml
done

exit 0

Le script a deux paramètres d'entrée :

  • le premier est le répertoire contenant les 6 faces du cube ;
  • le deuxième est le répertoire qui contiendra le résultat de la conversion.

Après traitement, le répertoire de sortie contient pour chaque face :

  • un fichier xml (ex: face_b.xml) ;
  • un répertoire contenant la décompostion en images (ex: face_b).

La convention de nommage des faces est la suivante :

  • face_b pour «back» : arrière ;
  • face_d pour «down» : bas ;
  • face_f pour «front» : devant ;
  • face_l pour «left» : gauche ;
  • face_r pour «right» : droite ;
  • face_u pour «up» : haut ;

Exemple d'utilisation :

cube2tiles.sh repertoire/cube ~/tmp/tuiles

Comments