先日の速報でもお伝えした通り、ふたご座流星群の極大日の12月14日の夜、ベランダから流星の撮影をしました。
昨年と同様、フォクトレンダー 17.5mm F0.95 で動画撮影して、フリーウェアを改造した手製のツール(SImpleMeteorDetector)で流星検出、ダイジェスト版動画の生成、という流れ。ただし、鳥や飛行機の誤検出と思われるものは目視で確認して取り除いてから動画にしています。
結果はこちら。10分足らずの動画です。流星、いくつみつけられるでしょうか?
検出した流星にマーカーを付けたこちらの動画で答え合わせしてください。。
今回はカットの冒頭でタイムスタンプに下線を表示して、そこで時間がジャンプしていることの印にしています。検出結果から生成したカット割は113カットで、最低それだけの流星が検出されたのですが、よく見ると同じカットに2つの流星が写っているものが2つありました。そのうち片方は検出漏れでマーカーが付いていませんでした。
というわけでフルサイズ換算35mmの写野の中に最低でも115個の流星が流れたことになります。元動画の撮影時間を合計すると5時間45秒ありました。平均すると2分36秒毎に1個流れたことになります。正直こんなに写るとは思っていませんでした。
ちなみに動画の撮影時間の抽出は bash のワンライナーでこんな感じ。
(for f in 2022-12-1*/*.MOV ;do ffprobe $f |& grep 'Duration: '; done) | perl -e 'while(<>){ $_ =~ /Duration: ([0-9:.]+),/; print "$1\n"}'
速報でお伝えした20:30頃の流星(火球)はこの動画の7個目です。タイムスタンプを見ると 20:30:45.6 あたりから流れ初めていました。ちなみにこれが今回撮った最大の流星でした。ちなみに流星痕については、永続痕が写ったのはこれ一つですが、短痕が出ているものはいくつか写っています。
SimpleMeteorDetector v0.2.0
今回の動画作成にあたり、SimpleMeteorDetector も色々改修したので、v0.2.0 として公開しました。
変更点は以下の通り:
- 全コマンドで -h でヘルプを表示した際にバージョンを表示するようにした。
- detector_tuner.py に、オプション --area-threshold, --area-value-threshold, --hough-threshold, --input-config-file を追加。
- --area-threshold は元々 detect_meteor.py にあった雲や建物を検出して塗りつぶして誤検出されないようにするオプションです。detector_tuner.py では対応していなかったのですが、今回一部のカットで写り込んだベランダの天井のエッジが誤検出されてしまったので対応しました…
- --area-value-threshold は --area-threshold による物体塗りつぶし用のパラメータで、物体の明るさの閾値を指定するものです。今回薄暗いベランダの天井を消せるようにするため追加しました。デフォルトは127で v0.1.0 と同じ値ですが、暗い物体を消したい場合はより小さな値を指定します。
- --hough-threshold はハフ変換の threshold パラメータです。デフォルトだと短くて暗い流星が検出しづらいので追加しました。基本小さな値ほど細く短い流星を検出しやすくなりますがなかなか予測し難い効き方をするので試行錯誤が必要です。
- --input-config-file は一度 --output-config-file で出力した JSON ファイルを修正して効果を確かめたい場合に使います。
- detect_meteor.py に、オプション --area-value-threshold, --hough-threshold を追加。
- 追加オプションについては detector_tuner.py で説明したとおりです。
- make_digest_movie.py に、オプション --gamma, --rotation, --cue を追加。
- --gamma は入力動画のフレームにガンマ補正をかけるオプションで、ガンマ値を指定します。1.0 より大きな値にすると画像が明るくなります。
- --rotation は入力動画のフレームを90度単位で回転するオプションで、90, 180, 270(または-90)を指定します。今回、カメラと機材の干渉を避けるためにカメラが逆さまになる形で撮影したので必要になり、実装しました。
- --cue は、上で少し触れたように、カット割りした部分の継ぎ目がわかるようにカットの冒頭でタイムスタンプの下に下線を表示するもので、下線の表示時間を指定します。
- color 系のオプションのヘルプの R,G,B の並び順を訂正(R,G,B → B,G,R)。
詳細は github リポジトリの README.md を参照してください。
なお、Anaconda 付属の ffmpeg はコーデックに h264 (libx264) が指定できなくて(ビルド時に無効化してあるようです)、mp4 動画は mp4v コーデックになってしまうようです。大抵のプレーヤーでは再生できるのですが、SNSや動画サイトにアップロードすると非対応で弾かれることがあるので(Twitterでも弾かれます) h264 にしたいところ…
Ubuntu の場合、OS側の ffmpeg は h264 対応なので、make_digest_movie.py の --pipe オプションを使ってOS側の ffmpeg にフレームデータを受け渡すことで解決します。bash のコマンドラインだとこんな感じです。
(conda activate; ./make_digest_movie.py --pipe --rotation 180 --cue 0.5 --gamma 1.8 --timestamp-color "(160,160,160,192)" --disable-marker `ls 20221214-PC*/*.json`) | ffmpeg -f rawvideo -pix_fmt bgr24 -s 1920x1080 -framerate 23.97 -i - -c:v libx264 -crf 17 result-20221214-h264.mp4
これを実行する shell は conda activate しない素の shell です。カッコ内で conda activate して SimpleMeteorDetector のスクリプトを実行することで、Anaconda 環境を subshell に閉じ込めて、パイプの先ではOS側の ffmpeg を起動します。
蛇足ですが、上の動画のタイトル画面も ffmpeg で追加しています。
まず GIMP なり Photoshop なりで png 画像のタイトルを作って、タイトルを3秒表示するならそれを title-01.png, title-02.png, title-03.png と3つコピーして、以下のように ffmpeg でタイトル部分だけの動画を作ります。
ffmpeg -r 1 -i "title-%02d.png" -vcodec libx264 -pix_fmt yuv420p -r 23.97 title.mp4
これを SimpleMeteorDetector で生成したダイジェスト動画(result-20221214-h264.mp4 とします)と結合します。まず、以下の内容を filelist.txt のファイル名で保存します。
file title.mp4 file result-20221214-h264.mp4
そして以下のようにして ffmpeg を実行します(出力先は out.mp4 とします)。
ffmpeg -f concat -i filelist.txt -vcodec libx264 -b:v 4000k -r 23.97 out.mp4