2D動画から2Dマップを自動生成する (movie2map)

#movie2map
movie2mapは、縦横にスクロールしながら移動する2D動画から自動的に2Dマップを自動生成するツールです。
2Dでスクロールするタイプのゲームをやっていて、保存した動画から自動的に全体マップが作れたらいいのに、と思って検索したのですがそういうツールが見つかりませんでした。
たまたま仕事でAI関連の勉強をしていてPythonのNumpyの行列演算に触れていたので、やりながら学習できればと一石二鳥を兼ねてそういうツールを作ってみようと思い、やってみたらできました。
このページではインストールの仕方や使い方を説明します。
##システム要件
* Python 3.7 or 2.7
* Numpy
* OpenCV for python
* Windows or Linux OS  

## デモ
どのように変換できるか説明のために、変換例を載せます。
以下が変換前の動画です。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">2D動画から2Dマップを生成する、movie2map のデモ用動画です。<br>qiitaに動画が張れないので、ツイートに載せます。<br>このような2D動画から、2Dマップを生成します。<a href="https://twitter.com/hashtag/movie2map?src=hash&amp;ref_src=twsrc%5Etfw">#movie2map</a> <a href="https://t.co/kq0OgjPEjX">pic.twitter.com/kq0OgjPEjX</a></p>&mdash; ぺんしる@ohol (@ohol23057722) <a href="https://twitter.com/ohol23057722/status/1104683816013029381?ref_src=twsrc%5Etfw">2019年3月10日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

