ぼっちサーファーのブログ

一人海外サーフトリップの記録と雑記

GoPro動画をジンバルを使わずソフトウエアだけで自動水平保持(傾き補正)する

2018/6/6〜25までバリ島一人サーフトリップの記録

リアルタイム更新の記事はこちら

f:id:Apps:20180719124410p:plain


GoPro動画を内蔵センサーデータだけで傾き補正する方法をまとめた。


水平補正前 ➡ 補正後
youtu.be




【関連記事】
www.lonely-surfer.com
www.lonely-surfer.com
www.lonely-surfer.com







目的

物理機構や画像解析によらず、GoProに内蔵されたセンサーだけで傾きの自動補正(水平保持)を実現する。

・水平保持の例
ジンバルを用いずセンサーのデータだけで水平を保持(回転を補正)している。


方法

GoPro HERO5,HERO6はGPS、ジャイロ、加速度センサーを搭載している。
www.lonely-surfer.com


そのデータは動画に影響を与えないメタデータとして動画に保存されている。
github.com

記録されるデータ

~400 Hz 3-axis gyro readings
~200 Hz 3-axis accelerometer readings
~18 Hz GPS position (lat/lon/alt/spd)
1 Hz GPS timestamps
1 Hz GPS accuracy (cm) and fix (2d/3d)
1 Hz temperature of camera

GoPro HERO5 SESSIONはGPSを搭載していないのでジャイロ、加速度センサーだけを記録している。



なおGPSはOFFでもセンサーデータだけは記録されている。


3軸ジャイロのの記録したY軸方向の動きを打ち消すように動画を傾ければ水平を保てるはず。
f:id:Apps:20180718151958p:plain
GPMF Introduction | gpmf-parser by gopro



手順の概要

①動画からメタデータの取り出し
②AfterEffects用のキーフレームデータを作成する
③AfterEffectsで回転を補正する

①動画からメタデータの取り出し(Windowsのみ)

下記から「GPMD2CSV.zip」をダウンロード
http://tailorandwayne.com/GPMD2CSV.zip
github.com



GPMD2CSVはGoProのメタデータ入り動画からCSVを書き出すWindowsのフリーソフト。

Zipを解凍すると下記の4ファイルが展開される。

ffmpeg.exe
gpmd2csv.exe
GPMD2CSV.bat
README.txt

GPMD2CSV.batに動画をドラッグアンドドロップするとCSVが作られる。
f:id:Apps:20180718150651j:plain

[動画のファイル名]-temp.csv:GoProの内部温度データ
[動画のファイル名]-gyro.csv:3軸ジャイロのデータ
[動画のファイル名]-gps.csv:GPSのデータ
[動画のファイル名]-accl.csv:3軸加速度センサーのデータ

f:id:Apps:20180718151323j:plain


この作られたCSVを更に変換する。


②AfterEffects用のキーフレームデータを作成する(Windows & Mac)

GPMD2CSVで作られたデータをAfterEffects用のキーフレームデータで変換する。

変換はgyrocamというプログラム(スクリプト)で行う。
github.com

gyrocamはProcessingという言語で書かれているので、まずは実行環境を構築する。


Processingのインストール

Processingは「Java を単純化し、グラフィック機能に特化した言語」らしい。

下記よりダウンロード&インストール。
Download \ Processing.org


gyrocamのダウンロード

下記よりgyrocamをダウンロード & 解凍 する。
https://github.com/JuanIrache/gyrocam/archive/master.zip

f:id:Apps:20180718165242p:plain


gyrocam.pdeの実行

gyrocam.pdeをダブルクリックして実行する

なお自分の環境(Windows10)では「このアプリはお使いのPCでは実行できません」と出て先に進めなかった。
f:id:Apps:20180720194125j:plain

どうやらzipの解凍に失敗しているらしい。
「processing.exe」や「processing-java.exe」のサイズが0kbのときは失敗している。
f:id:Apps:20180718165620j:plain

Zipファイルをエクスプローラーで開いてから任意の場所(デスクトップなど)にコピーするといい。


gyrocam.pdeを実行、起動するとダイアログが表示される。
Processingが実行されるファイルはファイル名と同名のフォルダの配下に入っている必要があるらしい。

フォルダーを作って移動する?と聞いてくるので「OK」をクリック。
f:id:Apps:20180718165925p:plain

スケッチ(プログラム)が開くので初期設定を行う。
f:id:Apps:20180718170421j:plain

gyrocam.pdeの初期設定

変換する動画に合わせてgyrocam.pdeの初期設定を行う。
スケッチの47〜82行目。この中で関連する部分を修正する。


