GoPro 4K 16:9 Superview > 4K 4:3 / Fisheye > équirectangulaire

MISE À JOUR (Mai 2018) : un nouvel article vient d’être publié avec une nouvelle méthode et une nouvelle version du filtre remap :  https://emirchouchane.com/remap2-gopro-360/

Je vous présente ici une méthode pour transformer une vidéo GoPro de 4K Superview 16:9 en 4K 4:3, ensuite en 1:1 jusqu’à avoir une image en 360.

L’idée de départ est de prendre une image en 360° avec une seule caméra équipé d’une lentille fisheye Entaniya 280° pointé vers le haut. Pour cela, il faut filmé en 4:3 et puis faire un crop parfait d’un ratio de 1:1 pour ensuite faire une interpolation polaire correcte. La GoPro n’offre que le mode 2.7K en 4:3, ce qui n’arrange pas les choses. Cette limitation est dû un à problème de bandwidth (bande passante) : trop de calcul pour un si petit processeur. Il faut donc transformer correctement l’image 16:9 en une image 4:3, pour ensuite la transformer en équirectangulaire d’une taille de 5248×2624 (2:1), qu’on pourrait par la suite adapter pour une diffusion sur un casque VR ou pour YouTube.

 

Grille de déformation

Le ratio d’un pixel d’une image 16:9 Superview est différent d’un pixel dans une image 4:3, ce qui donne un résultat d’environ 1:1 pour un pixel au milieu, ce qui garde les proportions corrects et on aura pas d’objet “écrasé” et de 1:.75 sur les bords de l’image. Le défi est de transformer chaque pixel en un ratio de 1:.75, partout dans l’image, sans aucune déformation sur les bords.

Grille de déformation de l’image 16:9 Superview par rapport à une image 4:3

 

On a équipé la GoPro avec une lentille Pentax 16mm C1614M, une lentille qui va couvrir l’ensemble du capteur, donc remplir le champ de vision de la caméra. On a pointé ce dernier vers un écran qui projette de la lumière non structuré.

La lumière non structuré, c’est quoi ?

Petite explication rapide de la lumière structuré et non structuré.
La lumière structuré est utilisé pour “scanner” une surface à l’aide d’un projecteur qui envoies des patterns horizontales / verticales et une caméra qui peut être décalé par rapport au projecteur et qui enregistre les patterns pour pouvoir trouver des correspondances par la suite.

La lumière non structuré utilise le même principe, mais avec des patterns dites “léopard”, généré dans le domaine de Fourier. En voici un exemple :

 

 

 

 

 

 

 

 

La lumière non structuré a été développée au sein du Laboratoire de Vision 3D au DIRO de l’Université de Montréal par Sébastien Roy et Nicolas Martin. (lire ici la thèse : Reconstruction active par projection de lumière non structurée, Sébastien Roy, Nicolas Martin, 2014, Université de Montréal)

 

Méthode

On a filmé un écran qui diffuse de la lumière non structuré. une fois en mode 4K Superview 16:9 et une fois en 2.7K 4:3. Il a suffit de comparer par la suite les deux vidéos gràce à Mathematica afin de générer des cartes de déformations, qu’on va ensuite appliquer pour déformer le superview en 4:3.

Remap sur FFMPEG

On utilise ici une version modifié de FFMPEG. La nouvelle fonction Remap, introduite il y a peu avec la version 3.1, n’interpole pas correctement les pixels, il y a comme un effet de moiré et les sous-pixel ne sont pas vraiment pris en compte.

nouveau système d’interpolation – bilinear=1 (cliquez sur l’image pour l’agrandir)

 

 

Ancien système d’interpolation – bilinear=0 (cliquez sur l’image pour l’agrandir)

 

Si vous n’avez jamais utilisé ffmpeg, suivez ce tutoriel.

Pour cela, le fichier vf_remap.c a été réécrit par Mr. Sébastien Roy afin de préserver le déplacement des sous-pixels.
Donc, vous avez deviné, il faut compiler soit-même ffmpeg avec cette petite modification.

1) Télécharger le fichier vf_remap.c

2) Télécharger la dernière version non compilé de ffmpeg sur Git

git clone https://git.ffmpeg.org/ffmpeg.git ffmpeg

3) Remplacer le fichier vf_remap.c dans le répertoire libavfilter.
4) Suivre ce guide afin de compiler ffmpeg sur votre machine.

4K Superview 16:9 > 4K 4:3

Si vous voulez simplement interpoler l’image de 4K 16:9 Superview à 4K 4:3 et cela quelque soit l’objectif qui est equipé sur la GoPro, voici la commande à retenir :

ffmpeg -i video.mp4 -i superview-3840x2880-x.png -i superview-3840x2880-y.png -filter_complex remap=bilinear=1 -c:v libx264 -crf 18 -pix_fmt yuv420p output.mp4

Rien ne vous empêche de personnaliser le codec de sortie et ses paramètres.

4K Superview 16:9 > 360

La commande ffmpeg qui va suivre a été écrite spécifiquement pour une utilisation de la GoPro Hero 4 Black Edition equipé d’un fisheye Entanyia 280° avec la version ffmpeg modifiée. Cette commande va permettre de transformer le superview 16:9 en 4:3, cropé l’image à l’endroit du fisheye pour avoir un ratio de 1:1, ensuite interpoler l’image en équirectangulaire, autrement dit avoir une image 360°. Rien ne vous empêche d’exécuter les commandes séparément si vous voulez juste interpoler le superview en 4:3.