上記の動画から、変換して生成された2Dマップが以下になります。
変換時間は v1.0-beta版で 5分6秒でした。v2.0-beta版で3分でした。大きすぎるので1/4にサイズ変更しています。
![2019_02_28_11_53_18.mp4.4bunno1.png](https://qiita-image-store.s3.amazonaws.com/0/284812/023b791d-5929-f87d-ddc9-6b8b56473680.png)

特定のゲームに特化しているわけではないので、上下左右にスクロールする2Dの動画であれば、たいていは対応できます。
![map_dq1by4.png](https://qiita-image-store.s3.amazonaws.com/0/284812/85f5ae98-dcda-284b-b53a-8bebbd48e017.png)


###注意点
移動量の検知ロジックの都合で、黒枠がついた動画の場合移動検知に失敗します。
その場合はオプション指定で、スクロールエリアのみを対象範囲とするよう、-x -y -width -heightパラメータを追加してください。
またキャラクターや背景の黒い輪郭を移動検知のキーにしていますので、黒い輪郭が全くないパステルな画像だと移動量が検知できないかもしれません。

## インストール手順
1. Python、numpy、OpenCVをインストールします。 既にインストール済みの場合は不要です。これらのインストールの仕方は後述します。  
2. https://github.com/pensil-jp/movie2map を開き、 [Clone or download]をクリックして、[Download ZIP] をクリックして、 movie2map-XXXXX.zip をダウンロードします。
![WS000082.JPG](https://qiita-image-store.s3.amazonaws.com/0/284812/bdd8f959-a206-d38b-3ce3-61726bef25e6.jpeg)  
3. movie2map-XXXXX.zipをコンピュータに解凍します。
4. Windowsの場合 :  
   メモ帳などで movie2map.bat を開き、PYTHON= の部分にpython.exeの場所を入力します。python.exeが環境変数PATHに含まれている場合、この手順は不要です。  
   Linuxの場合 :  
   chmod + x movie2map.sh を実行して実行権限を付与します。  

## 使い方
* Windowsの場合 :  
  movie2map.bat [オプション] [ファイル名]  
  動画ファイルをmovie2map.bat にドラッグ&ドロップしても実行できます
* Linuxの場合 :  
  ./movie2map.sh [オプション] [ファイル名]  
![WS000067.JPG](https://qiita-image-store.s3.amazonaws.com/0/284812/6fec782a-6098-d2a4-7e89-96d10d45a886.jpeg)  
そのままお待ちください。 
しばらくすると静止画像（[ファイル名].png）が完成します。

### 起動オプション
| オプション       | 説明                                               | デフォルト値 |
|:----------------|:--------------------------------------------------|:-----------:|
|  -h, --help     | ヘルプ表示                                         |            |
|  -o OUTPUT      | 出力ファイル名                                      | (入力ファイル名).png |
|  -m MASK        | マスクファイル　別に用意する場合のみ指定する           |     |
|  -s START(sec)  | 開始位置(秒)                                      |          0 |
|  -e END(sec)    | 終了位置(秒) 0にすると全て解析します |  180 |
|  -r RATE        | 解析フレーム間隔 小さくすると精度が上がりますが時間がかかります | 15 |
|  -c COUNT       | サンプリング数(1000～5000) 多いほど精度が上がりますが時間がかかります | 1500 |
|  -b BRITENESS   | サンプリング閾値(20～128) 指定数より暗いポイントを識別します | 50 |
|  -d DEPS        | 畳み込み範囲(2～5) 変更する必要はありません | 4 |
|  -test          | 比較テスト画像をworkフォルダに出力します 動作チェック用 |  |
|  -x XPOS        | 開始左座標 |  0 |
|  -y YPOS        | 開始上座標 |  0 |
|  -width WIDTH   | 幅 | 動画の幅 |
|  -height HEIGHT | 高さ | 動画の高さ |
|  -p COMPRESSION | 画像リサイズ率 1にすると原寸で処理 | 0.5 (半分) |

## 使用ツール類のインストール手順(Windows)
利用ツール類のインストールがちょっとハードル高いので、インストール方法をまとめました。

###Pythonのインストール
1. https://www.python.org/downloads を開き、Looking for a specific release? の下の Python 3.7.2 の右にある Download をクリック  
![WS000068.JPG](https://qiita-image-store.s3.amazonaws.com/0/284812/0e588c3d-1a4b-abea-00ae-cb28a6d378e6.jpeg)
2. ページ下部にある、Windows x86-64 executable installer(32ビットOSの場合は Windows x86 executable installer) をクリックしてインストーラをダウンロードする  
![WS000069.JPG](https://qiita-image-store.s3.amazonaws.com/0/284812/68693c80-3dd6-8020-8500-5760080ab0ff.jpeg)
3. インストーラを起動してインストール開始する。下のAdd Python 3.7 to PATH のチェックをONにしてから Install Now を押す。インストール中に、デバイスに変更を加えることを許可しますか?と聞かれたら「はい」を押す  
![WS000071.JPG](https://qiita-image-store.s3.amazonaws.com/0/284812/aea7cbd5-0f02-8647-0875-27fd925287f7.jpeg)
4. パスを通す設定にしてインストールしたので、バッチファイルのパス設定の修正は不要ですが、もしチェックをオフのままインストールしてしまった場合は、以下の設定を書き換えてください。  
![WS000073.JPG](https://qiita-image-store.s3.amazonaws.com/0/284812/914df0ac-b888-9dee-7ce7-db123ea285ab.jpeg)

###numpy のインストール
1. https://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy を開いて、numpy‑1.16.2+mkl‑cp37‑cp37m‑win_amd64.whl (32ビットの場合は numpy‑1.16.2+mkl‑cp37‑cp37m‑win32.whl) をダウンロードする  
![WS000074.JPG](https://qiita-image-store.s3.amazonaws.com/0/284812/1d13c010-faa8-bdb5-16a1-c56ded85642a.jpeg)
2. コマンドプロンプトを「管理者として実行」で起動しする。  
![WS000077.JPG](https://qiita-image-store.s3.amazonaws.com/0/284812/327e2a85-8f40-2a90-036a-53d969872d5f.jpeg)
3. pip install [ダウンロードしたファイル名] を実行する。  
![WS000079.JPG](https://qiita-image-store.s3.amazonaws.com/0/284812/c521c8e0-614a-5a0f-3a55-dd2cb0bee2f2.jpeg)  

###OpenCV のインストール
1. https://www.lfd.uci.edu/~gohlke/pythonlibs/#opencv を開いて、opencv_python‑4.0.1‑cp37‑cp37m‑win_amd64.whl (32ビットの場合は opencv_python‑4.0.1‑cp37‑cp37m‑win32.whl) をダウンロードする  
2. コマンドプロンプトを「管理者として実行」で起動しする。
3. pip install [ダウンロードしたファイル名] を実行する。

以上でインストール完了です。