インターバル撮影したJPEGファイルからGPSログデータを抽出する方法

GPS付きアクションカムでインターバル撮影を行うと、位置情報付きのJPEGファイルがたくさん作成されます。 これを利用して、インターバル撮影中の行動ログをGPSデータとして利用できるようにします。

実行環境

Windows 10 Pro 64bit 日本語版を使用。下記のGPSBabelが実行できる環境なら、他のOSでも実行できると思います。

Linux, Macな環境ではバッチ動かないので、似たようなスクリプトを書いてください。

準備

GPSBabelを使用します。インストール方法などはサイトの説明に従って下さい。

http://www.gpsbabel.org/

変換方法

GPSBabelは、Exifデータ付きのJPEGファイルも入力ファイルにすることが出来ます。このため、JPEGファイルから直接、任意のログデータに変換することが可能です。

しかし、インターバル撮影したファイルは大量です。撮影間隔と時間によりますが、1000枚を超える場合もあります。 GPSBabelには複数JPEGファイルを入力することもできますが、コマンドライン引数の長さに制限がある環境だと、1000枚、2000枚といったJPEGファイルを扱うことができません。

これを解決するため、以下のように変換を行います。

  1. バッチファイルなどで、ディレクトリ内のファイルをリストアップする。このとき、ファイル名や撮影時間などでソートし、位置データの順序がおかしくならないようにする。
  2. 画像ファイルをひとつずつNMEAフォーマットデータに変換し、一時ファイルに追記していく。
  3. 一時ファイルを任意のファイルフォーマットに変換し、GPSデータとして利用できるようにする

追記に適しているため、中間フォーマットにNMEAを使用しています。

NMEAフォーマットのみが必要であれば、2. の手順まででOKです。今回はGoogle Earthで閲覧したいので、KMLに変換するところまでやります。

バッチファイル

以下のようなバッチファイルを用意して、実行します。Linux, Macな環境では動かないので、シェルスクリプトとかに書き換えてください。

@echo off
SET GPSBABEL="C:\Program Files (x86)\GPSBabel\gpsbabel.exe"
SET INPUT=%~f1
SET OUTPUT=%~f2
SET TEMPFILE=%~p2__temp__.txt

IF EXIST "%TEMPFILE%" (
    ECHO 前回の一時ファイルが残っています。
    DEL /P "%TEMPFILE%"
)
IF EXIST "%TEMPFILE%" (
    ECHO 一時ファイルを削除しませんでした。処理を終了します。
    GOTO :EOF
)

IF EXIST "%OUTPUT%" (
    ECHO 出力ファイルがすでに存在するため、処理を終了します。
    GOTO :EOF
)

ECHO 一時ファイルを作成しています...

FOR /f "eol=: delims=" %%F IN (
    'dir /b /a-d /one "%INPUT%\*.jpg"'
) DO (
    %GPSBABEL% -w -i exif -f "%INPUT%\%%F" -x transform,trk=wpt -o nmea -F - >> "%TEMPFILE%"
    ECHO %%F を変換しました
)

ECHO 一時ファイルをKML形式に変換しています...

%GPSBABEL% -t -i nmea -f "%TEMPFILE%" -x transform,trk=wpt,del -o kml -F "%OUTPUT%"

ECHO KMLファイルの作成を完了しました。(%OUTPUT%)

上記のバッチファイルをbabel_batch.batとして保存した場合、以下のように実行します。

babel_batch.bat (入力ディレクトリ) (出力ファイル名)

実行が完了したら、出力ファイル名として指定したパスにKML形式のファイルが作られます。

CSS Sprite Sheet Animationの備忘録

あらすじ

先日の記事からの続き。

a3w.hateblo.jp

あらかじめ

あんまりいい感じの結果にはならなかった。

CSS でもパラパラ動画

GIFだと色制限があるので、JPEGとかPNGでアニメーションできないものか...と調べてたら "CSS Sprite Sheet Animation" にたどり着いた。最近はCSSだけでもパラパラ動画が作れるらしい。ちょっと試してみた。

下準備

連写した写真が必要なのは同じ。

CSSで動画を作るには、JPEGファイルを1つの画像にまとめる必要がある。 映画フィルムみたいに連続でくっつけて、CSSでその表示方法を指定する。

画像をくっつけるのもImageMagickなら一発。-appendオプションを使う。

convert -append 最初の画像 残りの画像 出力ファイル名

残りの画像の指定もワイルドカードが効くのだが、そのまんま使うと最初の画像が2回入ったりする。なのでパス指定を工夫するなり、フォルダを分けるとかして、うまいことする。

前回のGIF画像をくっつけたところ、1.18MB の 400x11340の画像が出来上がった。でかい。

CSS の用意

以下のURLなどを参考にしつつ、CSSを組む。

blog.teamtreehouse.com

作ったHTMLはこんな感じ。色々と省略。

<html>
<head>
<style type="text/css">
.anim-400-210-54s {
    width: 400px;
    height: 210px;
    background: url('movie.jpg') left top;
    animation: play 6s steps(54) infinite;
}

