Script de traitement des vidéos d'une GoPro Max 2

tldr :

Voici un outil linux pour convertir des vidéos .360 d’une Gopro Max 2 en images jpg utilisables pour Panoramax :

Version longue :

Les GoPro Max 1 & 2 ont l’avantage d’un mode photo très simple à utiliser. On obtient directement des photos equirectangulaires, géolocalisées, utilisable par Panoramax, Josm ou autres.
L’inconvénient c’est qu’on est limité à une image toutes les 2 secondes, ce qui est souvent trop lent lorsqu’on ne se déplace pas à pied.

Pour augmenter la fréquence de capture, il faut utiliser un mode “timelapse vidéo”. Chez Gopro cela correspond au mode "Timewarp’. Jusqu’à aujourd’hui les problèmes étaient que :

  • La qualité des vidéos d’une Gopro Max était trop faible pour obtenir des images correctes.
  • On n’avait pas d’outil pour convertir une vidéo en images jpg équirectangulaire qui intègre les métadonnées de la vidéo (geolocalisation, horodatage, etc…)

Mais ça c’était avant :slight_smile:

Depuis 2025, la Gopro Max 2 permet d’obtenir des vidéos d’une qualité quasi équivalente à celle des photos. Il restait à pouvoir convertir ces vidéos en images jpg. C’est ce à quoi je me suis attelé.
Mon point de départ est l’outil gopro2frames proposé par le site Trekview. Il s’appuie sur :

  • Exiftool pour la gestion des métadonnées des photos et des vidéos
  • Ffmpeg pour l’extraction des frames d’une vidéo
  • Max2sphere pour convertir les frames qui sont au format EAC, vers le format équirectangulaire

Je modifié le script ainsi que Max2sphere pour qu’ils gèrent les vidéos d’une Gopro Max 2, j’ai ajouté plusieurs fonctions de détections automatique de la fréquence des vidéos, et des paramètres TimeWarp utilisés au moment de la capture. J’ai amélioré la gestion de certaines métadonnées, en particulier celles concernant l’horodatage. En parallèle j’ai inclus un fork multithread de Max2sphere qui accélère cette étape d’un facteur x5 avec un cpu 12 coeurs.

Ma version est disponible ici : GitHub - Stefal/gopro2frames: Converts GoPro .mp4 (any GoPro) or .360 (MAX only) files into single frames with correct metadata. Supports 360 and non-360 videos. · GitHub

Une fois les dépendances installées, il suffit de lancer gopro2frames en lui indiquant le chemin vers le fichier vidéo .360 pour obtenir en sortie un lot d’images jpg 360° qui contiennent l’horodatage et leur géolocalisation.
exemple gopro2frames GS011065.360

Remarques :

  • J’ai fait mes tests sous linux, avec une Gopro Max 2 équipée du firmware Gopro Labs
  • Pour Windows, il faudra compiler Max2sphere manuellement. Je n’ai pas essayé.
  • Les informations de l’imu pour la stabilisation ne sont pas gérées pour l’instant.
  • En cas de regéolocalisation RTK, j’ai constaté un décalage d’environ 250ms à compenser. D’autres retours m’intéresseraient pour savoir s’il est constant ou pas.
  • Sur un ordinateur un peu puissant, l’extraction de 1000 images dure environ 10mn.
  • Le code d’origine aurait besoin d’un gros nettoyage, et il y a de la marge pour des optimisations.
  • Je ne suis pas certain que l’utilisation d’Exiftool pour extraire les métadonnées soit la solution la plus pertinente. Il existe des librairies python basée sur le code fourni par Gopro qui pourraient être plus efficaces.

Divers :

J’ai mentionné l’utilisation du firmware Gopro Labs. Il me permet entre autre de :

La signification des ‘X’ du mode TimeWarp étant un peu cryptique voici un petit mémo pour des vidéo capturées en 30 img/s :

mode timewarp -> fréquence réelle
x2            -> 15 fps
x5            -> 5 fps
x10           -> 3 fps
x15           -> 2 fps
x30           -> 1 fps
4 Likes

Ah oui, ça change la donne, car on passe du coup à une compression plutôt de type image que vidéo.

Voici une comparaison entre une photo, et une image extraite d’une vidéo. Les captures ont été faites à quelques minutes d’intervalle, avec la même caméra Max 2.
La photo est à droite, la vidéo à gauche.

C’est une comparaison. Il en faudra d’autres pour établir un consensus.