. Introduction
Avec le développement de divers outils logiciels, et à partir d’un lot de photographies idoines, la production d’un nuage de points par corrélation dense est devenue relativement aisée, quel que soit le sujet (architecture, structure archéologique, objet, art pariétal, etc…).
En acceptant de longs temps de calcul, on peut choisir d’effectuer les traitements avec un PC de bureau, en utilisant MicMac (IGN), Photoscan (AgiSoft) ou PMVS/Bundler….
Si l’on souhaite davantage de rapidité et de facilité, et en admettant alors de perdre le contrôle des paramètres utilisés, on peut choisir de recourir à des WebServices, comme 123dCatch (AutoDesk), ARC3d (Université de Louvain) ou CubifyCapture…
Dans les deux cas, on obtiendra alors généralement des points localisés dans un repère « en local », et divers post-traitements seront nécessaires pour mettre à l’échelle le nuage de points, l’orienter sur les axes XYZ, et le positionner dans un système de coordonnées conventionnel (aujourd’hui Lambert93).
Cette question est résolue si l’on a directement intégré, dans le calcul effectué par MicMac, des points d’appui connus, en utilisant les options possibles des fonctions Bascule et SaisieAppui, mais le recours aux WebService ne propose pas encore d’options dans ce sens.
L’application 123dCatch fournit des outils d’alignement sur les axes et de mise à l’échelle, mais la question du positionnement en Lambert93 n’est pas résolue.
Ayant personnellement posé la question à Y. Egels, et grâce à sa réponse, je suis maintenant en mesure d’expliquer la méthode pour qu’elle puisse éventuellement profiter à d’autres.
Selon les logiciels utilisés, diverses méthodes sont alors utilisables pour procéder au géoréférencement du nuage de points, qui se basent toutes sur le calcul d’une matrice de transformation, dite « de similarité », ou, plus pompeusement « matrice de Helmert en 3d », ou encore « transformation à sept paramètres ». (voir : http://en.wikipedia.org/wiki/Helmert_transformation)
. Calcul de la matrice de transformation
Le calcul s’effectue de la manière suivante : Xt = T + sRX
Où :
– Xt = vecteur des coordonnées transformées
– X = vecteur des coordonnées initiales
– T = vecteur de translation
– R = matrice de rotation comprenant : rx, ry, rz
– rx, ry, rz = rotation sur les trois axes
– s = facteur de mise à l’échelle
Sept paramètres sont donc nécessaires pour ce type de transformation, qui peuvent être calculés à partir d’au-moins 3 points de correspondance entre le repère local initial et le repère conventionnel de destination.
Concrètement pour calculer ces paramètres, il est possible d’utiliser « helmparms3d », une application en ligne de commande disponible ici : http://helmparms3d.sourceforge.net/
« helmparms3d » lit deux fichiers de points au format .txt (« src_points.txt » et « dest_points.txt ») et calcule les paramètres, qu’il restitue dans un troisième fichier « outfile_name.txt », avec la syntaxe suivante :
$ helmparms3d src_points.txt dest_points.txt outfile_name.txt
Exemple de points d’origine (6 points dans le cas présent) : ExempleNuage_orig.txt
-6.395000 -4.665030 0.716299
-6.277020 0.610861 0.351514
-6.244120 4.796520 0.290018
0.905396 -13.350000 2.363120
1.258340 -5.874060 -0.122984
1.389310 0.017925 0.009502
Points de destination correspondants : ExempleNuage_dest.txt
421089.64 6415675.35 1.67
421090.29 6415676.50 1.54
421090.81 6415677.44 1.54
421090.23 6415672.55 2.12
421091.21 6415674.17 1.48
421091.92 6415675.44 1.49
Dans une invite de commande, se placer (= cd…) dans le répertoire où se trouve helmparms3d.exe et les fichiers texte d’origine et de destination et taper :
$ helmparms3d ExempleNuage_orig.txt ExempleNuage_dest.txt ExempleNuage_result.txt
Ce qui donne :
« ExempleNuage_result.txt »
0.8812115413 0.4727056400 -0.0039493580
-0.4726087268 0.8811523758 0.0145424182
0.0103542693 -0.0109484457 0.9998864539
421091.6203002925 6415675.6183074415 1.4864987616
0.2523214352
Contenant :
– les trois premières lignes : la matrice 3×3 de rotation = R
– la quatrième ligne : les paramètres de translation = T
– la cinquième ligne : le facteur de mise à l’échelle = s
Avec ça, on a tout ce qu’il faut pour géoréférencer notre nuage de points…
. Application dans Cumulus :
Pour un nuage de points «ExempleNuage.ply », créer un fichier de géoréférencement « ExempleNuage.cfg » (avec un éditeur de texte) contenant ces paramètres de la manière suivante :
« ExempleNuage.cfg »
[planref]
Rotation = 0.8812115413 0.4727056400 -0.0039493580 -0.4726087268 0.8811523758 0.0145424182 0.0103542693 -0.0109484457 0.9998864539
Origine = 1620 675618 1486
Echelle = 0.2523214352
On notera que les coordonnées ont été tronquées et converties en millimètres (unité de base dans Cumulus) de la manière suivante
x -421090 m
y -6415000 m
z * 1000
– ouvrir le nuage «ExempleNuage.ply » et apprécier le résultat…
. Application dans MeshLab :
– charger «ExempleNuage.ply »,
– enregistrer le projet au format ExempleNuage.mlp,
– quitter MeshLab,
– éditer ExempleNuage.mlp et renseigner la matrice 4×4 de transformation de la manière suivante
0.88 0.47 -0.003 1.62
-0.47 0.88 0.01 75.60
0.01 -0.11 0.99 1.49
0 0 0 0.25
NB : Remarquer de quelle manière les valeurs sont tronquées, pour les rendre compatibles avec ce logiciel, avec une unité métrique.
– sauvegarder le .mlp
– rouvrir MeshLab et ExempleNuage.mlp
– faire « Freeze matrix » et exporter ce nouveau .ply, qui est maintenant géoréférencé.
. Application dans CloudCompare :
– charger «ExempleNuage.ply »,
– dans l’arborescence des objets, se placer sur les vertices
– faire Edit / Apply transformation et coller la même matrice que ci-dessus, après avoir remplacé les espaces par des tabulations.
. Conclusion
Naturellement, il existe certainement d’autres manières de procéder, notamment, dans CloudCompare, en utilisant Tools / Registration / Align, mais cette fonction est inutilisable chez moi, car elle fait systématiquement planter ma machine.
Au terme de ces manipulations, les données issues de corrélations denses peuvent s’intégrer aux sources de données mobilisables dans un SIG, autorisant toutes sortes de développements ultérieurs.