PoC Panoramax - Correction d'horizon

:alembic:PoC Panoramax - Correction d’horizon

Une fraction significative des contributeurs Panoramax collectent les images à vélo. Souvent, en raison des mouvements de tête ou du vélo, la caméra est inclinée, ce qui complique la lisibilité et la navigation dans la séquence, comme ici.

Pour y remédier, l’idéal reste d’améliorer la stabilité de la caméra, et d’utiliser d’éventuels logiciels de correction proposés par le fabricant. Je me suis demandé s’il est possible d’améliorer a posteriori les images déjà présentes dans Panoramax.

Méthode

Pour cela, je me suis appuyé sur cette publication (Jung et al. 2017, “Robust Upright Adjustment of 360 Spherical Panoramas”) qui propose. En bref, le panorama est projeté en cubemap. Un algo de détection de segments est appliqué à chaque face. Ces segments sont ensuite prolongés en grands cercles, dont les intersections indiquent les points de fuite de l’image (en vert ci-dessous). Une optimisation (moindres carrés) est enfin appliquée pour calculer une rotation de l’image qui rapproche ces points de fuite de l’horizon (pour les lignes horizontales, en rouge) ou des pôles (pour les lignes verticales, en jaune). Le processus est ensuite itéré.

Initial:


Iter 1:

Iter2:

Résultats

Actuellement, les résultats restent mitigés. Lorsqu’il y a de nombreuses lignes, notamment verticales, l’algo est performant (cas 1).
Toutefois, lorsqu’il n’y a que deux points de fuite et peu de lignes verticales, par exemple sur un sentier (cas 2), l’algo n’est pas stable et fait empirer la situation. Cela se comprend : lorsque ces points sont placés aux extrêmes avant et arrière, ils restent placés sur l’horizon quel que soit l’angle de roulis appliqué.

Cas 1 : Succès

Avant

Après

Cas 2 : échec

Avant

Après

Discussion et perspectives

Je n’ai pour l’instant implémenté qu’une partie de la publication originale. Toute une section manque (« Outlier Handling ») et pourrait améliorer les performances.
Par la suite, on pourrait établir des stratégies de traitement de séquences, en supposant que des images successives nécessitent des corrections proches.

Je ne sais pas vraiment quand j’aurai à nouveau du temps à y consacrer.

À ma connaissance, une fonctionnalité de correction d’horizon n’est pas sur la feuille de route Panoramax, et je ne prétends pas vouloir l’y inscrire à ce stade. Je suis toutefois curieux de retours de la communauté Panoramax, et singulièrement l’équipe de développement. Est-ce un sujet qui vous intéresse? Si on souhaitait l’implémenter, quelle forme cela pourrait-il prendre? J’imagine un serveur de correction d’horizon, de même qu’il y a un serveur de floutage. Ce serveur renverrait des angles de rotation, à stocker dans les métadonnées et à appliquer dans la visionneuse. Les photos seraient traitées à la demande d’utilisateurs, et non systématiquement. Serait-ce réaliste?

4 Likes

Sujet très intéressant :slight_smile:

Je prends ma caméra sur au bout d’une perche à selfie elle même bien fixée à un support placée dans un sac à dos. Je corrige les images avec GitHub - Starmania/img360 avant envoi pour l’instant mais c’est un processus long et très artisanal.

Je remarque que si ma caméra n’est pas bien verticale, elle le sera pendant toute la séquence à peu près de la même façon. Peut-être y a t’il là une piste à explorer ? Faire une estimation de tangage, roulis, lacet à appliquer via l’algorithme sur chaque image puis retenir une moyenne éliminant et éliminer les valeurs extrêmes ?

1 Like

Très chouette boulot !

J’avais regardé un peu ce qu’on pouvait faire, mais pas eu le temps de creuser.

Quand la caméra est montée en fixe, par exemple sur un véhicule, on peut sûrement faire une moyenne et l’appliquer sur l’ensemble.

Sur un casque, faut oublier, sur une perche à vélo ou un sac à dos, c’est sûrement limite pour faire une moyenne.

