LoginSignup
6
7

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-06-24

はじめに

全国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)

こちらを実行するとこうなります。

処理前

113Chansey.png

処理後

113Chansey_gray.png

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()

実行結果

正解

デモ.mov.gif

失敗

デモ_失敗.mov.gif

参考文献

謝辞

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
7