Page History

Restamp

hayashi edited this page on 26 Dec 2020

Clone this wiki locally

ReStamp

3. 連番JPEGファイルに撮影時刻を割り付ける

生成された連番JPEGファイルに撮影時刻を書き込む必要が有ります。

私の自作したソフトウェア Restamp(Movie2jpg) を使って連番JPEGのファイル更新日時を撮影時刻に変換する方法を紹介します。

retime.png

3.1 仕組み/原理

  • 一定間隔で撮影された連番ファイルの任意の2枚の撮影時刻を設定します。
  • 2枚の中間にあるファイルの数を数えて、各ファイルの撮影間隔を精確に算出します。
  • 算出された撮影間隔と2枚の撮影時刻を元に、他のすべての撮影時刻を算出し、JPEGファイルのファイル更新日時(updatetime)を撮影時刻に書き換えます。

retime2.png

もし、カメラの時刻合わせに失敗していたり、時間ウォーターマークを設定し忘れた場合は、撮影時刻推定方法 を参照してください。

時間ウォーターマークが設定されている場合は、下記の方法で抽出されたイメージファイルに撮影時刻を設定することができます。

3.2 時間ウォーターマークを使ったファイル更新日時の再設定

  1. imgフォルダの画像を画像ビューワなどで開き、画像のウォーターマークを読み取る(最初の方のファイルを選択する) TimeWaterMark01.png

  2. 同様にして、もうひとつの別の画像のウォーターマークを読み取る(最後の方のファイルを選択する)

  3. コマンドラインを作る

コマンドライン:

 * 動画から一定間隔で切り出した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ファイルのファイル更新日時が「撮影日時」に書き換わります。


4. GPSログとJPEGの更新日付を付きあわせてJPEGのEXiFに位置情報を書き込む

adjustGPX1.png

撮影日時がファイルの更新日時に設定されると、GPXファイルとファイル更新日時を付きあわせてJPEGのEXIFに書き込む方法は無数に有ります。 使い慣れたツールを使って JPEGファイルのEXiF情報に位置情報を書き込んでください。

adjustGPX2.png

4.1 AdjustTime2を使う

ここでは 私の自作ツールを使ってEXiFに位置情報を書き込む方法を説明します。

  1. Java実行環境をインストールしてください。インストール方法は割愛します。

  2. AdjustTime2をダウンロードする

  3. ダウンロードした ZIPファイルをホームディレクトリ(~/AdjustTime2)に展開する

  4. コマンドを叩いて 起動する Terminal (Windowsの場合はDocker Quickstart Terminal)に下記コマンドを打ち込む

  cd ~
  cd AdjustTime2
  chmod +x AdjustTime2.sh
  ./AdjustTime2.sh
  1. AdjustTime2 の画面が開いたら、「選択」ボタンを押して連番JPEGファイルが格納されているフォルダを対象フォルダフィールドにセットする → 「次へ」 Screenshot01.png
  1. 「選択」ボタンを押して任意のファイルを選択する → 「基準時刻画像」にファイルが選択される Screenshot03.png → 「次へ」

  2. そのまま「次へ」 Screenshot04.png

  3. 既に撮影時刻が設定されているので、そのまま「次へ」 Screenshot05.png

  4. GPXフォルダ に「~/Movie2jpg-master/mapi/gpx」をセットして、「次へ」 Screenshot06.png フォルダを設定した時は、そのフォルダ内のすべてのGPXファイルをひも付けの対象とします。 GPXファイルを指定した時は、指定されたGPXファイルのみひも付けの対象とします。

  5. 書き出しフォルダ に「~/Movie2jpg-master/mapi/gpx」をセット Screenshot07.png

    • [x] 「EXIFの変換をする」にチェックをつける
  6. 「処理実行」ボタン Screenshot08.png 「実行」ホタン

  7. 処理が終わったら「閉じる」ボタン

  ~/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 に作成されます。


6. カメラとGPSロガーとのタイミング調整を行う

カメラもGPSロガーも正確な時刻と同期させていれば 撮影時刻=GPS位置 が一致するようにみえますが、実際には カメラとロガーとの相性の関係によって、組み合わせによっては2〜6秒ほどのズレが生じます。

次にこのズレの補正方法を示します。

  1. Java実行環境をインストールしてください。インストール方法は割愛します。

  2. JOSMをインストールしてください。インストール方法は割愛します。

  3. JOSMを起動する

  4. JOSMに「EXIFが作成されたフォルダ`/mapi/gpx/XXX」内のすべてのファイルをドラッグ&ドロップする JOSM01.png

  5. JOSMの[メニュー]→[画像]→[お好みの背景画像]を選びます。この例では「Bing航空画像」を選んでいます JOSM02.png

  6. ルート履歴から交差点で曲がっている箇所を探します JOSM03.png

  7. 交差点近傍の写真からGPSロガーとのズレを確認します。この例ではカメラ側の時間が5秒遅れています JOSM04.png

  8. AdjustTime2 の撮影時刻設定画面に戻って、設定時間に「5秒」加えた値を設定して、再実行します JOSM05.png

  9. 再度、JOSMを起動して「EXIFが作成されたフォルダ`/mapi/gpx/XXX」内のすべてのファイルをドラッグ&ドロップする JOSM01.png

  10. 交差点近傍の写真の位置を再度確認します JOSM06.png

    • 横断歩道のゼブラが足元にあることを確認できます。

8. 不要なイメージを削除する

Mapillary-toolsでも重複画像を削除する機能は有りますが、絶対にアップしたくないヤバイ画像や信号待ち等の画像は手動で削除してしまいましょう JOSM07.png

  • この例では高架下で信号待ちをしたせいでGPSの奇跡が大きくズレています。停止中の画像はすべて削除してしまいましょう。

9. 'Mapillary-tools'を使ってMapillaryに一括大量アップロード

upload.png

元ネタはここから引用しています

ここでは Docker を使った方法を紹介します。

9.1 mapillary.sh のセットアップと再ビルド

Docker 'mapillary_tools'

'mapillary_tools'は Dockerイメージ 'haya4/Movie2jpg' に含まれています。 初回に限りmapillary.shのセットアップが必要です。

  1. テキストエディタを使って~/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に設定してください。

mapiProfile

  • MAPILLARY_EMAIL Mapilarry にログインする時に使っているメールアドレス
  • MAPILLARY_PASSWORD パスワード
  • MAPILLARY_USERNAME ユーザー名
  • MAPILLARY_PERMISSION_HASH
  • MAPILLARY_SIGNATURE_HASH
  1. Terminal (Windowsの場合はDocker Quickstart Terminal)に下記コマンドを打ち込む (rebuild)
  cd ~/Movie2jpg-master
  docker build -t movie2jpg .

9.2 'mapillary_tools'の設定

~/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」フォルダに重複ファイルが置かれる

9.3 Docker 'mapillary_tools'の実行

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
  #     :
  #

mapiup.png

これで Mapillary へのアップロードが完了しました。

調子にのってガバガバアップロードしてると契約しているインターネットプロパイダから帯域制限を食らうので注意してください。