Stabilisation photos Gopro

Ce matin, je regardais d’un peu plus près les métadonnées des photos d’une Gopro Max pour regarder si on avait l’info d’inversion ou non de la “direction” des photos (oui, on l’a avec le tag GoPro_PVUL), et je me disais qu’on avait peut-être le moyen de recréer un peu de stabilisation directement dans la visionneuse.
En effet, si on n’a pas directement l’orientation x/y/x en valeur absolue, en revanche, on trouve ces tags:

  • GoPro_GRAV (GRAvity Vector - Vector for the direction for gravitiy)
  • GoPro_CORI ( Camera ORIentation - Quaternions for the camera orientation since capture start)

Voici un exemple d’une petite séquence sur laquelle j’ai fait pivoter la caméra sur son axe vertical. Si quelqu’un est à l’aise avec ces maths, et peut nous dire si c’est exploitable, ce serait super

exiftool *.JPG -v | grep 'CORI\|GRAV'
  | | GoPro_GRAV = -0.00918607134371996 0.999786376953125 -0.0184636972844601
  | | GoPro_CORI = 1 -0.000854518264532089 -0.000244148075580597 -0.000518814660608768
  | | GoPro_GRAV = -0.0121463667601347 0.999725341796875 -0.0206610299646854
  | | GoPro_CORI = 0.999969482421875 -0.00350962858647108 0.0062562944367528 0.00076296
  | | GoPro_GRAV = -0.0167241431772709 0.999603271484375 -0.022888882085681
  | | GoPro_CORI = 0.988006234169006 -0.00811792351305485 0.154118478298187 0.000457777
  | | GoPro_GRAV = -0.0218817703425884 0.999481201171875 -0.0234687328338623
  | | GoPro_CORI = 0.944792032241821 -0.0128177739679813 0.327433079481125 6.1037018895
  | | GoPro_GRAV = -0.0347300618886948 0.999359130859375 -0.0100711081176996
  | | GoPro_CORI = 0.735404551029205 -0.017578661441803 0.677388846874237 0.00335703603923321
  | | GoPro_GRAV = -0.0256050303578377 0.999664306640625 0.00415051728487015
  | | GoPro_CORI = 0.466658532619476 -0.0153202917426825 0.884304344654083 0.0036011841148138
  | | GoPro_GRAV = -0.0189825128763914 0.99981689453125 0.00177007354795933
  | | GoPro_CORI = 0.287606418132782 -0.01535081025213 0.95760977268219 0.00100711081176996
  | | GoPro_GRAV = -0.0100711081176996 0.99993896484375 0.00244148075580597
  | | GoPro_CORI = -0.19226661324501 -0.012695699930191 0.981261610984802 0.00158696249127388
  | | GoPro_GRAV = -0.00259407330304384 1 -0.00265511032193899
  | | GoPro_CORI = -0.630848109722137 -0.00640888698399067 0.775841534137726 0.00338755
  | | GoPro_GRAV = -0.00350962858647108 0.99993896484375 -0.0104678487405181
  | | GoPro_CORI = -0.932248890399933 0.00143436994403601 0.361705362796783 0.004486220
  | | GoPro_GRAV = -0.00979644153267145 0.999847412109375 -0.0149540696293116
  | | GoPro_CORI = -0.9998779296875 0.00863673817366362 0.00833155307918787 0.004089480265975
  | | GoPro_GRAV = -0.0166936255991459 0.9996337890625 -0.020874660462141
  | | GoPro_CORI = -0.9998779296875 0.0127567369490862 -0.00234992522746325 0.002990813

GRAV: tu as les 3 vecteurs, le second étant clairement la verticale, faut voir pour les deux autres en inclinant la Gopro sur le roulis, puis sur le tangage.

Au repos, ça permet donc de déterminer l’inclinaison sur les 3 axes.
En mouvement… les différentes accélérations sur la trajectoire viennent s’ajouter.
Si tu freines ou accélère, ça change, et pareil en virage (accélération centrifuge).

CORI: je ne connaissais pas les quaternions, mais un peu de lecture aide…

Là, on a de quoi déterminer la rotation sur les 3 axes si j’ai bien compris et sans perturbation dues aux accélérations.

En combinant tout ça, on devrait pouvoir mieux déterminer non seulement si on capture vers l’avant ou pas, mais aussi si l’image est inclinée, l’horizon au milieu, etc…