1 Introduction
Il est généralement difficile aux étudiants de trouver les plans nécessaires pour étudier la structure d'un monument ancien. Les plans anciens, s'ils existent, sont souvent incomplets. Nous présentons ici un tutorial utilisant deux logiciels libres1 pour obtenir simplement à partir de photos les nuages de points et les maillages permettant d'établir les plans nécessaires à l'analyse structurelle. Il n'est pas nécessaire d'avoir de connaissances particulières en photogrammétrie pour utiliser ces logiciels, les principes de bases sont expliqués ci-dessous. Les logiciels utilisés ici sont VisualSFM et MeshLab. Ils ont été développés par des étudiants dans un cadre universitaire, et leur usage combiné permet d'obtenir des nuages de points en 3D et des maillages, uniquement à partir de photos. Ils sont téléchargeables sur Internet sous forme compilée pour Windows, permettant leur usage par le plus grand nombre, sans nécessiter de connaissances informatiques poussées. De plus l'utilisation des cartes graphiques nVidia par VisualSFM permet d'accélérer grandement les temps de calcul pour la production des nuages de points : il n'est pas nécessaire d'avoir une machine très puissante pour accéder rapidement aux premiers résultats. Nous présentons ci-dessous le principe de fonctionnement de ces logiciels, et l'illustrons sur quelques exemples. Notre objectif n'est pas de décrire précisément le fonctionnement de ces logiciels, mais de simplement de donner les grandes lignes du fonctionnement afin de permettre l'utilisation de leurs fonctions de base. Nous donnons à la fin de cet article les références de sites en anglais pour en apprendre plus sur ces logiciels.2 VisualSFM
2.1 Principe de fonctionnement
VisualSFM a été développé par Changchang Wu à l'université de Washington à Seattle. Ce logiciel permet de construire un nuage de points 3D à partir de photos, sans que l'utilisateur ait à entrer dans son ordinateur de données particulières autres que les photos. La particularité de VisualSFM réside d'une part dans son interface graphique, alors que la plupart des autres logiciels libres fonctionnent en lignes de code, et dans l'affichage en temps réel de la construction du nuage de points. Les étapes simplifiées2 du processus sont les suivantes :- Recherche des points-clés ["features"] pour chaque photo. En effet les photos ne sont pas comparées intégralement les unes aux autres. Seuls les points-clés vont être comparés entre-eux.
- Recherche des correspondances ["feature matches"] pour chaque couple de photos. Ces correspondances sont des points-clés identiques apparaissant sur des photos différentes. Plus un couple de photos a de correspondances, plus les photos sont similaires (i.e. plus l'angle de vue et les zones couvertes par les photos sont similaires).
- Recherche des inliner matches. Certaines correspondances trouvées lors de l'étape précédente peuvent être fausses, par exemple si un même motif se trouve plusieurs fois sur une surface. VisualSFM supprime ces erreurs dans le groupe des feature matches, et obtient ainsi les inliner matches. Le principe est grossièrement le suivant. Si on place les deux photos côte-à-côte, et si on trace des lignes entre les points-clés communs, la majorité de ces traits décrit une transformation géométrique commune. Ils peuvent par exemple être tous parallèles si la différence entre les photos est une simple translation. Cependant, les traits des erreurs de correspondances auront une direction incompatible avec la transformation géométrique globale. Ce sont ces erreurs de correspondance qui sont supprimés lors de cette étape, en passant des feature matches aux inliner matches. Les reflets sur les surfaces réfléchissantes (vitres, miroirs, pièces métalliques etc.) vont être supprimés lors de cette étape, c'est pourquoi ce type de surface n'apparaît généralement pas (ou mal) sur les nuages de points. La figure 1 illustre le résultat de cette étape sur un exemple.
- Sparse reconstruction . Chaque photo est caractérisée par un ensemble de paramètres décrivant l'objectif et sa position (profondeur de focale de la lentille, déformation, orientation de l'objectif dans l'espace etc.). Ces paramètres caractérisent un système de projection des points de l'espace sur le plan de la photo. En partant des couples de photos ayant un nombre suffisant de inliner matches, visualSFM calcule les matrices de transformations permettant de passer d'un système de projection à l'autre. Les droites passant par les points-clés et par le centre des objectifs du couple de photos considérées sont alors calculées, puis la position dans l'espace des points-clés est déduite par intersection de ces droites. Les seuls points 3D créés lors de cette étape sont les points correspondant à des points-clés pour lesquels des correspondances ont été trouvés.
- Dense reconstruction. Dans un second temps, il est possible d'augmenter considérablement le nombre de points 3D en utilisant l'algorithme "Dense Reconstuction". VSFM utilise Clustering Views for Multi-view Stereo (CVMS) pour réaliser cette étape.
Fig 1: Feature matches3 à gauche et Inliner matches à droite
Façade occidentale de la cathédrale de Chartres
Façade occidentale de la cathédrale de Chartres
2.2 Installation du logiciel
Le dossier compressé à télécharger pour l'installation se trouve sur la page d'accueil du site de VisualSFM, dans la rubrique Download (choisir le lien "X64" ou "win32" suivant votre version de Windows). Il suffit dans un premier temps de décompresser les fichiers dans un dossier quelconque4 de votre ordinateur. Une fois les fichiers en place, suivez les instructions pour l'installation tirées du site de VisualSFM et traduites ci-dessous :- Essayer de lancer VisualSFM.exe. Si cela ne marche pas, vous devez installer MSVC2010 runtime (64bit, 32bit).
- Faire une des actions suivantes pour PBA (Multicore Bundle Ajustment) :
- Option 1, pour les systèmes avec carte graphique nVidia compatible CUDA, installer CUDA 4.0 toolkit (pas le driver pour développeur).
- Option 2, pour les systèmes sans carte graphique nVidia, télécharger le driver pba.dll pour CPU seul, et remplacer celui compris dans le dossier compressé. NE PAS installer CUDA.
- Option 3, pour les systèmes sans carte graphique nVidia, télécharger le code PBA, compiler pba(_x64).dll pour CPU-seul, et remplacer celui compris dans le dossier compressé.
- (facultatif) Si vous préférez CUDA à GLSL pour SiftGPU (celui dans le dossier compressé ne fonctionne qu'avec GLSL), téléchargez le code de SiftGPU, et compilez SiftGPU-avec-CUDA si vous avez une carte graphique nVidia. Remplacez le siftgpu(64).dll dans le dossier compressé avec le driver compatible CUDA. Vous aurez besoin du toolkit CUDA 4.0 dans ce cas.
- (facultatif) Si vous voulez utiliser Yasutaka Furukawa's patch-based dense reconstruction, téléchargez CMVS/PMVS (disponible ici). Placez les fichiers exe avec leurs drivers dll dans le même dossier que VisualSFM.exe
2.3 Tutorial
Les étapes à suivre pour produire votre premier nuage de points 3D sont indiquées ci-dessous. Pour pouvoir suivre l'avancement des calculs, il est utile de conserver affiché le "Task Viewer". Il peut être activé dans le menu Tools / Show TaskViewer si il a disparu.- Importer une série de photos avec File / Open+ Multi Images.
- Chercher les feature matches avec SfM / Pairwise Matching / Compute Missing Match. Attention cette fonction compare toutes les photos deux à deux, et par conséquent le temps de calcul augmente rapidement avec le nombre des photos. Si vos photos ont été prises dans un certain ordre (par exemple si vous avez fait le tour du monument en prenant régulièrement des photos), utilisez plutôt SfM / Pairwise Matching / Compute Sequence Match, en indiquant le nombre de photos adjacentes qui doivent être comparées autour de chaque photo. Une fois la recherche terminée, vous pouvez afficher la matrice des correspondances (SfM / Pairwise Matching / Show Match Matrix) pour vérifier que les correspondances souhaitées ont bien été trouvées. Dans le cas de photos prises avec un certain ordre, la matrice doit avoir plus ou moins l'aspect de la figure 2. Si des lignes ou des colonnes entièrement vides apparaissent sur la matrice, des modèles séparés seront créés dans la suite.
- Exécuter la sparse reconstruction depuis le menu SfM / Reconstruct 3D. Vous devez voir apparaître progressivement les points de votre modèle lors de l'éxecution de cette étape.
- Exécuter la dense reconstruction depuis le menu SfM / Run CMVS/PMVS. Une fois les calculs terminés, utiliser la touche TAB pour passer de la vue "sparse" à la vue "dense". Le nuage de points est alors prêt à être ouvert avec MeshLab.
- x : met à jour le temps de calcul écoulé depuis le début des calculs. L'étape la plus longue est la dense reconstruction
- retour arrière (backspace) : afficher les aperçus des images (thumbnails)
- z : adapter le zoom aux aperçus des images
- tab : permet de passer de la vue "sparse" à la vue "dense" et vice-versa
- haut-bas : permet de passer d'un modèle au suivant, si plusieurs modèles séparés ont été trouvés
- Il ne faut pas utiliser d'images avec des résolutions supérieures à 3200 pixels. Il est possible d'utiliser des images de dimensions supérieures mais il faut pour cela modifier les paramètres par défaut de VisualSFM.
- Les points-clés et les correspondances de chaque photo sont sauvegardées dans les fichiers .sift et .mat dans le même répertoire que vos photos. Ces fichiers sont chargés en mémoire s'ils existent lors de l'ajout de nouvelles photos à votre projet, ce qui évite de recommencer les premières étapes de recherche des points-clés et des correspondances si vous réouvrez les mêmes images.. Il faut donc supprimer ces fichiers si vous souhaiter recommencer à zéro la recherche des points-clés et des correspondances.
- Les fonctions du menu Rep correspondent à un autre programme de l'auteur de VSFM et ne sont pas nécessaires ici.
Fig 2: Matrice des correspondances pour les photos utilisées pour le nuage de points de la cathédrale de chartres ci-dessous
2.4 Vérification du fonctionnement
Avant de vous lancer avec vos propres images, il est utile de vérifier que votre installation fonctionne correctement. Téléchargez les deux images de statues ci-dessous, et importez les dans VisualSFM. Lancez la comparaison des images. Vous devriez obtenir des résultats de ce type : environ 6200-6400 features par image, et environ 900 feature matches - résultats obtenus avec la version v0.5.17 de VSFM. Les informations affichées dans le Task Viewer par VSFM lors de ce tests devraient être similaires à la reproduction ci-dessous. Si le nombre de features par image ou le nombre de feature matches est très éloignée des nombres données ici, il est possible que votre installation ne marche pas correctement et que vous ne réussissiez pas à obtenir de modèles lors des étapes ultérieures. Vous pouvez chercher des informations complémentaires sur ce site (en anglais) : Google Groups VSFM.0: StatuesPortailSudA image_size: 600x800 1: StatuesPortailSudB image_size: 600x800 Loading image pixel data ...done Compute Missing Pairwise Matching, begin... ********* WARNING *********** More than 175MB of graphic memory may be allocated under default settings. If the program halts here, adjust parameters to save memory and rerun the task: Menu->Tools->Enable GPU->Set Maximum DIM Note some octaves may be automatically skipped SIFT: 600x800, 6254, 2.78sec SIFT: 600x800, 6445, 0.22sec ###########-------timing------######### 2 Feature Detection finished, 3 sec used ############################# 1 pairs to compute match 0000 and 0001: 906 matches, 0.52sec, #0 ###########-------timing------######### 1 Image Match finished, 1 sec used ############################# NOTE: using 4 matching threads 0000 and 0001: E[847/906], H[54], 0.02sec ###########-------timing------######### 1 Putative Match finished, 1 sec used 1 Geometric Verification finished, 0 sec used ############################# ---------------------------------------------------------------- Compute Missing Pairwise Matching, finished Totally 4.000 seconds used
Fig 3: Photos pouvant être utilisées pour la vérification du fonctionnement - features et feature matches
Statues du portail Nord de la cathédrale de Chartres
Statues du portail Nord de la cathédrale de Chartres
3 MeshLab
3.1 Principe de fonctionnement
Les nuages de points 3D sont comme leur nom l'indique un groupe de points (ou nœuds - "vertices"). A chaque point est affecté trois coordonnées, une couleur, et un vecteur normal5. VisualSFM produit à partir des photos un fichier .ply qui contient les coordonnées de chaque point du nuage de points 3D, sa couleur, mais pas d'information sur le vecteur normal correspondant. MeshLab permet de travailler sur le nuage de points, pour permettre son exploitation : par exemple pour diminuer le nombre de points, créer des maillages6, ajouter des textures sur des maillages etc. Une fois le maillage obtenu, MeshLab permet également d'extraire des coupes afin de produire les plans désirés. MeshLab fonctionne un peu comme un logiciel de dessin, avec un système de calques où sont rangés les nuages de points et maillage, et sur lesquels il est possible d'appliquer des filtres prédéfinis. Nous indiquons dans la suite les étapes à suivre pour exploiter le fichier avec .ply fourni par VisualSFM. Nous indiquons à chaque fois les filtres à appliquer sur les nuages de points et maillages. Ces filtres se trouvent dans le menu Filters de MeshLab.3.2 Installation du logiciel
L'installation de MeshLab ne présente pas de difficulté particulière. La dernière version de l'installateur de ce programme sous Windows est disponible sur sourceforge.3.3 Nuages de points
Si le nombre de points de votre nuage est trop important pour être manipulé rapidement sur votre ordinateur, ou si vous souhaitez créer un maillage, il faut rééchantillonner votre nuage de points, en appliquant le filtre Sampling / Poisson-disk Sampling. La case Base mesh subsampling doit être cochée (car pour l'instant les éléments du maillage n'existent pas). Entrez le nombre de points souhaités dans la case Number of samples. Nous ne travaillerons dans la suite qu'à partir de ce nouveau nuage de points, que nous appelerons "nuage de points complet" dans la suite, pour le distinguer du nuage de points de VisualSFM. Si vous souhaitez travailler directement sur le nuage de points complets pour tracer des coupes ou prendre des mesures, il ne reste alors qu'à mettre à l'échelle ce nuage de points. Sinon, il faut effectuer les opérations suivantes avant de passer à la création du maillage :- supprimer les points ou groupes de points isolés correspondant à des artefacts lors de la "dense reconstruction" avec VisualSFM et CMVS. Pour la sélection des points isolés, il est possible d'appliquer le filtre Point set / Estimate radius from density qui calcule la distance moyenne de chaque point avec ses plus proches voisins, puis sélectionner les points isolés avec Selection / Conditional Vertex Selection en choisissant comme condition rad>0.01 (moduler la valeur pour ne garder que les points qui vous intéressent). Il faut à la fin de cette étape ne conserver que les points qui appartiennent au modèle désiré. Les points situés en dehors risquent de créer de nouveau artefacts lors de la création du maillage, et d'allonger inutilement les temps de calcul nécessaires.
- Pour pouvoir travailler à la création de maillages sur un ordinateur portable avec des temps de calcul raisonnable, le nombre de points doit être compris entre 20k et 200k environ suivant la taille de votre nuage de départ et la précision souhaitée.
- Le CGAL propose d'effectuer un lissage sur le nuage de points avant de commencer le maillage (Point Set Processing), mais nous n'avons pas encore trouvé comment appliquer ce lissage au nuage de points avec MeshLab.
3.4 Création d'un maillage
La création d'un maillage à partir d'un nuage de points peut s'effectuer à l'aide du filtre Remeshing, simplification and reconstruction / Surface Reconstruction : Poisson. Pour pouvoir appliquer cette méthode, il faut disposer d'un nuage de points ET des vecteurs normaux correspondant à ces points. Les normales ne sont pas calculées par défaut par VisualSFM, et il faudra donc commencer par les calculer. Il existe plusieurs méthodes pour aboutir au maillage, nous proposons les étapes7 décrites ci-dessous.- Création d'un petit nuage de point contenant environ 10k points, en appliquant la méthode de rééchantillonnage vue ci-dessus. On applique ensuite sur ce petit échantillon Point Set / Compute Normals for Point Set, avec la case Flip normals w.r.t. viewpoint cochée8, et en entrant les coordonnées d'un point fictif éloigné du maillage (par exemple 0,0,-1000).
- Création d'un premier maillage, qui va simplement servir à transférer les normales sur le nuage de points complet. Utiliser Filters /Remeshing, simplification and reconstruction / Surface Reconstruction : Poisson, avec Octree Depth égal à 6. Transférer ensuite les normales de ce maillage vers le nuages de points complets, avec Sampling / Vertex Attribute Transfer en cochant uniquement Transfer normal, et en choisissant votre premier maillage pour Source mesh et votre nuage de points complet pour Target mesh. Il est possible de remplacer ces deux premières étapes en appliquant directement le filtre Compute Normals for Point Set au nuage de points complet, si ce dernier est suffisamment petit. Si le nuage est trop grand, l'application du filtre peut-être très longue ou faire planter MeshLab.
- Maintenant que l'ensemble des points possède un vecteur normal, il est possible d'appliquer le filtre de construction du maillage : Remeshing, simplification and reconstruction / Surface Reconstruction : Poisson, en choisissant Octree Depth entre 6 et 12 selon la précision du maillage désiré, et Solver Divide entre la valeur de Octree Depth et cette valeur moins 2. Attention le temps de calcul augmente très rapidement avec Octree Depth, et il vaut mieux commencer avec Octree Depth égal à 6 et l'augmenter de 1 en 1. L'effet de la valeur de Octree Depth est illustrée sur la figure 4. Sur cet exemple on voit le raffinement du maillage au fur et à mesure que le paramètre Octree Depth augmente9. A la fin de l'étape (3), on obtient donc le maillage recherché, mais il ne possède pour l'instant pas de couleur.
- Pour transférer les couleurs contenues dans le nuage de point sur votre nouveau maillage, appliquez Sampling / Vertex Attribute transfer, en cochant Transfer color, et en choisissant votre nuage de points pour Source mesh et votre nouveau maillage pour Target mesh.
Fig 4: Maillage obtenu avec un Octree Depth de 6 à 10 (de g. à d.)
Statues du portail Nord de la cathédrale de Chartres
Statues du portail Nord de la cathédrale de Chartres
Fig 5: Nuage de points obtenu par VSFM et affiché par MeshLab
Façade occidentale de la cathédrale de Chartres
Façade occidentale de la cathédrale de Chartres
Fig 6: Nuage de point obtenu par VSFM à g. - Maillage obtenu avec MeshLab à d.
Affichage sous MeshLab
Statues du portail Nord de la cathédrale de Chartres
Affichage sous MeshLab
Statues du portail Nord de la cathédrale de Chartres
Fig 7: Détail du nuage de point de la figure 6
Affichage sous MeshLab
Statues du portail Nord de la cathédrale de Chartres
Affichage sous MeshLab
Statues du portail Nord de la cathédrale de Chartres
4 Conclusion
Les relevés que nous avons obtenu en appliquant cette méthode sont moins précis que les relevés avec un laser 3D, mais ils sont beaucoup plus faciles à obtenir. Il suffit d'un appareil photo compact et d'un ordinateur portable muni d'une carte graphique nVidia ou équivalent. Les logiciels décrits ci-dessus peuvent donc apporter une aide non négligeable aux étudiants cherchant à obtenir à peu de frais des relevés fiables sur les structures qu'ils modélisent. Afin de poursuivre la découverte des logiciels mentionnés ici, nous vous conseillons la visite des sites Internets suivants (en anglais).- VisualSFM et CMVS
- Site officiel de VisualSFM.
- Site officiel de Clustering Views for Multi-view Stereo (CMVS), et le site proposant les versions compilées pour windows de CMVS dont le lien est donné dans les instructions d'installations traduites plus haut.
- Images pour tester le fonctionnement de votre installation de VisualSFM et CMVS, avant d'utiliser vos propres images :
- IS-3D: Automatic 3D Virtual Model Builder from Photographs, et les sets d'images de ce projet.
- MultiView Stereo : ce site propose un benchmark qui permet de tester la précision des nuages de points d'un logiciel, par rapport à l'objet qui a servit de modèle et qui a fait l'objet d'un relevé laser 3D.
- MeshLab
- Site officiel de MeshLab.
- Tutorials vidéos pour MeshLab : MrPMeshLabTutorials. En particulier un tutorial très intéressant pour l'application des reconstructions de surface 3D Scanning : merging with Poisson filter.
- Pour aller plus loin avec MeshLab : Meshing Point-clouds et Remeshing and Texturing.
- Pour comprendre les processus de création des maillages, et les traitements à appliquer aux nuages de points préalablement, le site Computational Geometry Algorithms Library offre des exemples illustrés très didactiques. Attention cependant, ces exemples font partie d'un manuel d'utilisation d'un logiciel qui n'a rien à voir avec MeshLab. Les exemples les plus intéressants pour les problématiques traités ici sont :
Révisé le : 27/10/2013.