Scan3D

De fablabo

à l'occasion de la fabacademy j'ai réalisé divers tests de scan 3D avec différentes techniques

Photogramétrie

Cette technique issue de la photographie aérienne permet de déduire une forme 3D de plusieurs vues 2D d'un objet prises sous différents angles.

elle peut être précise et est assez pratique de par le fait qu'elle utilise un simple appareil photo comme capteur. elle est aussi de ce fait adaptable à de différentes échelles d'objets. Par contre elle est difficile à mettre en oeuvre car les calculs mathématiques sont compliqués.


Une version commerciale de cette technique est disponible en ligne depuis peu avec 123Dcatch d'autodesk. Mais il existe des solution libres.

openMVG

librairies de reconstruction par homographie (plusieures prises de vues)

Cette librairie se veut simple...mais j'ai réussi à la compiler et à jouer les exemples, je n'ai pas compris comment m'en servir...


MicMac

http://logiciels.ign.fr/?Micmac

Développé à l'IGN, ce logiciel a l'air très performant (j'ai testé l'exemple bouddha) mais compliqué d'abord aussi

un article en français sur le sujet

tutoriel en anglais


Compilation de MicMac

path2repertoire : repertoire d'installation du bidule


cd path2repertoire

hg clone https://culture3d:culture3d@geoportail.forge.ign.fr/hg/culture3d micmac-hg

cd micmac-hg

mkdir bin

mkdir build

cd build

cmake ../ -DWITH_INTERFACE=1

make -j2

make install PREFIX=path2repertoire/micmac-hg/bin

notes :

- hg sous fedora est dans le paquet mercurial

- l'option -DWITH_INTERFACE=1 permet d'activer la compilation de l'interface graphique

- l'option -j2 compilation pour un cpu double cœur

- l'option install PREFIX=path2repertoire/micmac-hg/bin fait l'installation dans le répertoire path2repertoire/micmac-hg/bin

bouddha

c'est le fichier exemple fourni sur le site de l'ign:

Bouddha.jpg

Ceci est une des 30 images des données de départ

Boudha.meshlab.png

le nuage de points dans meshlab

Ceci m'a permis de tester la reconstruction dans meshlab, avec le filtre "surface reconstruction poisson"

Bouddha.render.png

Le rendu est très satisfaisant mais, même si j'ai réussi à le mettre en oeuvre, j'ai eu du mal à comprendre les réglages à réaliser.

à creuser...

interface graphique

j'ai trouvé une interface graphique : http://www.micmac.ign.fr/svn/micmac_data/trunk/DocInterface/

mais le fichier compilé contient un bug...

VisualSFM

http://ccwu.me/vsfm/

plus facile apparement

un tutoriel là : http://combiencaporte.blogspot.fr/2012/07/la-photogrammetrie-visualsfm-et-meshlab.html

j'ai testé mais pas trouvé concluant

meshlab

Meshlab est un logiciel de traitement et reconstruction de maillage. il est très utile pour filtrer les résultats d'un scan


ouvrir des .ply en ascii 1.0

dans ma version de meshlab (dans les paquets de ubuntu 12.04) meslab n'arrive pas à ouvrir des fichiers .ply en ascii 1.0, à cause d'un problème de localisation (language) http://sourceforge.net/p/meshlab/bugs/162/

la solution est de l'ouvrir avec l'option :

$ LC_ALL=C meshlab


ressources pour meshlab

deux ou trois liens qui expliquent les rudiments de la reconstruction de maillage

http://meshlabstuff.blogspot.fr/2009/09/meshing-point-clouds.html


expérience avec la Lumière structurée

Cette technique offre plusieurs avantages :

  • dispositif de capture simple (caméra+projecteur)
  • changement d'échelle possible
  • simplicité du traitement


J'avais déjà découvert cette technique en visitant l'institut P Prime à poitiers, qui l'utilise pour mesurer les déformations des matériaux.

J'ai téléchargé et exploré le programme de Neil, pour voir jusqu'où je pouvais aller.

C'est donc un programme en cours de construction que j'ai exploré.

Comme j'étais chez moi sans les outils pour réaliser une capture, j'ai commencé par me focaliser sur le traitement du fichier de capture pour obtenir un fichier stl.

process de traitement

Habitué à traité les images, j'ai trouvé simple de traiter l'essentiel des données sous cette forme, avant la transformation en stl.

Les fichiers de départ sont le "diffs.png" et une image recomposée d'un scan d la zone vide.

3Dscan.structuredLight.Process.png

Les traitements ont été réalisés dans gimp, mais certains pourraient être automatisés, notamment à l'aide de la librairie opencv (déjà utilisée dasn le programme de Neil).

Pour le passage du png en stl, j'ai utilisé le programme png_stl

la dernière étape (visible sur l'image) a consisté à appliquer un modifieur "smooth" sous blender.

Le résultat n'est pas si mal, mème si la régularité de la surface laisse encore à désirer.

Prise de vue

Revenu à l'atelier, j'ai installé un dispositif pour réaliser une prise de vue expérimentale.

  • un videoprojecteur
  • une webcam HD (logitech hd1080)


Structuredlight.All color.png


après quelques réglages, notament le réglage manuel de la caméra via guvcview, j'ai obtenu les images suivantes :

la théière :

./coord teapot/teapot.png 0 /dev/video2


Structuredlight.Teapot.png

le fond vide :

./coord teapot/empty.png 0 /dev/video2

Structuredlight.Empty.png

j'ai mélangé ces images : soustraction puis addition de teapot en "éclaircir seulement", puis re-soustraction du fond vide :

Structuredlight.Teapot.sub.jpg

enfin, quelques retouches manuelles :

Structuredlight.Teapot.clean.png

le fichier est alors converti en stl avec la commande

./png_stl teapot/teapot.clean.png teapot/teapot.stl 5

Structuredlight.Teapot.stl.render.png

Dans blender j'ai rajouté un modifieur "smooth" à 1.8 et 5 passes.


Dans meshlab :

Filters > Smooth... > Laplacian smooth =10

puis

Filters > Remeshing, simplification and construction > Quadratic Edge Collapse Detection

paramètres : 30% de reduction quality : 0.7 optimal position of simplified vertices = 1 post-simplification cleaning

https://www.inkling.com/read/making-things-see-borenstein-1e/chapter-5/reduce-polygons-in-meshlab

le résultat est encourageant. il faudrait améliorer les conditions de prise de vue  :

  • noir complet lors de la prise de vue

et effectivement la parallaxe est génante.

kinect

Le capteur kinect est adapté pour scanner des formes à échelle humaine.

J'ai utilisé openkinect (freenect) avec l'utilitaire fakenect record, qui produit des capture brutes sous forme d'image png.


Les scans bruts sont très bruités et avec des trous liés aux zones d'ombres de la projection infrarouge.

D-1393711530.532692-2359237902.png

Pour améliorer le rendu, j'ai empilé des scans en "assombrir seulement" avec gimp.

après quelques retouches manuelles j'ai obtenu un fichier à peut près propre

Kinect.Composite.png

après une transformation en stl avec l'utilitaire de Neil (png_stl) j'ai obtenu un fichier 3D exploitable

Kienct.render.png

Dans blender, j'ai ajouté ici aussi un filtre "smooth" et "solidify", pour exporter un fichier stl imprimable.

(il est vrai que ça aurai été mieux si j'avais été chez le coiffeur)

Mon égo n'est pas assez développé pour que j'imprime mon effigie, mais j'ai validé que ce fichier est imprimable

Kinect.printable.png


autres pistes et ressources

http://pointclouds.org/