Dropbox

BlackBox Logを利用した動画スタビライズ」の続きです。前回は、一眼レフで撮影した動画をBlackboxログでスタビライズする試みでmacOSを使用していました。今回はいよいよドローンで撮影した動画のスタビライズに挑戦です。使用する環境はWindows10で、ビルド済みの実行ファイルを利用するのでセットアップがかなり簡単になっています。細かなオプションの解説とかではなく、わたしの実例にそってそれなりに実用的な出力を得られるまでの一連の手順を紹介します。

前回も書いていますがBlacboxログを利用した動画スタビライズ関連のおさらいから始めます。現在、2つの方法があります。一つはBlackboxToGPMFというプログラムを使用してBlackboxログから抽出したジャイロデータを動画ファイルに組み込んでGoProと互換性を持たせてしまうものです。それをReelSteadyGoという定評のあるプログラムでスタビライズするものです。詳しい手順については井上さんのブログをご覧ください。

もう一つがこれから紹介するGyroflowというプログラムで、これひとつでBlackboxログの解析とスタビライズを一度に行います。

Blackboxログの取得から書いていきますので、かなり長いエントリーになることを予めお断りしておきます。

事例として紹介するのはDJI Digital FPV SystemのゴーグルのDVRのスタピライズです。解像度は960×720,60FPSの動画です。Blackboxログは既定値のままで取得したものを使用します。

[ Blackboxログ関連の設定 ]
まずはBlackboxログが取得出来るFCを使わないことには始まりません。Whoopタイプだと取得できないものの方が多いです。まずはBetaflight Configuratorに接続してBlackboxタブを見てください。下のような画面なら大丈夫です。もし、もっと簡単な画面でBlackbox logging deviceがNo LoggingとSerial Portだけの場合は、そのままではログの取得が出来ないのであきらめます。ログ取得には(シリアルポートに外付けのログデバイスを付けるか)FCを交換する必要があります。

ログの取得にSDカードを使用するものだと、そこそこ多くのログが取れます。Onboard Flashの場合はせいぜい3フライト分しか取得できないので、こまめにログの保管とErase flashでの消去が必要です。ログのエリアが一杯なると書き込みを停止します。

必要のないログ項目を削除してなるべく長くジャイロデータを取得する手法などもありますが、とりあえずは既定値のままで大丈夫です。

Blackboxログは既定値でアームからディスアームまで取得するようになっています。Modes画面を見ると分かりますが送信機のスイッチでコントロールすることも可能ですが既定値のままで良いと思います。

飛行前にErase flashで空きを作っておくことだけを忘れ無いようにして、とりあえず飛ばしてみましょう。

[ Blackboxログのコピー ]
上の画面にあるActivate Mass Storage Device Modeボタンを押すとBlackboxログの格納されたストレッジがUSB接続されます。macOSでもWindowsでも、あるいはAndroid端末でも普通のUSBドライブとして見えるようになります。

btfl_001.bbl
btfl_002.bbl
btfl_003.bbl
btfl_all.bbl

みたいな感じでファイルが見えるので、あとから動画と関連付けられるように工夫してどこかにコピーしておきます。保管したらUSBドライブを切断、USBケーブルの抜き差しでBetaflight Configuratorに戻りErase flashしておきます。

[ Blackbox Viewer ]
Bteaflight Blackbox Explorerとも呼ばれます。ログの解析に使うツールですが、ここでは動画とログの時間差の計測とログのcsv形式での出力に使います。 導入はとくに難しくは無く、リンク先の実行ファイルをダウンロードして実行するだけ稼働します。

どのログファイルに欲しいデータが入っているかは開いてみて動画と合わせてみないことには分かりません。またひとつファイルには複数のフライトが入っている可能性もあります。

この例では4つのパートが含まれています。時間の長さを目安に選択します。この場合は4番目が目的のログでした。右上のOpen log file/videoをクリックして動画ファイルを重ねて読み込みます。

再生してみて動画とログが一致しているかどうかと、どれくらいのズレがあるかを調べます。アームしたところとか、最初にスロットルを入れて離陸したところ、あるいは急激なターンなどが目印になります。Gyroflowは5秒までのズレを自動的に補正しますので、あまり細かく追求する必要はありません。わたしの例ですとDJIゴーグルDVRもログと同様にアーム時に自動スタートしますのでその差は確実に5秒以内なのでログと動画が合っているかどうかの確認だけでも大丈夫です。

ズレの計測方法はまず動画で特徴的な動きを探します。右下にあるタイムスタンプを記録します。次にジャイロもしくはスティックの動きを見て対応する所のタイムスタンプを記録し、その差を求めます。オフセットは動画-ログになります。+/-は実際に確認してみれば分かるので深く考えなくても良いです。

計算したズレをSyncに入れて再生してだいたい一致していることを確認します。

次にExport CSVボタンを押してログをCSV形式で保管しておきます。

