インターバル撮影したJPEGファイルからGPSログデータを抽出する方法
GPS付きアクションカムでインターバル撮影を行うと、位置情報付きのJPEGファイルがたくさん作成されます。 これを利用して、インターバル撮影中の行動ログをGPSデータとして利用できるようにします。
実行環境
Windows 10 Pro 64bit 日本語版を使用。下記のGPSBabelが実行できる環境なら、他のOSでも実行できると思います。
Linux, Macな環境ではバッチ動かないので、似たようなスクリプトを書いてください。
準備
GPSBabelを使用します。インストール方法などはサイトの説明に従って下さい。
変換方法
GPSBabelは、Exifデータ付きのJPEGファイルも入力ファイルにすることが出来ます。このため、JPEGファイルから直接、任意のログデータに変換することが可能です。
しかし、インターバル撮影したファイルは大量です。撮影間隔と時間によりますが、1000枚を超える場合もあります。 GPSBabelには複数のJPEGファイルを入力することもできますが、コマンドライン引数の長さに制限がある環境だと、1000枚、2000枚といったJPEGファイルを扱うことができません。
これを解決するため、以下のように変換を行います。
- バッチファイルなどで、ディレクトリ内のファイルをリストアップする。このとき、ファイル名や撮影時間などでソートし、位置データの順序がおかしくならないようにする。
- 画像ファイルをひとつずつNMEAフォーマットデータに変換し、一時ファイルに追記していく。
- 一時ファイルを任意のファイルフォーマットに変換し、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の備忘録
あらすじ
先日の記事からの続き。
あらかじめ
あんまりいい感じの結果にはならなかった。
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を組む。
作った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にする
動機
- 一眼デジカメで連写する
- ホイール回して写真を確認
- なんか動画っぽい
- GIFにしたい
探せば良い記事がありそうだけど、ひとまず自分の備忘録をかねてメモ。
完成イメージ
くっつけた結果はこんな感じ。
作り方
写真の選別
連写した写真の中から、動画にしたい区間をいい感じに選ぶ。連写が続かずに間隔が空いてしまった写真は、思い切ってなくした方がいい感じ。
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
出来上がった結果はブラウザなどで表示確認。
試行錯誤
うちでやったときは、以下のような感じで作った。
- まず画像切り出しも明るさは変えずに繋げる
- 再生しながら切り出し位置と明るさを変えつつ何度か再作成
- 最初と最後の写真を削除したりして、調整
- 3MB 超えてたらもっと縮小するようにして調整
その他メモ
- 上のコマンドを実行すると、GIFの周りに白枠ができたり、ブラウザでの表示位置がおかしかったりする。
convert
に一度に全部のオプションを指定せず、分けて実行したりすると直った。 - 分けて出力する時は、一時ディレクトリを作成して保存するとよい。その際は、保存ファイル名を
%03d.jpg
として連番で保存するとよい。- 何もしないと、0埋めされてない連番で保存されるため、GIFにしたときにおかしくなる。
- 何度もオプションの値を変えながら、何度もGIFを作ることになる。なので、バッチファイルに書いて実行した方が楽。
- バッチに
%
を書く際は%%
と2回続けて書くこと
- バッチに
- TwitterにGIFを投稿する際は、3MB 以内にする必要あり (2015-05-19時点)