{"id":122,"date":"2013-10-15T15:32:00","date_gmt":"2013-10-15T13:32:00","guid":{"rendered":"http:\/\/sfpt.fr\/parchi\/?p=122"},"modified":"2014-01-14T18:03:11","modified_gmt":"2014-01-14T17:03:11","slug":"georeferencer-un-nuage-de-points-2","status":"publish","type":"post","link":"http:\/\/sfpt.fr\/parchi\/?p=122","title":{"rendered":"G\u00e9or\u00e9f\u00e9rencer un nuage de points"},"content":{"rendered":"<p><strong><em>. Introduction<\/em><\/strong><\/p>\n<p>Avec le d\u00e9veloppement de divers outils logiciels, et \u00e0 partir d\u2019un lot de photographies idoines, la production d\u2019un nuage de points par corr\u00e9lation dense est devenue relativement ais\u00e9e, quel que soit le sujet (architecture, structure arch\u00e9ologique, objet, art pari\u00e9tal, etc\u2026).<\/p>\n<p>En acceptant de longs temps de calcul, on peut choisir d\u2019effectuer les traitements avec un PC de bureau, en utilisant MicMac (IGN), Photoscan (AgiSoft) ou PMVS\/Bundler\u2026.<\/p>\n<p>Si l\u2019on souhaite davantage de rapidit\u00e9 et de facilit\u00e9, et en admettant alors de perdre le contr\u00f4le des param\u00e8tres utilis\u00e9s, on peut choisir de recourir \u00e0 des WebServices, comme 123dCatch (AutoDesk), ARC3d (Universit\u00e9 de Louvain) ou CubifyCapture\u2026<\/p>\n<p>Dans les deux cas, on obtiendra alors g\u00e9n\u00e9ralement des points localis\u00e9s dans un rep\u00e8re \u00ab\u00a0en local\u00a0\u00bb, et divers post-traitements seront n\u00e9cessaires pour mettre \u00e0 l\u2019\u00e9chelle le nuage de points, l\u2019orienter sur les axes XYZ, et le positionner dans un syst\u00e8me de coordonn\u00e9es conventionnel (aujourd\u2019hui Lambert93).<!--more--><\/p>\n<p>Cette question est r\u00e9solue si l\u2019on a directement int\u00e9gr\u00e9, dans le calcul effectu\u00e9 par MicMac, des points d\u2019appui connus, en utilisant les options possibles des fonctions Bascule et SaisieAppui, mais le recours aux WebService ne propose pas encore d\u2019options dans ce sens.<\/p>\n<p>L\u2019application 123dCatch fournit des outils d\u2019alignement sur les axes et de mise \u00e0 l\u2019\u00e9chelle, mais la question du positionnement en Lambert93 n\u2019est pas r\u00e9solue.<\/p>\n<p>Ayant personnellement pos\u00e9 la question \u00e0 Y. Egels, et gr\u00e2ce \u00e0 sa r\u00e9ponse, je suis maintenant en mesure d\u2019expliquer la m\u00e9thode pour qu\u2019elle puisse \u00e9ventuellement profiter \u00e0 d\u2019autres.<\/p>\n<p>Selon les logiciels utilis\u00e9s, diverses m\u00e9thodes sont alors utilisables pour proc\u00e9der au g\u00e9or\u00e9f\u00e9rencement du nuage de points, qui se basent toutes sur le calcul d\u2019une matrice de transformation, dite \u00ab\u00a0de similarit\u00e9\u00a0\u00bb, ou, plus pompeusement \u00ab\u00a0matrice de Helmert\u00a0en 3d \u00bb, ou encore \u00ab\u00a0transformation \u00e0 sept param\u00e8tres\u00a0\u00bb. (voir\u00a0:\u00a0<a href=\"http:\/\/en.wikipedia.org\/wiki\/Helmert_transformation\">http:\/\/en.wikipedia.org\/wiki\/Helmert_transformation<\/a>)<\/p>\n<p><strong><em>. Calcul de la matrice de transformation<\/em><\/strong><\/p>\n<p>Le calcul s\u2019effectue de la mani\u00e8re suivante\u00a0: Xt = T + sRX<\/p>\n<p>O\u00f9 :<\/p>\n<p>&#8211; Xt = vecteur des coordonn\u00e9es transform\u00e9es<\/p>\n<p>&#8211; X = vecteur des coordonn\u00e9es initiales<\/p>\n<p>&#8211; T = vecteur de translation<\/p>\n<p>&#8211; R = matrice de rotation comprenant\u00a0: rx, ry, rz<\/p>\n<p>&#8211; rx, ry, rz = rotation sur les trois axes<\/p>\n<p>&#8211; s = facteur de mise \u00e0 l\u2019\u00e9chelle<\/p>\n<p>Sept param\u00e8tres sont donc n\u00e9cessaires pour ce type de transformation, qui peuvent \u00eatre calcul\u00e9s \u00e0 partir d\u2019au-moins 3 points de correspondance entre le rep\u00e8re local initial et le rep\u00e8re conventionnel de destination.<\/p>\n<p>Concr\u00e8tement pour calculer ces param\u00e8tres, il est possible d\u2019utiliser \u00ab\u00a0helmparms3d\u00a0\u00bb, une application en ligne de commande disponible ici\u00a0:\u00a0<a href=\"http:\/\/helmparms3d.sourceforge.net\/\">http:\/\/helmparms3d.sourceforge.net\/<\/a><\/p>\n<p>\u00ab\u00a0helmparms3d\u00a0\u00bb lit deux fichiers de points au format .txt (\u00ab\u00a0src_points.txt\u00a0\u00bb et \u00ab\u00a0dest_points.txt\u00a0\u00bb) et calcule les param\u00e8tres, qu\u2019il restitue dans un troisi\u00e8me fichier \u00ab\u00a0outfile_name.txt\u00a0\u00bb, avec la syntaxe suivante\u00a0:<\/p>\n<p>$ helmparms3d src_points.txt dest_points.txt outfile_name.txt<\/p>\n<p>Exemple de points d\u2019origine (6 points dans le cas pr\u00e9sent) : ExempleNuage_orig.txt<\/p>\n<p>-6.395000 -4.665030 0.716299<\/p>\n<p>-6.277020 0.610861 0.351514<\/p>\n<p>-6.244120 4.796520 0.290018<\/p>\n<p>0.905396 -13.350000 2.363120<\/p>\n<p>1.258340 -5.874060 -0.122984<\/p>\n<p>1.389310 0.017925 0.009502<\/p>\n<p>Points de destination correspondants\u00a0: ExempleNuage_dest.txt<\/p>\n<p>421089.64 6415675.35 1.67<\/p>\n<p>421090.29 6415676.50 1.54<\/p>\n<p>421090.81 6415677.44 1.54<\/p>\n<p>421090.23 6415672.55 2.12<\/p>\n<p>421091.21 6415674.17 1.48<\/p>\n<p>421091.92 6415675.44 1.49<\/p>\n<p>Dans une invite de commande, se placer (= cd\u2026) dans le r\u00e9pertoire o\u00f9 se trouve helmparms3d.exe et les fichiers texte d\u2019origine et de destination et taper\u00a0:<\/p>\n<p>$ helmparms3d ExempleNuage_orig.txt ExempleNuage_dest.txt ExempleNuage_result.txt<\/p>\n<p>Ce qui donne :<\/p>\n<p>\u00ab\u00a0ExempleNuage_result.txt\u00a0\u00bb<\/p>\n<p>0.8812115413 0.4727056400 -0.0039493580<\/p>\n<p>-0.4726087268 0.8811523758 0.0145424182<\/p>\n<p>0.0103542693 -0.0109484457 0.9998864539<\/p>\n<p>421091.6203002925 6415675.6183074415 1.4864987616<\/p>\n<p>0.2523214352<\/p>\n<p>Contenant\u00a0:<\/p>\n<p>&#8211; les trois premi\u00e8res lignes\u00a0: la matrice 3&#215;3 de rotation = R<\/p>\n<p>&#8211; la quatri\u00e8me ligne\u00a0: les param\u00e8tres de translation = T<\/p>\n<p>&#8211; la cinqui\u00e8me ligne\u00a0: le facteur de mise \u00e0 l\u2019\u00e9chelle = s<\/p>\n<p>Avec \u00e7a, on a tout ce qu\u2019il faut pour g\u00e9or\u00e9f\u00e9rencer notre nuage de points\u2026<\/p>\n<p><strong><em>. Application dans Cumulus\u00a0:<\/em><\/strong><\/p>\n<p>Pour un nuage de points \u00abExempleNuage.ply\u00a0\u00bb, cr\u00e9er un fichier\u00a0de g\u00e9or\u00e9f\u00e9rencement \u00ab\u00a0ExempleNuage.cfg\u00a0\u00bb (avec un \u00e9diteur de texte) contenant ces param\u00e8tres de la mani\u00e8re suivante\u00a0:<\/p>\n<p>\u00ab\u00a0ExempleNuage.cfg\u00a0\u00bb<\/p>\n<p>[planref]<\/p>\n<p>Rotation = 0.8812115413 0.4727056400 -0.0039493580 -0.4726087268 0.8811523758 0.0145424182 0.0103542693 -0.0109484457 0.9998864539<\/p>\n<p>Origine = 1620 675618 1486<\/p>\n<p>Echelle = 0.2523214352<\/p>\n<p>On notera que les coordonn\u00e9es ont \u00e9t\u00e9 tronqu\u00e9es et converties en millim\u00e8tres (unit\u00e9 de base dans Cumulus) de la mani\u00e8re suivante<\/p>\n<p>x -421090 m<\/p>\n<p>y -6415000 m<\/p>\n<p>z * 1000<\/p>\n<p>&#8211; ouvrir le nuage \u00abExempleNuage.ply\u00a0\u00bb et appr\u00e9cier le r\u00e9sultat\u2026<\/p>\n<p>&nbsp;<\/p>\n<p><strong><em>. Application dans MeshLab\u00a0:<\/em><\/strong><\/p>\n<p>&#8211; charger \u00abExempleNuage.ply\u00a0\u00bb,<\/p>\n<p>&#8211; enregistrer le projet au format ExempleNuage.mlp,<\/p>\n<p>&#8211; quitter MeshLab,<\/p>\n<p>&#8211; \u00e9diter ExempleNuage.mlp et renseigner la matrice 4&#215;4 de transformation de la mani\u00e8re suivante<\/p>\n<p>0.88 0.47 -0.003 1.62<\/p>\n<p>-0.47 0.88 0.01 75.60<\/p>\n<p>0.01 -0.11 0.99 1.49<\/p>\n<p>0 0 0 0.25<\/p>\n<p>NB\u00a0: Remarquer de quelle mani\u00e8re les valeurs sont tronqu\u00e9es, pour les rendre compatibles avec ce logiciel, avec une unit\u00e9 m\u00e9trique.<\/p>\n<p>&#8211; sauvegarder le .mlp<\/p>\n<p>&#8211; rouvrir MeshLab et ExempleNuage.mlp<\/p>\n<p>&#8211; faire \u00ab\u00a0Freeze matrix\u00a0\u00bb et exporter ce nouveau .ply, qui est maintenant g\u00e9or\u00e9f\u00e9renc\u00e9.<\/p>\n<p>&nbsp;<\/p>\n<p><strong><em>. Application dans CloudCompare\u00a0:<\/em><\/strong><\/p>\n<p>&#8211; charger \u00abExempleNuage.ply\u00a0\u00bb,<\/p>\n<p>&#8211; dans l\u2019arborescence des objets, se placer sur les vertices<\/p>\n<p>&#8211; faire Edit \/ Apply transformation et coller la m\u00eame matrice que ci-dessus, apr\u00e8s avoir remplac\u00e9 les espaces par des tabulations.<\/p>\n<p>&nbsp;<\/p>\n<p><strong><em>. Conclusion<\/em><\/strong><\/p>\n<p>Naturellement, il existe certainement d\u2019autres mani\u00e8res de proc\u00e9der, notamment, dans CloudCompare, en utilisant Tools \/ Registration \/ Align, mais cette fonction est inutilisable chez moi, car elle fait syst\u00e9matiquement planter ma machine.<\/p>\n<p>Au terme de ces manipulations, les donn\u00e9es issues de corr\u00e9lations denses peuvent s\u2019int\u00e9grer aux sources de donn\u00e9es mobilisables dans un SIG, autorisant toutes sortes de d\u00e9veloppements ult\u00e9rieurs.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>. Introduction Avec le d\u00e9veloppement de divers outils logiciels, et \u00e0 partir d\u2019un lot de photographies idoines, la production d\u2019un nuage de points par corr\u00e9lation dense est devenue relativement ais\u00e9e, quel que soit le sujet (architecture, structure arch\u00e9ologique, objet, art &hellip; <a href=\"http:\/\/sfpt.fr\/parchi\/?p=122\">Lire la suite <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":10,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"spay_email":""},"categories":[3],"tags":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p4fJjF-1Y","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/sfpt.fr\/parchi\/index.php?rest_route=\/wp\/v2\/posts\/122"}],"collection":[{"href":"http:\/\/sfpt.fr\/parchi\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/sfpt.fr\/parchi\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/sfpt.fr\/parchi\/index.php?rest_route=\/wp\/v2\/users\/10"}],"replies":[{"embeddable":true,"href":"http:\/\/sfpt.fr\/parchi\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=122"}],"version-history":[{"count":4,"href":"http:\/\/sfpt.fr\/parchi\/index.php?rest_route=\/wp\/v2\/posts\/122\/revisions"}],"predecessor-version":[{"id":209,"href":"http:\/\/sfpt.fr\/parchi\/index.php?rest_route=\/wp\/v2\/posts\/122\/revisions\/209"}],"wp:attachment":[{"href":"http:\/\/sfpt.fr\/parchi\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=122"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/sfpt.fr\/parchi\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=122"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/sfpt.fr\/parchi\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=122"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}