wisescootering / infrareddrone

Aerial infrared photography
GNU Affero General Public License v3.0
14 stars 4 forks source link

alignement des mapping VIS, NIR,VIR, NDVI avec ODM #27

Closed AlainNeveu closed 1 year ago

AlainNeveu commented 1 year ago

Procédure pour générer des mappings "esclaves" alignés sur un mapping "maître". Le jeu d'images à "mapper" est produit par IRdrone. Ces images sont alignées et géotaggées (GPS du DJI) Ici le mapping maître sera celui généré avec les images du spectre visible (VIS) Les mapping "esclaves" seront générés à partir des images IRdrone NIR,VIR ,NDVI ... La procédure consiste à générer une sfm (structure from motion) , un nuage de points dans l'espace (multi view stereo) puis un maillage reliant ces points (mesh) avec les images VIS puis à plaquer les textures NIR, VIS, NDVI ... dessus. En pratique on lance plusieurs commandes ODM en "faisant croire" à ODM qu'il manipule toujours les images maîtres. Concrètement les opérations se limitent à modifier des noms de dossiers et de fichiers et ... A lancer deux fois ODM pour chaque mapping "esclave" (processus ODM partiel une première fois pour générer les images qui serviront de texture et une deuxième fois pour réaliser le mapping proprement dit)

On décrit ici la suite des opérations à effectuer. Un test a été réaliser entièrement à la main (déplacement, renommage, copie, delete des fichiers et dossiers) et avec lancement d'odm par commandes écrites dans des fichiers .bat

Le test est concluant. Il reste à intégrer toute cette procédure dans un programme python

Process d'alignement


Etape N°0

La couche maître est dans le dossier ...\mapping_ortho.
    Elle contient le fichier  \mapping_ortho\camera\camera_IRdrone.json
    Le dossier \mapping_ortho\images  qui contient les images maîtres VIS
    Les dossiers \mapping_ortho\images-NIR, \mapping_ortho\images-VIR, \mapping_ortho\images-NDVI , etc contenant les images esclaves.
        A ce stade les images de ces dossiers ont leur nom d'origine
        Pour les tests vérifier:
            **Les exif des images esclaves sont identiques à l'exif de l'image maître (au besoin modifier avec exifToolGUI )
            **La cohérence avec les paramètres de la caméra IRdrone contenus dans le fichier \mapping_ortho\camera\camera-IRdrone.json

Etape N°1 But: générer le mapping maître à partir des images prises par la caméra du drone dans le spectre visible.

A partir du dossier mapping_ortho\images

1.1> RUN ODM  Processus COMPLET
    docker run -ti --rm -v H:/Air-Mission/FLY-20220125-Test_complet:/datasets opendronemap/odm 
    --project-path /datasets mapping_ortho
    --cameras /datasets/mapping_ortho/camera/camera_IRdrone.json --use-fixed-camera-params 
    --force-gps --use-exif 
    --smrf-threshold 0.3 --smrf-scalar 1.3 --smrf-slope 0.05 --smrf-window 24 
    --texturing-skip-global-seam-leveling  
    --orthophoto-resolution 0.8 --ignore-gsd --fast-orthophoto --orthophoto-kmz --orthophoto-png --build-overviews

1.2> Renommer mapping_ortho\images -> mapping_ortho\images-VIS

