ReStamp
生成された連番JPEGファイルに撮影時刻を書き込む必要が有ります。
私の自作したソフトウェア Restamp(Movie2jpg) を使って連番JPEGのファイル更新日時を撮影時刻に変換する方法を紹介します。
もし、カメラの時刻合わせに失敗していたり、時間ウォーターマークを設定し忘れた場合は、撮影時刻推定方法 を参照してください。
時間ウォーターマークが設定されている場合は、下記の方法で抽出されたイメージファイルに撮影時刻を設定することができます。
img
フォルダの画像を画像ビューワなどで開き、画像のウォーターマークを読み取る(最初の方のファイルを選択する)
同様にして、もうひとつの別の画像のウォーターマークを読み取る(最後の方のファイルを選択する)
コマンドラインを作る
コマンドライン:
* 動画から一定間隔で切り出したIMAGEのファイル更新日時を書き換える * * ・画像ファイルの更新日付を書き換えます。(Exi情報は無視します) * ※ 指定されたディレクトリ内のすべての'*.jpg'ファイルを処理の対象とします * ・画像は連番形式(名前順に並べられること)の名称となっていること * * 1.予め、動画から画像を切り出す * ソースファイル(mp4ファイル); 「-i 20160427_104154.mp4」 * 出力先: 「-f image2 img/%06d.jpg」 imgフォルダに6桁の連番ファイルを差出力する * 切り出し開始秒数→ 「-ss 0」 (ファイルの0秒から切り出し開始) * 切り出し間隔; 「-r 30」 (1秒間隔=30fps間隔) * ``` * $ cd /home/yuu/Desktop/OSM/20180325_横浜新道 * $ ffmpeg -ss 0 -i 20160427_104154.mp4 -f image2 -r 15 img/%06d.jpg * ``` * * 2. ファイルの更新日付を書き換える * ``` * $ cd /home/yuu/Desktop/workspace/AdjustTime/importPicture/dist * $ java -cp .:AdjustTime2.jar osm.jp.gpx.Restamp /home/yuu/Desktop/OSM/20180325_横浜新道/img 000033.jpg 2018-03-25_12:20:32 003600.jpg 2018-03-25_13:20:09 * ``` * * exp) $ java -jar Restamp.jar argv[0] argv[1] argv[2] argv[3] argv[4] * exp) $ java -jar Restamp.jar argv[0] argv[1] argv[2] argv[3] argv[4] argv[5] * * @param argv * argv[0] = 画像ファイルが格納されているディレクトリ --> imgDir * argv[1] = 時刻補正の基準とする画像ファイル --> baseFile1 * argv[2] = 基準画像ファイルの精確な撮影日時 "yyyy-MM-dd HH:mm:ss z" --> baseTime1 * argv[3] = 時刻補正の基準とする画像ファイル --> baseFile2 * argv[4] = 基準画像ファイルの精確な撮影日時 "yyyy-MM-dd HH:mm:ss z" --> baseTime2 * argv[5] = (option)変換済み画像ファイルの出力フォルダ.省略した場合は元画像を直接上書きする --> outputDir
(1) 冒頭
「docker run --rm -it -v $(pwd)/mapi:/mnt/mapi:rw movie2jpg java -cp .:/root/Movie2jpg.jar:/root/commons-imaging-1.0-20170205.201009-115.jar osm.jp.gpx.Restamp
」 固定文字列
(2) ディレクトリ 連番ファイルが格納されたディレクトリ 例:「./img/20180407_135053A
」
(3) 最初の方のファイル名 と 撮影日時 ファイル名
と 撮影日時
「撮影日時」は書式 yyyy-MM-dd'T'HH:mm:ss'Z'
として9時間前の時刻を入力する(例: 2018-05-13T04:29:16Z
) 例:「00239.jpg 2018-04-07T05:54:47Z
」
(4) 最後の方のファイル名 と 撮影日時 ファイル名
撮影日時
「撮影日時」は書式 yyyy-MM-dd'T'HH:mm:ss'Z'
として9時間前の時刻を入力する(例: 2018-05-13T04:29:16Z
) 例:「01725.jpg 2018-04-07T05:19:36Z
」
cd ~/Movie2jpg-master docker run --rm -it -v $(pwd)/mapi:/mnt/mapi:rw movie2jpg java -cp .:/root/Movie2jpg.jar:/root/commons-imaging-1.0-20170205.201009-115.jar osm.jp.gpx.Restamp ./img/20180407_135053A 00239.jpg 2018-04-07T05:54:47Z 01725.jpg 2018-04-07T05:19:36Z
ターミナルにコマンドラインを貼り付けて実行すると、JPEGファイルのファイル更新日時が「撮影日時」に書き換わります。
撮影日時がファイルの更新日時に設定されると、GPXファイルとファイル更新日時を付きあわせてJPEGのEXIFに書き込む方法は無数に有ります。 使い慣れたツールを使って JPEGファイルのEXiF情報に位置情報を書き込んでください。
ここでは 私の自作ツールを使ってEXiFに位置情報を書き込む方法を説明します。
Java実行環境をインストールしてください。インストール方法は割愛します。
AdjustTime2をダウンロードする
ダウンロードした ZIPファイルをホームディレクトリ(~/AdjustTime2
)に展開する
コマンドを叩いて 起動する Terminal
(Windowsの場合はDocker Quickstart Terminal
)に下記コマンドを打ち込む
cd ~ cd AdjustTime2 chmod +x AdjustTime2.sh ./AdjustTime2.sh
「選択」ボタンを押して任意のファイルを選択する → 「基準時刻画像」にファイルが選択される → 「次へ」
そのまま「次へ」
既に撮影時刻が設定されているので、そのまま「次へ」
GPXフォルダ に「~/Movie2jpg-master/mapi/gpx
」をセットして、「次へ」 フォルダを設定した時は、そのフォルダ内のすべてのGPXファイルをひも付けの対象とします。 GPXファイルを指定した時は、指定されたGPXファイルのみひも付けの対象とします。
書き出しフォルダ に「~/Movie2jpg-master/mapi/gpx
」をセット
「処理実行」ボタン 「実行」ホタン
処理が終わったら「閉じる」ボタン
~/Movie2jpg-master ┃ ┗━ ~/Movie2jpg-master/mapi ┃ ┗━ ~/Movie2jpg-master/mapi/gpx ┃ ┗━ ~/Movie2jpg-master/mapi/gpx/XXX ┣━ 00001.jpg ┣━ 00002.jpg ┣━ : ┗━ 01861.jpg
EXiFが付与されたファイルが ~/Movie2jpg-master/mapi/gpx
に作成されます。
カメラもGPSロガーも正確な時刻と同期させていれば 撮影時刻=GPS位置 が一致するようにみえますが、実際には カメラとロガーとの相性の関係によって、組み合わせによっては2〜6秒ほどのズレが生じます。
次にこのズレの補正方法を示します。
Java実行環境をインストールしてください。インストール方法は割愛します。
JOSMをインストールしてください。インストール方法は割愛します。
JOSMを起動する
JOSMに「EXIFが作成されたフォルダ`/mapi/gpx/XXX
」内のすべてのファイルをドラッグ&ドロップする
JOSMの[メニュー]→[画像]→[お好みの背景画像]を選びます。この例では「Bing航空画像」を選んでいます
ルート履歴から交差点で曲がっている箇所を探します
交差点近傍の写真からGPSロガーとのズレを確認します。この例ではカメラ側の時間が5秒遅れています
AdjustTime2 の撮影時刻設定画面に戻って、設定時間に「5秒」加えた値を設定して、再実行します
再度、JOSMを起動して「EXIFが作成されたフォルダ`/mapi/gpx/XXX
」内のすべてのファイルをドラッグ&ドロップする
交差点近傍の写真の位置を再度確認します
Mapillary-toolsでも重複画像を削除する機能は有りますが、絶対にアップしたくないヤバイ画像や信号待ち等の画像は手動で削除してしまいましょう
元ネタはここから引用しています
ここでは Docker を使った方法を紹介します。
Docker 'mapillary_tools'
'mapillary_tools'は Dockerイメージ 'haya4/Movie2jpg' に含まれています。 初回に限りmapillary.shのセットアップが必要です。
~/Movie2jpg-master/mapillary.sh
ファイルを下記の内容に書き換えてくださいexport MAPILLARY_EMAIL="hoge@mail.com" export MAPILLARY_PASSWORD="password" export MAPILLARY_USERNAME="yourname" export MAPILLARY_PERMISSION_HASH="....==" export MAPILLARY_SIGNATURE_HASH="....=" python /source/mapillary_tools/python/remove_duplicates.py /mnt/mapi/img/m/ /mnt/mapi/img/duplicate/ python /source/mapillary_tools/python/upload_with_preprocessing.py /mnt/mapi/img/m/
Mapillary へログインし、「Developer」のページを表示させ、そこに記載された項目をmapillary.sh
に設定してください。
Terminal
(Windowsの場合はDocker Quickstart Terminal
)に下記コマンドを打ち込む (rebuild)cd ~/Movie2jpg-master docker build -t movie2jpg .
~/Movie2jpg-master ┃ ┗━ ~/Movie2jpg-master/mapi ┃ ┗━ ~/Movie2jpg-master/mapi/img ┃ ┣━ ~/Movie2jpg-master/mapi/img/m ┃ ┣━ 00001.jpg ┃ ┣━ 00002.jpg ┃ ┣━ : ┃ ┗━ 01861.jpg ┃ ┗━ ~/Movie2jpg-master/mapi/img/duplicate
「~/Movie2jpg-master/mapi/img/m」フォルダにMapillaryにアップしたいJPEGファイルを置く (「~/Movie2jpg-master/mapi/gpx」に作成されたEXiFが付与されたファイルが入ったフォルダを「~/Movie2jpg-master/mapi/img/m」フォルダに変更する)
「~/Movie2jpg-master/mapi/img/duplicate」フォルダに重複ファイルが置かれる
cd ~/Movie2jpg-master docker run --rm -it -v $(pwd)/mapi:/mnt/mapi:rw movie2jpg /bin/bash /root/mapillary.sh docker run --rm -it -v $(pwd)/mapi:/mnt/mapi:rw movie2jpg chmod 777 -R /mnt/mapi
-v $(pwd)/mapi:/mnt/mapi:rw PCのフォルダ(~/mapi)をコンテナのフォルダ(/mnt/mapi)にマウントする # cd /root # sh ./mapillary.sh # : #
これで Mapillary へのアップロードが完了しました。
調子にのってガバガバアップロードしてると契約しているインターネットプロパイダから帯域制限を食らうので注意してください。