Une fois qu’on a déterminé les inclinaisons, ma préférence irait à les indiquer dans les métadonnées EXIF/XMP, sans modifier l’image (donc en préservant sa qualité initiale), c’est la visionneuse qui va remettre ça droit.

Ensuite se pose la question de comment et où insérer ça dans la chaîne Panoramax…

  • un outil à la dispo des contributeurs ?
  • une simple détection par les API de Panoramax ?
  • à faire systématiquement ou en échantillon sur les séquences ?
  • tagger le photos/séquence de travers ?

L’important c’est déjà de mettre au point une détection, ensuite si possible un calcul des inclinaisons pour corriger.

J’ai commencé à regarder ce qu’on peut faire pour autre chose: détecter les photos floues, trop claire ou trop sombres… et potentiellement les tagger pour les supprimer dans un second temps.

Déjà si la visionneuse pouvait prendre des tags en compte pour réaliser la correction ce serait génial :grin:. Effectivement ça me fait mal de diminuer la qualité.

Elle le fait déjà… y’a plus qu’à renseigner les valeurs de pitch et roll dans les metadonnées EXIF ou XMP…

Ah bon ? Je ne savais pas. C’est une bonne nouvelle ça !

Génial ! Les tags sont GPSRoll, GPSPitch et GPSYaw ? Je testerai à mon prochain upload

1 Like

Voir ici : Tags EXIF pour pitch/roll - #3 par cquest

Ce sont des tags XMP GPano, dédiés aux images 360°:

  • Xmp.GPano.PosePitchDegrees
  • Xmp.GPano.PoseRollDegrees
3 Likes

Ce qu’il faudrait en fait c’est un plugin jOSM qui enregistre egalement le pitch voire le roll dans les exifs :slight_smile:

Tu veux dire après correction manuelle dans la visionneuse photo de JOSM ?

Il ne me semble pas qu’on puisse changer l’orientation, il y aurait du coup pas mal de chose à coder !

Sinon, pour ajouter des tags dont on connait la valeur, exiftool en ligne de commande et il peut le faire sur un dossier entier.

Pour que ça soit possible dans Josm il faudrait ajouter ces fonctions :

  • Qu’on puisse modifier l’orientation sur les 3 axes dans la visionneuse. Si ce n’est pas automatisé, il faudrait pouvoir afficher des repères en surimpression pour aider à redresser.
  • Stocker ces données temporairement
  • Les écrires dans les métadonnées de la photo, ce qui ne pourra pas se faire avec le plugin photo_geotagging, qui ne gère que les exifs. Par contre, la librairie Java qui est utilisée par le plugin est capable de lire et écrire des données XMP

edit : ajout d’infos supplémentaires

Effectivement, l’idéal serait de se baser sur la visonneuse qui permet de passer rapidement les photos d’une sequence.
Aujourd’hui elle permet dejà de naviguer sur le pitch et le yaw
Une correction sur ces deux axes permettrait de couvrir dejà pas mal les mouvements de tête (on a pas de torticolis tous les jours :slight_smile: ).

@cquest : J’ai testé sur https://panoramax.openstreetmap.fr/?background=streets&focus=pic&map=19.77/45.751537/4.8323797&pic=e87351aa-c42c-43a5-a194-d6dc645f9011&speed=250&theme=age&xyz=287.40/2.60/47

La visionneuse sur panoramax ne semble pas prendre en compte les attributs Xmp.GPano.PosePitchDegrees et Xmp.GPano.PoseRollDegrees . Est-ce que j’ai loupé une étape ?

Les tags sont en principe récupérés ici geopic_tag_reader/reader.py · develop · Panoramax / Server / Geo-picture Tag Reader · GitLab

Pour le viewer ça a été intégré il y a plusieurs mois… donc quelque chose cloche quelque part (cc @PanierAvide )

1 Like

J’ai créé un ticket Handling of Xmp.GPano.PosePitchDegrees and Xmp.GPano.PoseRollDegrees (#281) · Issues · Panoramax / Clients / Web viewer · GitLab . J’espère que j’ai fait ça correctement :slight_smile:

2 Likes