はじめに
全国1億2623万人の布袋寅泰ファンの皆さん、こんにちは
@garnetddolphin と申します。
普段はお城とさくらとりんごのまちでエンジニアをしています。
皆さんはポケモンはお好きですか?
性別問わず、多くの方が一度はプレイした/見たことがある作品なのでは無いでしょうか。
この記事ではそんなポケモンのアニメで、CMカット時に流れていた
「このポケモンだーれだ?」を実装してみたので手順も含めて紹介します。
開発環境
- Mac OS X 10.14.5
- Python 3.7.3
- OpenCV 4.1.0
ソース
実装
ポケモンの画像を取得
Githubに画像をあげていらっしゃる方から拝借しました。
今回は初代151匹のみ出題していくことにします。
画像から輪郭を抽出
/path/to/dir/
は各自読み替えてください。
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)
こちらを実行するとこうなります。
処理前
処理後
jsonファイルの作成
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)
こちらを実行し、シルエットクイズの答え(ポケモンの名前)を入力します。
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です。
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()
実行結果
正解
失敗
#参考文献
- https://qiita.com/tokkuri/items/ad5e858cbff8159829e9
- https://qiita.com/YosukeItabashi/items/5722395218e6e592fd39
#謝辞
- この世にポケモンを生み出してくれた任天堂様、ありがとうございます。
- 布袋寅泰さま。開発中、最高のBGMでした。BEAT SWEETは依存性ある...