@keyframes play {
    100% { background-position-y: -11340px; }
}
</style> 
</head>
<body>
<div class="anim-400-210-54s"></div>
</body>
</html>

結果

ローカルでうまく動いたので、はてなブログに貼り付けるぜ!...と思ったのだが、CSS指定してもうまく動かなかった。残念。

あと以下の点から、今回の用途にはCSS Sprite Sheet Animationはちょっと不向きだった。

  • 動画サイズとかフレームが違うので、その都度、別のスタイルを定義する必要がある
  • ImageMagickの減色処理がいい感じだったので、GIFでも個人的には満足
  • Twitterとかに貼れない

今回はそこまでやらなかったけど、CSSのクリップ処理とか併用すればすれば、お手軽にプレビューできて便利かも。

Google Photosで連写した写真から動画を簡単に作れるらしい...という話もあるので、次に調べるのはそちらかなー。

おしまい。

ImageMagickを使用して、連写した写真をGIFにする

動機

  1. 一眼デジカメで連写する
  2. ホイール回して写真を確認
  3. なんか動画っぽい
  4. GIFにしたい

探せば良い記事がありそうだけど、ひとまず自分の備忘録をかねてメモ。

完成イメージ

くっつけた結果はこんな感じ。

f:id:hisadg:20150519223211g:plain

作り方

写真の選別

連写した写真の中から、動画にしたい区間をいい感じに選ぶ。連写が続かずに間隔が空いてしまった写真は、思い切ってなくした方がいい感じ。

ImageMagick

一枚ずつ編集するのは大変なので、ImageMagickを使う。

ImageMagick

GIF作成以外にも色々出来る。今回は回転、縮小、明るさ調整、切り出しの機能も使う。

ImageMagick使い方

画像の回転

編集しやすいように、まずはEXIF情報を元に画像を回転しておく。縦持ちで撮った写真とかは、これをやっとかないと後で困る。回転はImageMagick-auto-orientオプションを使う。これだけでEXIF情報を元に画像をうまいこと回転してくれるので、便利。

画像の切り出し

映り込みがあったり、被写体が小さかったりするので、画像から特定位置を切り出す。ImageMagick-cropオプションを使う。指定方法は、横幅x縦幅+始点X+始点Y-crop 4000x2100+1472+700みたいな感じで指定する。切り出し位置はペイントとか写真編集ソフトで座標をチェック。

縮小

撮影したJPEGをそのままGIFにすると、画像的にも容量的にも結構なサイズになる。320x240など、それらしいサイズに縮小してやる。ImageMagick-geometryオプションを使う。割合で縮小すると、縦横比とか気にしなくていいので楽。電卓でそれらしい割合を計算。

明るさ変更

明るい写真の方がいい感じな場合は明るさ調整。-modulateオプションで、明るさを調整。100が基準の明るさらしいので、倍に明るくしたければ200とかを指定。

GIFにする

最後にGIF変換。ImageMagickは連番ファイルを繋げてGIFにするので、連番ファイルになってることが大事。GIF変換では-delay-loopオプションを使う。-delayには1枚の画像の表示時間を1/100秒単位で、-loopではループ画像にするかどうかを指定する。-loop 0でループになる。

-delayの値はカメラの連写速度から計算しても良いし、あえて速めにするのも面白い。

実行コマンド

以上を元に、JPEG画像を集めたディレクトリ内で以下のコマンドを実行。ImageMagickのオプションは一括で指定しても良いようなので、一回で指定してしまう。

convert .\*.jpg -auto-orient -crop 4000x2100+1472+700 -geometry 10% -modulate 160 -delay 9 -loop 0 movie.gif

画像切り出しも明るさ調整も不要なら、以下でOK。

convert .\*.jpg -auto-orient -geometry 10% -delay 9 -loop 0 movie.gif

出来上がった結果はブラウザなどで表示確認。

試行錯誤

うちでやったときは、以下のような感じで作った。

  1. まず画像切り出しも明るさは変えずに繋げる
  2. 再生しながら切り出し位置と明るさを変えつつ何度か再作成
  3. 最初と最後の写真を削除したりして、調整
  4. 3MB 超えてたらもっと縮小するようにして調整

その他メモ

  • 上のコマンドを実行すると、GIFの周りに白枠ができたり、ブラウザでの表示位置がおかしかったりする。convertに一度に全部のオプションを指定せず、分けて実行したりすると直った。
  • 分けて出力する時は、一時ディレクトリを作成して保存するとよい。その際は、保存ファイル名を %03d.jpg として連番で保存するとよい。
    • 何もしないと、0埋めされてない連番で保存されるため、GIFにしたときにおかしくなる。
  • 何度もオプションの値を変えながら、何度もGIFを作ることになる。なので、バッチファイルに書いて実行した方が楽。
    • バッチに%を書く際は%%と2回続けて書くこと
  • TwitterGIFを投稿する際は、3MB 以内にする必要あり (2015-05-19時点)