マンキーでもわかるポケモンシルエットクイズの作り方

# はじめに
**全国1億2623万人の布袋寅泰ファンの皆さん、こんにちは**
@garnetddolphin と申します。
普段は[お城とさくらとりんごのまち](http://www.city.hirosaki.aomori.jp/)でエンジニアをしています。
皆さんはポケモンはお好きですか？
性別問わず、多くの方が一度はプレイした/見たことがある作品なのでは無いでしょうか。
この記事ではそんなポケモンのアニメで、CMカット時に流れていた
「このポケモンだーれだ？」を実装してみたので手順も含めて紹介します。

# 開発環境
- Mac OS X 10.14.5
- Python 3.7.3
- OpenCV 4.1.0

# ソース
https://github.com/garnetddolphin/pokemon_silhouette_quiz

# 実装
## ポケモンの画像を取得
Githubに画像をあげていらっしゃる方から拝借しました。
今回は初代151匹のみ出題していくことにします。  


## 画像から輪郭を抽出
**`/path/to/dir/` は各自読み替えてください。**  

```python:gray.py
import cv2
import os

# パス
import_path = '/path/to/dir/pokequiz/images'
export_path = '/path/to/dir/pokequiz/gray'

# ディレクトリ読み込み
for filename in os.listdir(import_path):
	# 画像ファイル取得
	if os.path.isfile(os.path.join(import_path, filename)):

		# 画像ファイルをグレースケールで読み込み
		image_path = 'images/' + filename
		img = cv2.imread(image_path, 0)

		# 平坦化
		gray = cv2.GaussianBlur(img,(11,11),0)

		# 二値化
		ret, img_thresh = cv2.threshold(gray, 50, 255, cv2.THRESH_BINARY)

		# 二値化した画像の保存
		filename = filename.replace('.png','_gray.png')
		image_export_path = 'gray/' + filename
		cv2.imwrite(image_export_path,img_thresh)
```

こちらを実行するとこうなります。
### 処理前
![113Chansey.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423133/005e6fba-7352-63db-7476-c007f7fb1987.png)
### 処理後
![113Chansey_gray.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423133/35af5602-92d3-8b19-bdc9-750c3dff2d52.png)



## jsonファイルの作成
```python:createJson.py
import glob
import os
import json

os.chdir('/path/to/dir/pokequiz/gray/')

index = 0
file_list = sorted(glob.glob('*.png'))
data = {}
for i in range(len(file_list)):
	data[i+1] = {
		"image": file_list[i],
		"name": ""
	}

os.chdir('/path/to/dir/pokequiz/')
name_json = open('name.json', 'w')
json.dump(data, name_json, indent=2)
```
こちらを実行し、シルエットクイズの答え(ポケモンの名前)を入力します。

```json:name.json
{
  "1": {
    "image": "001Bulbasaur_gray.png",
    "name": "フシギダネ"
  },
  "2": {
    "image": "002Ivysaur_gray.png",
    "name": "フシギソウ"
  },
  "3": {
    "image": "003Venusaur_gray.png",
    "name": "フシギバナ"
  },
  "4": {
    "image": "004Charmander_gray.png",
    "name": "ヒトカゲ"
  }
  .
  .
}
```

## クイズ出題
ここまでできたら、`name.json`の中からランダムにポケモンを出題して上げればOKです。

```python:quiz.py
import sys
import random
import glob
import os
import json
import matplotlib.pyplot as plt
import cv2

# 1~151の間でランダムに選ぶ
rand = random.randint(1,151)

# name.jsonの読み込み
f = open('name.json', 'r')
jsn = json.load(f)


# 出題する画像の読み込み
os.chdir('/path/to/dir/pokequiz/gray/')
image_file = jsn[str(rand)]["image"]
img = cv2.imread(image_file)
cv2.namedWindow('image', cv2.WINDOW_AUTOSIZE)
cv2.imshow('image',img)
cv2.waitKey(0)


answer = input("だーれだ？ >> ")
if answer == jsn[str(rand)]["name"]:
	print("正解")
else:
	print("残念  正解->" + jsn[str(rand)]["name"])

cv2.destroyAllWindows()
```

# 実行結果
## 正解
![デモ.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423133/0c39ea85-04f1-a413-6faa-a4101692d77d.gif)

## 失敗
![デモ_失敗.mov.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423133/1e71b621-0d1c-ed63-787b-aff2b1d02a23.gif)

#参考文献
- https://qiita.com/tokkuri/items/ad5e858cbff8159829e9
- https://qiita.com/YosukeItabashi/items/5722395218e6e592fd39

#謝辞
- この世にポケモンを生み出してくれた任天堂様、ありがとうございます。
- 布袋寅泰さま。開発中、最高のBGMでした。BEAT SWEETは依存性ある...