50行目:String filename = "GOPR0083";
「GOPR0083」は元動画のファイルネームに書き換える。GPMD2CSVで作られたファイルネームも同じはず。
今回は「GOPR0114.MP4」という動画なので「GOPR0083」の部分を「GOPR0114」に書き換える。


51行目:float vFov = 69.5;
動画のVFovに合わせて書き換える。デフォルトは「69.7」

この数値はHERO6、HERO5、HERO5 Sessionで異なる。
下記の表で適正な値を設定する。

HERO5 Session
f:id:Apps:20180718172229p:plain
https://gopro.com/help/articles/Question_Answer/HERO5-Session-Field-of-View-FOV-Information

HERO5
f:id:Apps:20180718172342p:plain
https://gopro.com/help/articles/Question_Answer/HERO5-Black-Field-of-View-FOV-Information

HERO6
f:id:Apps:20180718172728p:plain
https://gopro.com/help/articles/question_answer/hero6-black-field-of-view-fov-information


今回はHERO5の1080P Wの動画なので16:9の「69.5」で設定する。
SuperViewの数値がないが適当に「120」とか入れても補正できたので水平保持には関係ないのかもしれない(プログラム未確認)


69行目:int offset = -30;
動画とCSVデータのタイムラグを調整する。 
とりあえずそのままでもOK。水平補正がずれるようなら微調整する。
各GoProで固有の値があるらしい。初期値は-30。単位はマイクロ秒。

74行目:float smooth = 1;
回転のスムーズさ。。.95 ➡ 1 に書き換える

75行目:float smoothZ= .95
Z軸方向スムーズさ。.95 ➡ 1 に書き換える

76行目:float limitY = -1;
Y軸回転の制限。.02 ➡ -1 に書き換える

78行目:float limitZ = -1;
水平方向回転の制限。.06 ➡ -1 に書き換える



これでスケッチの初期設定が完了。
f:id:Apps:20180719122956j:plain


ソースファイルの用意

先程自動で作られた「gyrocam」フォルダの配下に「data」というフォルダを作成する。
またそのフォルダに動画ファイルとCSVファイルをコピー(移動)する。
f:id:Apps:20180718175137p:plain


ライブラリをインストールする

この状態で実行しても「 processing.video」というライブラリがないと怒られる。

No library found for processing.video
Libraries must be installed in a folder named 'libraries' inside the sketchbook folder (see the Preferences window).

メニューのスケッチ➡ライブラルをインポート➡ライブラリを追加
f:id:Apps:20180718184337p:plain

libraryタブの検索窓に「video」と入力し検索。
f:id:Apps:20180718184632j:plain
上記のライブラリを選択してインストールをクリックする。


これでやっと準備完了。


スケッチを実行する

IDEの上にある三角の再生ボタンっぽいのをクリックするとスケッチが実行される。
f:id:Apps:20180718185302j:plain


フォルダにAfter Effects用のキーフレームファイルが作成される。
f:id:Apps:20180718185355p:plain

この中の [元動画のファイル名]-AErotation.csv が水平補正用のファイルとなる。



③AfterEffectsで回転を補正する

Adobe AfterEffectsをインストールする

導入済みの場合はスキップしてください。
www.adobe.com


動画読み込み

Adobe AfterEffectsを起動。
f:id:Apps:20180719061143p:plain


「新規コンポジション フッテージから」➡元動画を選択
f:id:Apps:20180719113715p:plain


キーフレームをクリップボードにコピー

gyrocam.pdeで作成された[元動画のファイル名]-AErotation.csvをエクセルで開く。

表全体選択➡コピー
f:id:Apps:20180719114901p:plain

csvファイルなのでやGoogle スプレッドシートやOpenOfficeでもいいはず(未検証)



動画の詳細を展開➡トランスフォーム➡回転を選択した状態で貼付け(ペースト Ctrl+V)
f:id:Apps:20180719120935p:plain


これで○フレーム目に△度回転させるというデータが転記される。


これが冒頭の動画。

補正データの貼付け前 ➡ 貼付け後
youtu.be



センサーデータ補正の利点

・機械要素がないの故障などの心配がない。
・GPS非搭載のGoPro HERO5 Session でも利用できる。

センサーデータ補正の欠点

・傾いて動画が切れた部分をクロップ(トリミング)すると1/4ほどの画面サイズとなってしまう。
www.youtube.com


・編集が面倒
・AfterEffectsが高い

AfterEffectsの体験版の期限が切れたらキーフレームのインポートに対応したフリーの動画編集ソフトを探してみよう。

それに合わせてgyrocam.pdeを改変しよう。
せっかくgitにあげてくれてるんだからforkとやらをしたほうがいいんだろうか。。。



【関連記事】
www.lonely-surfer.com
www.lonely-surfer.com
www.lonely-surfer.com