Utiliser sed et les regex pour déplacer une partie de nom de fichier

Un petit mémo (pour moi ou d’autres qui seraient intéressés qui peut d’ailleurs servir de mini tuto à l’utilisation de sed. Je ne rentrerai pas dans les détails sur ce qu’est sed, Internet fourmille d’informations et vous n’avez qu’à demander à un moteur de recherche.

Dans mon cas, je dispose de fichiers de la forme suivante :

image000010_bureauc-20140604_Kinect_gw_CB3D_adpt_L1P1.bmp

Chaque élément du nom de fichier est important et apporte une information sur la façon dont il a été généré. Dans un seul et unique dossier de résultats, je dispose de fichiers nommés comme précédemment, mais un seul élément change : la partie rouge. Cette partie peut avoir plus de 10 valeurs différentes.

Comme les images se suivent, le dossier liste les fichiers dans l’ordre numérique. J’ai donc une succession de plus de 10 d’images numérotées « 000010 », autant que j’ai de parties rouges différentes. La solution est donc de déplacer cette partie rouge au début du nom de fichier.

Or, pas facile de faire ça à la main sur des centaines d’images. On va scripter ça en bash avec des expressions régulières. Notez qu’on pourrait utiliser la commande rename mais je ne connais pas très bien sa syntaxe.

On va donc écrire une expression régulière qui va matcher nos noms de fichiers actuels, la découper en 3 morceaux et redisposer les morceaux dans l’ordre qu’on souhaite.

's/(image[0-9]{6}_bureauc-20140604_Kinect_)([a-zA-Z0-9]{1,8})_(CB[0-9]D_adpt_L[0-9]P[0-9].bmp)/\2_\1\3/'

Les parenthèses ( ) définissent des groupes numérotés dans l’ordre, que l’on réutilise en 2ème partie de la regex pour les redisposer dans l’ordre souhaité.

La commande finale pour obtenir le nouveau nom de fichier est donc :

newfilename=$(echo "$filename" | sed -r 's/(image[0-9]{6}_bureauc-20140604_Kinect_)([a-zA-Z0-9]{1,8})_(CB[0-9]D_adpt_L[0-9]P[0-9].bmp)/\2_\1\3/')

Note : il est possible de considérer une liste de valeurs acceptables pour chaque élément. Par exemple l’élément représenté par « Kinect » ici peut aussi être « BB2 ». On teste le matching de plusieurs valeurs avec une parenthèse comme ceci

$(echo "$filename" | sed -r 's/(image[0-9]{6}_bureauc-20140604_(BB2|Kinect)_)([a-zA-Z0-9]{1,8})_(CB[0-9]D_adpt_L[0-9]P[0-9].bmp)/\3_\1\4/')

Notez que ceci ajoute un nouveau groupe numéroté 2. Comme il est imbriqué dans le groupe 1, on ne va pas s’en servir dans la seconde partie de la regex. Par contre, ça décale les numéros des groupes suivants, aussi le dernier groupe devient le numéro 4.

Faire fonctionner une Kinect sur Ubuntu (à partir de 12.10) avec OpenNI et SensorKinect

Addendum 03/06/2014

Je viens d’apprendre que OpenNI venait d’être fermé le 23/04/2014 dernier après l’acquisition de PrimeSense par Apple. Bien que je trouve particulièrement honteux de la part d’Apple de mettre la main sur des technologies libres et de les enlever de la main des bidouilleurs et des chercheurs qui en faisaient usage, les codes sources sont toujours disponibles sur les dépôts github que je donne dans cet article. La question est : pour combien de temps ?

Je vous recommande donc de les sauvegarder rapidement, car il n’est pas impossible que ces dépôts soient fermés de force dans peu de temps. Le code source est libre mais plusieurs composants ne le sont pas, ce qui empêche n’importe qui de les distribuer comme il le souhaite.

Dans le cadre de mes recherches, je suis amené à effectuer des acquisitions avec divers capteurs, tels que des caméras, des stéréoscopes, et également Kinect. Comme mon environnement de travail est Ubuntu, cet article va parler de l’installation de tout le nécessaire pour le fonctionnement de Kinect sous cette distribution.

Pourquoi cet article ?

Parce qu’au long du parcours nécessaire pour parvenir à faire fonctionner ce capteur sous Linux, je suis tombé sur un bon nombre d’articles sur des blogs et des wikis, assez souvent relativement anciens. Or, les librairies ont rapidement évolué ces derniers mois (nous sommes en Janvier 2014 quand j’écris ces lignes) et bien souvent, les tutoriels ne sont plus à jour. C’est pourquoi j’ai choisi d’en faire un à mon tour, qui sera plus à jour que les autres car un jour ou l’autre, je devrai installer Kinect sur un autre ordinateur et je n’aurai plus à chercher comment faire.

En plus, si ça peut servir à d’autres personnes, tant mieux !

De quoi a-t-on besoin ?

Kinect sous Linux nécessite au minimum 2 librairies pour fonctionner :

  • OpenNI : cette librairie contient un certain nombre d’applications qui permettent de traiter les flux provenant de la Kinect. Elle doit iêtre installée en premier. A l’heure où j’écris, la version est 1.5.7.10.
  • SensorKinect : il s’agit du pilote, qui permet à l’ordinateur de dialoguer avec la Kinect à travers le port USB. A l’heure où j’écris, la version est 5.1.2.1.

Également, pour certaines applications, le middleware NiTE qui permet notamment de localiser des membres du corps, visages, squelettes 3D, etc. Comme je n’en ai pas eu besoin, je ne traiterai pas l’installation de ce soft dans cet article (je le mettrai cependant à jour si je décide de l’installer).

Dépendances

Avant de commencer, il est nécessaire d’installer certaines librairies des dépôts Ubuntu.

1
sudo apt-get install build-essential g++  python libusb-1.0-0-dev freeglut3-dev openjdk-6-jdk doxygen graphviz git-core

Cette commande couvre l’ensemble des dépendances pour OpenNI et SensorKinect (SensorKinect n’a en fait surtout besoin que de freeglut3-dev et de libusb-1.0-0-dev).

Télécharger les librairies

Commençons par créer un répertoire Kinect/ dans notre home.

1
2
mkdir ~/Kinect 
cd ~/Kinect

C’est dans ce répertoire que nous allons télécharger les codes sources nécessaires.

Cloner le dépôt git d’OpenNI

Nous allons utiliser le dépôt git d’OpenNI afin d’avoir une version la plus à jour possible. Une fois le dépôt cloné, nous switchons sur la branche unstable, car cette version est nécessaire pour la compilation du driver ensuite.

1
2
git clone https://github.com/OpenNI/OpenNI.git
git checkout unstable

Cloner le dépôt git de SensorKinect

Nous allons faire exactement la même chose, avec cependant quelques remarques préalables.

Si vous avez déjà lu quelques tutoriels, vous aurez remarqué que le dépôt git officiel est celui de l’utilisateur avin2 (https://github.com/avin2/SensorKinect.git). Cependant, j’ai rencontré de grosses difficultés pour compiler ce driver sous Ubuntu, même en utilisant la branche unstable. Du coup, j’ai pu trouver un autre dépôt qui fournit une version compilable, qui est celle de l’utilisateur ph4m. Allons-y.

git clone https://github.com/ph4m/SensorKinect.git
git checkout unstable

Compiler les librairies

Nous allons maintenant compiler OpenNI et SensorKinect, dans cet ordre.

Compiler OpenNI

cd ~/Kinect/OpenNI/Platform/Linux/CreateRedist/
chmod a+x RedistMaker
sudo ./RedistMaker

Le script RedistMaker compile et prépare le package d’OpenNI. Cette opération prend évidemment quelques minutes. Si la compilation échoue, remontez le terminal et vérifiez que la cause n’est pas une dépendance non satisfaite par exemple.

Normalement, si tout s’est bien déroulé, un dossier OpenNI/Platform/Linux/CreateRedist/Final/ sera créé. S’il n’existe pas et/ou ne contient pas une archive tarball, c’est que la compilation a échoué.

Un dossier OpenNI/Platform/Linux/Redist/ a également été créé. Il contient la librairie compilée que nous allons maintenant installer.

cd ../Redist/OpenNI-Bin-Dev-Linux-x**-v1.5.7.10/
chmod a+x install.sh
sudo ./install.sh

Suite à l’exécution de ce script, la librairie OpenNI est installée. Passons à SensorKinect.

Compiler SensorKinect

On procède quasiment de la même manière pour le pilote :

cd ~/Kinect/SensorKinect-unstable/Platform/Linux/CreateRedist/
chmod a+x RedistMaker 
sudo ./RedistMaker

Un peu d’attente en attendant la compilation… Pareil que pour OpenNI, vérifiez bien que la compilation se déroule sans souci. Une fois que c’est terminé, on installe :

cd ../Redist/Sensor-Bin-Linux-x**-v5.1.2.1/
sudo ./install.sh

C’est terminé pour la compilation.

Tester

Commencez par brancher la Kinect sur un port USB. Pour tester, nous allons essayer un programme sample de OpenNI.

cd ~/Kinect/OpenNI/Platform/Linux/Bin/x**-Release/
./NiViewer

Normalement, vous devriez voir les 2 flux d’images (profondeur/RGB) de la Kinect. A partir de là, vous pouvez faire tout ce que vous voulez, votre Kinect est opérationnelle.

Erreurs possibles

Si, en revanche, vous avez une erreur « Failed to set USB interface« , alors il reste une petite étape.

En fait, SensorKinect installe un module nommé « gspca_kinect » dans le kernel. Ce module permet à Ubuntu d’utiliser la Kinect comme une caméra standard afin de l’utiliser avec une application « classique ». Aussi, ce module est en conflit avec OpenNI lorsqu’il essaie d’accéder à la Kinect (source : https://groups.google.com/forum/#!topic/openni-dev/LZpcyCfh9UE)

Donc, il suffit de supprimer ce module :

sudo modprobe -r gspca_kinect

Pour régler le problème même après le redémarrage de l’ordinateur, vous pouvez aussi le blacklister. Personnellement, je n’ai pas eu à le faire.

sudo sh -c 'echo "blacklist gspca_kinect" &gt; /etc/modprobe.d/blacklist-<wbr />kinect.conf'

 

Pandore useful

Pour permettre à Nautilus d’ouvrir des fichiers PAN pour Pandore sous Ubuntu (ou Linux, de manière générale), il est nécessaire de créer une nouvelle association de fichiers.

Pour ce faire, créer un fichier :

~/.local/share/applications/pan.desktop

et le remplir avec le contenu suivant. Évidemment, il est nécessaire d’adapter le chemin de la ligne « Exec » avec le chemin vers pvisu.

1
2
3
4
5
6
7
8
9
10
11
[Desktop Entry]
Encoding=UTF-8
Name=Pan viewer pvisu
Comment=Open PAN files
Exec="pvisu %u"
Terminal=false
Type=Application
Categories=Application
StartupNotify=true
MimeType=application/octet-stream;
NoDisplay=true