1.3> A l'issue du process ODM DEPLACER l'intégralité des dossiers et fichiers crées par ODM dans un dossier  mapping_ortho\tempo
    folder:
        odm_dem
        odm_filterpoints
        odm_georeferencing
        odm_meshing               (avec l'option --orthophoto odm utilise un maillage 2.5D càd 2D extrudé)
        odm_orthophoto
        odm_report
        odm_texturing_25d
        opensfm    (ce dossier contient entre autre le dossier undistorted\images utilisé pour le "texturing") 
    files:
        cameras.json
        images.json
        images_list.txt
        log.json

1.4> Renommer   odm_orthophoto      -> odm_orthophoto-VIS 
        odm_texturing_25d   -> odm_texturing_25d-VIS (par sécurité ... on ne le réutilisera pas ?)

Etape N°2 But: générer les images des couches esclaves qui serviront de texture sur le mapping maître.

2.1> Renommer le dossier  mapping_ortho\images-NIR  -> mapping_ortho\images
    C'est une contrainte ODM qui ne sait lire exclusivement (mais automatiquement) les images à traiter dans ce dossier.
    On ne peut pas spécifier un autre dossier d'images dans la ligne de commande.

2.2> Changer les noms des images escalves pour leur donner le même nom que les images maître. (pour tromper ODM !!) 
    exemple:
    L'image esclave proche infrarouge (NIR) HYPERLAPSE_0137_NIR_local.jpg est associée à l'image maître HYPERLAPSE_0137_VIS.jpg. 
    Dans le dossier  mapping_ortho\images on renomme    HYPERLAPSE_0137_NIR_local.jpg -> HYPERLAPSE_0137_VIS.jpg        

2.3> RUN ODM Processus PARTIEL 
    docker run -ti --rm -v H:/Air-Mission/FLY-20220125-Test_complet:/datasets opendronemap/odm 
    --project-path /datasets mapping_ortho 
    --rerun-from dataset 
    --end-with opensfm 
    --cameras /datasets/mapping_ortho/camera/camera_IRdrone.json --use-fixed-camera-params 
    --force-gps --use-exif 
    --smrf-threshold 0.3 --smrf-scalar 1.3 --smrf-slope 0.05 --smrf-window 24
    --ignore-gsd  

2.4> Renommer le dossier mapping_ortho\opensfm\undistorted\images -> mapping_ortho\opensfm\undistorted\images-NIR-undistorted 
    et le déplacer dans le dossier mapping_ortho\tempo.

2.5> Delete les dossiers et fichiers créers par odm

2.6> Renommer le dossier  mapping_ortho\images  -> mapping_ortho\images-NIR

Remarque: L'étape N°2 doit être réputée ici autant de fois qu'il y a de couches "esclaves" à traiter


Etape N°3 But: générer les mapping esclaves (orthophoto alignées sur l'orthophoto maître)

3.1> COPIER les dossiers
        mapping_ortho\tempo\odm_dem         ->  mapping_ortho\odm_dem
        mapping_ortho\tempo\odm_filterpoints    ->  mapping_ortho\odm_filterpoints
        mapping_ortho\tempo\odm_georeferencing      ->  mapping_ortho\odm_georeferencing 
        mapping_ortho\tempo\odm_meshing         ->  mapping_ortho\odm_meshing
        mapping_ortho\tempo\opensfm         -> mapping_ortho\opensfm 
         et les fichiers
        mapping_ortho\tempo\cameras.json        ->  mapping_ortho\cameras.json
        mapping_ortho\tempo\images.json         ->  mapping_ortho\tempo\images.json
        mapping_ortho\tempo\images_list.txt     ->  mapping_ortho\images_list.txt
        mapping_ortho\tempo\log.json        ->  mapping_ortho\log.json

REMARQUE: Il faut garder les dossiers et fichiers maîtres dans tempo pour pouvoir recommencer le traitement avec un autre jeu d'iamges esclaves

3.2> Delete le dossier mapping_ortho\opensfm\undistorted\images (qui contient les textures pour le VIS) 

3.3> Copier le dossier mapping_ortho\tempo\images-NIR-undistorted dans mapping_ortho\opensfm\undistorted\images-NIR-undistorted

3.3> Renommer mapping_ortho\opensfm\undistorted\images-NIR-undistorted -> mapping_ortho\opensfm\undistorted\images

3.4> RUN ODM Processus PARTIEL  
        docker run -ti --rm -v H:/Air-Mission/FLY-20220125-Test_complet:/datasets opendronemap/odm 
        --project-path /datasets mapping_ortho
        --rerun-from mvs_texturing 
        --cameras /datasets/mapping_ortho/camera/camera_IRdrone.json
        --use-fixed-camera-params --force-gps --use-exif 
        --smrf-threshold 0.3 --smrf-scalar 1.3 --smrf-slope 0.05 --smrf-window 24 
        --texturing-skip-global-seam-leveling 
        --orthophoto-resolution 0.8 --ignore-gsd --fast-orthophoto --orthophoto-kmz --orthophoto-png --build-overviews 

    ** ODM saute opensfm stage, pointcloud stage, filterpoints stage, meshing stage 
    ** ODM refait le texturing stage, georeferencing stage   et orthophoto stage (ce qui est le but  😉)

3.5> Renommer   mapping_ortho\odm_orthophoto  ->  mapping_ortho\odm_orthophoto-NIR
        mapping_ortho\odm_texturing_25d -> mapping_ortho\odm_texturing_25d-NIR (par sécurité ... on ne le réutilisera pas ?) 

Remarque: reprendre à l'étape 3.2 pour chaque mapping "esclave"


Etape N°4 But: visualiser les mapping alignés dans QJIS et les superposer avec l'image satellite (Google)

4.1> Lancer le logiciel QJIS

4.2> Créer un nouveau projet   

4.3> Sélectionner mapping_ortho\odm_orthophoto-NIR  et mapping_ortho\odm_orthophoto-VIS
    Les deux images sont bien superposées. Il peut exister quelques défauts de texture  
    La doc pdf ODM en parle, mais ce n'est pas nécessairement lié à ce process d'alignement, voir image page 77 du pdf par exemple.
    Cela peut peut-être provoqué par les options --smrf ?
AlainNeveu commented 1 year ago

NOTE 1 : utilisation d'options supplémentaires pour la création d'orthophotos.


--use-fixed-camera-params

Sans cette option ODM va bien chercher le fichier camera\camera-IRdrone.json mais ce fichier ne sert que d'initialisation car odm optimise la caméra pendant le process ... Avec cette option il n'optimise pas, il garde les paramètres camera-IRdrone.json tout au long du process. Enfin c'est ce que j'ai compris. C'est efficace si la caméra est bien calibrée.


--smrf-threshold 0.3 --smrf-scalar 1.3 --smrf-slope 0.05 --smrf-window 24

Pour "aplatir" le terrain puisque le but c'est l'orthophoto. J'ai repris les paramètres données dans la doc pdf. Les illustrations sont très explicites pages 107/108/109)


--texturing-skip-global-seam-leveling

Un ajustement global de la luminance sur l'ensemble des images ... ça ne mange pas de pain!


--build-overviews

Création d'une "pyramide" d'images du mapping à différentes résolutions (1/2, 1/4, 1/8, 1/16). Accélère de manière spectaculaire l'affichage dans QJIS !

AlainNeveu commented 1 year ago

NOTE 2 : Les différentes étapes du traitement ODM -A- dataset stage -B- split stage -C- merge stage -D- openfm stage

AlainNeveu commented 1 year ago

La technique "multi spectrale" de l'issue #25 est beaucoup plus rationnelle. Inutile de poursuivre le développement en python de l'issue#27