[ Gyroflow ]
上のリンク先のDownloadページから実行ファイルをもらってきて適当な場所にコピーして実行します。Windowsの場合はgyroflow-presets-*.zipもダウンロードして適当な場所に展開しておきます。macOS版もWindows版もプログラムが動き出すのに少々時間がかかりますので辛抱強く待ってください。もし自力でPythonを動かすことが出来ると立ち上げの時間は節約できます。ただし立ち上がったあとの処理時間は同じです。

Video Stabilizerを起動します。

まずInput画面でビデオファイル、カメラプリセット、CSV形式のログファイルを選択します。カメラプリセットはgyroflow-presersの中に格納されているものから適当に選びます。私の例ではCaddx_Vista_4by3というそのものズバリのプリセットがありました。自分でプリセットを作る方法も作者自身がYouTubeで解説されていますが、わたしは今の所必要としていないので、まだ試したことが無いです。
-> 日本語でのカメラキャリブレーションの方法井上さんが書かれました。そのうち試してみたい。

Blackboxログは拡張子bblの物も読み込めるようになってはいますが、うまく動かないことがあるので先にCSVに変換したものを使用します。
加えてCamera to gyro angleを設定します。わたしの場合Caddx Vistaのカメラアングルがおおよそ30度にしていますので30と入力します。

次にSync/StabilizationにてInitial rough gyro offset/Auto sync timestamp 1/Auto sync timestamp 2を入力します。自動的に+/-5秒の間で同期ポイントを調べてくれるのでInitial rough offsetは本当にラフな数値で大丈夫です(画面では-2と入力していますが、5秒以内なので実際には0のままでも問題ないです)。動画とジャイロは最初と最後で随分とズレます。そのためgyroflowは2つのポイントで画像データとgyroデータを解析してオフセットを計算してくれます。そのために動画のどのあたりで解析すべきかを指示するためにAuto sync timestampを指定します。動画を再生してみてクラッシュ以外で大きな動きをしている場所を動画の最初の方と終わりの方で調べておき、その時間を秒数でAuto sync timestmap 1とAuto sync timestamp 2に指定します。

Smoothnessは好みで変更しますが、とりあえずは20%で良いでしょう。Apply settings and compute syncを押すと同期のための処理が始まります。

後ろにあるコマンドラインのメッセージで処理の進行状況が分かります。また何かしら問題が発生したときにはヒントとなるエラーメッセージも確認できます。しばらくすると上のようなグラフが出るので、そのウインドウを閉じると続きの処理が始まります。

2つ目のグラフです。これは閉じるとすぐに次のグラフが表示されます。

このグラフを閉じるとまたしばらく処理が続きます。

しばらくすると下の方のDelay for sync 1とDelay for sync 2に数値が入ります。これでsync作業が終わりました。次はExportです。

Export画面で最低限入力が必要なのはExport bitrateです。これが足りないと元の動画より画質が劣ってしまいます。ビットレートはコーデックにより変わりますが、とりあえずは元の動画と同じくらいにしておけば良いでしょう。この例では40Mbsにしています。
もうひとつ必ず必要かどうかは分かりませんが、FFmpeg color space selectionにyuvj420pを指定しました。わたしの場合、これを入れておかないとyuv444pというカラープロファイルの動画になってしまいました。これだとDaVinvi Resolveなどで読み込めないので使えない動画ということになってしまいます。最初からyuv420pもしくはyuvj420pを指定すれば良いと思います。

Export (hopefully) stabilized videoを押して出力ファイル名を指定すると動画の書き出しが始まります。進捗が100%に達してpreview画面が消えれば終了です。

出力された動画はフレーム付きでフレームが揺れ動くものになります。これを動画編集で中央部分だけ切り取れば完成です。

もし出力されたファイルが再生できない場合は何かしら問題があります。進捗が出力されているコマンドウインドウに何かエラーが出ているかもしれないので調べて下さい。わたしが経験した事例をひとつ紹介しておきます。

[ トラブル事例 ]
Exportは出来るが普通では再生出来ない動画になった。VLCプレーヤーなら再生できる。あるいは再生は出来るが画質が悪い。
別の観点で調べてみると元の動画にかかわらず25FPS固定、ビットレートも指定通りになっていない。
以下のエラーメッセージがExport時に出力されていた。

11:47:26 :: Helper :: DEBUG :: No Custom FFmpeg path provided. Auto-Installing FFmpeg static binaries now. Please wait…
11:47:28 :: Helper :: ERROR :: HTTPSConnectionPool(host=’ffmpeg.zeranoe.com’, port=443): Max retries exceeded with url: /builds/win64/static/ffmpeg-latest-win64-static.zip (Caused by ProxyError(‘Cannot connect to proxy.’, OSError(0, ‘Error’)))

これは最初にExportする時に内部で使用するためのffmpegというプログラムを自動的に取りに行っているのですが、我が家のネットワーク事情により失敗していました。これが無いと高度な動画ファイルの作成が出来ません。そのため限られた範囲でExportされていました。ネットワーク環境を正しくして実行するとffmpegが取得され正しい動画がExportされました。

以下サンプル動画です。

Trackback

2 comments untill now

  1. nice blog 🙂

  2. Old man still sticks to the blog 🙂

Add your comment now