
2026/03/02 17:16
**タイトル:** 「ダッシュカム映像をパノラマ画像に変換する」
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
Summary
この記事では、Garmin 47ダッシュカムのMP4映像をPanoramaxで使用できるジオタグ付きJPEG画像に変換する完全自動化されたLinuxワークフローについて説明しています。
以下の4つの具体的なステップを示しています。
-
GPSデータを抽出
を使用し、カスタムフォーマットファイル(exiftool -ee3 <video>.MP4
)で緯度・経度とISO 8601形式の日時を出力します。gps_format.fmt -
等間隔点を補間
線形スケールで緯度/経度差を変換し(約0.000009°/メートル)、緯度に応じて経度をコサインで調整、ピタゴラスの定理で距離を推定して約3 m間隔のタイムスタンプリストを生成します。 -
そのタイムスタンプでフレームを取得
を実行し、画像を連番(例:ffmpeg -ss <time> -i <video>.MP4 -q:v 3 -frames:v 1 …
)で保存します。4567‑0025.jpg -
GPS/時間メタデータを埋め込む
ExifTool で各JPEGに必要なキー(
、gpslatitude
、gpslongitude
、gpslatituderef
、gpslongituderef
)とオプションタグ(datetimeoriginal
、subsectimeoriginal
、author
、make
)を設定し、model
を使って重複を防ぎつつ-overwrite_original
で出力を抑制します。2>/dev/null
同一秒に撮影された画像の正しい順序付けには
タグが不可欠です。SubSecTimeOriginal
著者はスクリプトが「バグ付き」だと述べつつ、部分的にコメント済みで利用可能であることを示しています。
将来の記事では、GPSサンプルの欠落、重複測定、Null Island の処理、多数のクリップを再帰的に処理するケースなどを扱う予定です。
このワークフローは、Mapillary が生映像を受け入れつつ、Panoramax が事前処理済みでジオタグ付き画像を要求するというギャップを埋め、Linux システム上でダッシュカム映像を効率的にコンプライアンス JPEG に変換できるようにします。
本文
最近、地元の街並みをMapillaryとPanoramaxに投稿し始めました。車載カメラ(ダッシュキャム)がすでに走行中に映像を記録しているので、そのデータが誰か役立つなら共有したいと思っただけです。
Mapillaryへの貢献は非常に簡単でした。
ダッシュキャムには GPS が内蔵されており、映像ファイルに位置情報が埋め込まれているため、そのまま動画をアップロードするとウェブサイト側で画像列へ変換してくれます。一方Panoramaxは映像を事前にジオタグ付き画像へ変換しなければならないので、やりづらいと感じました。
あるカメラは定期的に写真だけを保存するよう設定できるものもありますが、私の場合は「ダッシュキャムとして機能させつつ、Panoramax用の画像も作りたい」ためうまくいきませんでした。手順を掴むまで時間がかかったので、このブログ記事で同じ状況にある人々の助けになることを願って執筆します。
今回紹介するタスクは 4つの基本ステップ から構成されます。私はGarmin 47モデルとLinux環境向けに特化したスクリプトを書きましたが、Panoramax が拡大していけば、各ステップごとに別々のスクリプトを用意し、カメラ種別や計算環境に合わせて組み合わせることも可能です。
ステップ 1 – 映像から GPS データを抽出
Garmin は exiftool を使うと比較的簡単に情報を取り出せます。
exiftool GRMN<number>.MP4
実行すると以下のような警告が表示されることがあります:
Warning : [minor] The ExtractEmbedded option may find more tags in the media data
この警告を無視しても構いませんが、より多くのタグを取得したい場合は次のようにします。
exiftool -ee3 GRMN<number>.MP4
これで GPS 関連の情報(緯度・経度・速度・日時など)が含まれます。
抽出結果から必要な座標だけを取り出すために、フォーマットファイル
gps_format.fmt を作成します。
#[IF] $gpslatitude $gpslongitude #[BODY]$gpslatitude#,$gpslongitude#,${gpsdatetime#;DateFmt("%Y-%m-%dT%H:%M:%S%f")}
次に実行してテキスト化された GPS データを取得します。
exiftool -p gps_format.fmt -ee3 GRMN<number>.MP4 > gps.tmp
ステップ 2 – GPS データを等間隔の点へ変換
Python を使って、約 3 m ごとに線形補間します。
1 m は緯度で約 0.000009° に相当し、経度は
cos(lat) でスケールします。
from math import cos, radians scale_lat = 1 / 9e-6 scale_lon = scale_lat * cos(radians(lat0))
点間距離の計算例:
dx = scale_lon * (lon1 - lon0) dy = scale_lat * (lat1 - lat0) dist_between_points = (dx**2 + dy**2)**0.5
累積距離を保持しながら、3 m ごとの位置を線形補間で求めます。
lerp = lambda a,b,x: (1-x)*a + x*b lat_interp = lerp(latA, latB, 0.6) lon_interp = lerp(lonA, lonB, 0.6)
結果は
processed_points.csv に保存します。これでステップ 2 は完了です。
ステップ 3 – 映像から画像を抽出
ffmpeg を使い、指定した時刻のフレームを1枚だけ取得します。
ffmpeg -ss <time> -i <video>.MP4 -frames:v 1 output.jpg
デフォルトでは圧縮が強めにかかります。画質を上げるには
-q:v(数値が小さいほど高品質)を設定します。例として 3 を指定。
ffmpeg -ss <time> -i <video>.MP4 -q:v 3 -frames:v 1 output.jpg
コンソール出力を抑えるには
-hide_banner -loglevel fatal を付けます。
複数画像を抽出する場合はループで変数化します。
ffmpeg -ss $(printf "%.3f" "$time") \ -i "$input_dir/GRMN$num.MP4" \ -q:v "$jpeg_quality" \ -frames:v 1 \ -hide_banner -loglevel fatal \ "$output_dir/$num-$(printf "%04d" $img_num).jpg"
命名規則は
ビデオ番号_画像番号.jpg(例:4567-0025.jpg)とします。
ステップ 4 – 画像に GPS/時間メタデータを付与
exiftool でタグを書き込みます。
exiftool -overwrite_original \ -gpslatitude=$lat -gpslongitude=$lon \ -gpslatituderef=$ns -gpslongituderef=$ew \ -datetimeoriginal=$timestamp \ -author="$exif_author" \ -subsectimeoriginal="$subsec" \ -make="$exif_make" \ -model="$exif_model" \ "$output_dir/$num-$(printf "%04d" $img_num).jpg" 2>/dev/null
Panoramax が受け入れるためには以下のタグが必須です。
-gpslatitude=45.6789 -gpslongitude=-123.456789 -gpslatituderef=N -gpslongituderef=W -datetimeoriginal=2000-01-02T03:04:05
SubSecTimeOriginal はフレームを秒単位で複数抽出した際の正確な順序付けに不可欠です。小数点以下を整数文字列で指定します(例:51.328 s なら 328)。
追加で便利なタグは:
-subsectimeoriginal=067 -author=FeetAndInches -make=Garmin -model="Garmin 47 Dash Cam" -usercomment="$exif_comment"
ステップ 3 と同じループ内で実行すると、処理がスムーズです。
おわりに
この記事ではダッシュキャムの映像を Panoramax 用にジオタグ付き画像へ変換する方法を解説しました。次回は「GPS サンプル不足・エラーチェック・境界補間・複数クリップバッチ処理」など、より高度なトピックを扱う予定です。
現在使用しているスクリプト(未完成版・コメント付きで時折メンテナンスが必要)を共有したい方はお知らせください。誰かのアマチュアコードでも構わないので、少し手を加えるだけで十分役立つと思います。
ご覧いただきありがとうございます。
FeetAndInches