Avant de commencer, voici les fichiers dont on aura besoin pour la commande. N’oubliez pas d’utiliser ffmpeg avec la fonction modifié de remap.

superview-3840x2880-x.png
superview-3840x2880-y.png
Coordonnées en x et y pour interpolation vers 4:3
equi-square-5248x2624-x.png
equi-square-5248x2624-y.png
Coordonnées en x et y pour interpolation 1:1 > 2:1 équirectangulaire (360°)
coverblack.pngImage qu'on va superposé afin de cacher le bas de l'image.

 

Si vous n’avez pas de vidéo en 4K Superview 16:9, en voici une en téléchargement, libre de droits :

DuréeTailleDimensionsCodecsSonLien
01:00449,4 Mo3840x2160H.264nonCliquez ici

 

 

Il est tout à fait possible de combiner plusieurs filtres FFMPEG dans une même commande, en séparant les filtres par un “;”, qui sont eux mêmes entre guillemets et en spécifiant des inputs et outputs à chaque fois.

Voici la commande telle quelle, l’explication suivra :

ffmpeg -i gopr0344.mp4 -i superview-3840x2880-x.png -i superview-3840x2880-y.png -i equi-square-5248x2624-x.png -i equi-square-5248x2624-y.png -i coverblack.png -filter_complex "[0:v][1][2]remap=bilinear=1:[out1]; [out1]crop=2624:2624:619:106[out2];[out2][3][4] remap=bilinear=1:[out3];[out3][5]overlay,hflip[out4]" -map [out4] -c:v libx264 -crf 18 -pix_fmt yuv420p output.mp4

les inputs :
[0:v] = video.mp4 / vidéo RAW
[1] = superview-3840×2880-x.png / coordonnées en X 4K Superview > 4K 4:3
[2] = superview-3840×2880-y.png / coordonnées en y 4K Superview > 4K 4:3
[3] = equi-square-5248×2624-x.png / coordonées en x fisheye > équirectangulaire
[4] = equi-square-5248×2624-y.png / coordonées en y fisheye > équirectangulaire
[5] = coverblack.png / une bande noire en bas.

Si on décompose les commandes séparément, cela donnerait :

4K Superview > 4K 4:3
[OUT1] = [0:v][1][2]remap=bilinear=1

 ffmpeg -i video -i superview-3840x2880-x.png -i superview-3840x2880-y.png -filter_complex remap=bilinear=1 out
4K Superview 16:9
4K 4:3

 

4K 4:3 > 4K 1:1
[OUT2] = [out1]crop=2624:2624:619:106

ffmpeg out1 -filter_complex crop=2624:2624:619:106 out2 / 2624x2624 la taille de l'image / coordonnées x 619, coordonnées y 106
4K 4:3
4K 1:1

Note importante : le crop 1:1 sur une image 4:3 doit toujours être mesurer en x et y à chaque fois que vous toucher à l’optique, puisqu’un léger changement, comme une mise au point, changement d’optique…etc. peut faire varier le centre du fisheye. La façon la plus simple est d’extraire une image 4:3, l’importer sur Photoshop et mesurer l’écart en x et y du bord de l’image jusqu’au bord du fisheye. Une fois mesurer, introduire ces chiffres dans la commande.

1) Extraire une image 4K 4:3 à partir d’une vidéo 4K 16:9 Superview :

ffmpeg -i video.mp4 -i superview-3840x2880-x.png -i superview-3840x2880-y.png -filter_complex remap=bilinear=1 -f image2 -t 1 out.jpg

2) Importer sur Photoshop (ou n’importe quel autre outil comme ffplay) et mesurer l’écart en x et y du bord de l’image jusqu’au bord du fisheye. Une fois mesurer, introduire ces chiffres dans la commande.

Si le crop est décalé, le centre du fisheye va l’être aussi et une fois interpoler en équirectangulaire, un effet de vague va se former en bas de l’image. Donc faire attention à bien spécifier des coordonnées correctes.

 

4K 1:1 > 4K équirectangulaire
[OUT3]= [out2][3][4] remap=bilinear=1

 ffmpeg -i out2 -i equi-square-5248x2624-x.png -i equi-square-5248x2624-y.png -filter_complex remap=bilinear=1 out3
4K 1:1
4K équirectangulaire

4K équirectangulaire > 4K équirectangulaire en flip horizontal + une bande noire en bas
[OUT4] = [out3][5]overlay,hflip[out4]

 ffmpeg -i out3 -i coverblack.png -filter_complex "[0:v][1:v]overlay,hflip[out]" -map "[out]" out4
4K équirectangulaire
4K Final avec flip horizontal et une bande noire

Enfin, tout cela exporté en H264 profile High, level 5.2 (crf 18), YUV 4.2.0

Vous pouvez exécuter les commandes séparément, mais n’oubliez pas de préciser à chaque fois l’encodage et ses paramètres.

 

 

Si jamais vous avez des questions, vous pouvez écrire un commentaire en dessous !

Emir C. Écrit par :

Soyez le premier à commenter

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *