【ポケモン剣盾】高個体値量産!?特徴点抽出による孵化判定【裏技】
皆さんは高個体値のポケモンを量産する方法をご存知でしょうか?
実は,とある方法を実践するだけで高個体値・色違いを量産する方法があるって知ってましたか?
方法もすごく簡単で,卵が産まれているかどうかを画像処理によってお姉さんのポーズを識別するだけ!!!
ACCELERATED-KAZE FEATURES
前述の通り,お姉さんがどのようなポーズ取っているかを識別することによって卵が産まれているかが判定可能です. なので,お姉さんの胸部画像(図1)の特徴点とゲーム画面の特徴点をマッチングすることによってポーズの識別をします. 特徴点抽出には,AKAZEを利用しました.
特徴点に使いたい画像の範囲はかなり狭いため(図2),そのままの状態で特徴点抽出をしてもうまくいきません. そのためいくつか,前処理とAKAZEのパラメータを調整しています.以下にそれらを示します.
- 画像の大きさを2倍にする
- AKAZEのパラメータ変更
- nOctaves=2:解像度が高くないため
- nOctaveLayers=3:解像度が高くないため
- descriptor_type=cv2.AKAZE_DESCRIPTOR_KAZE_UPRIGHT:マッチング対象が回転しないため
この結果得られるマッチング画像を図3に示します. きれいにマッチングできてると思います. また,お姉さんが腕を組んでいなかったり,お姉さんが画面に写ってない場合は,特徴点がマッチングしませんでした. そのため,マッチングした特徴点の数を数えるだけで卵が産まれているかどうかの判定ができそうです*1.
特徴点抽出とそのマッチングを行っているコードを抜粋したものを次に示します.
# 画像の拡大 def expand(self, img, times, interpolation=cv2.INTER_CUBIC): ret_img = cv2.resize(img, None, interpolation=interpolation, fx=times, fy=times) return ret_img # マッチングした特徴点の数を返す def match_by_akaze(self): src = cv2.imread("キャプチャ画像", 0) img1 = self.expand(img1, 2) img2 = cv2.imread("テンプレート画像のファイル", 0) img2 = self.expand(img2, 2) akaze = cv2.AKAZE_create(nOctaves=2, nOctaveLayers = 3, descriptor_type=cv2.AKAZE_DESCRIPTOR_KAZE_UPRIGHT) kp1, des1 = akaze.detectAndCompute(img1, None) kp2, des2 = akaze.detectAndCompute(img2, None) bf = cv2.BFMatcher() matches = bf.knnMatch(des1, des2, k=2) # 距離がある程度近いやつを採用 good = [] for m, n in matches: if m.distance < 0.6 * n.distance: good.append([n]) good = sorted(good, key=lambda x: x[0].distance) good = good[:30] return good
おわりに
いかがでしたか?
今回は,高個体値の色違いを厳選する方法を紹介しました! みなさんもぜひ理想のポケモンをゲットしてくださいね!!
*1:経験的に6以上マッチングしてれば産まれていると判定して良さそうです