Hello Wor.log

IT系大学生4人による備忘録のようなもの

ポケモンのアイコンを識別するやつ(2)

CPPXのXです。

下記のパーティ切り取り部分を説明しようかと思います。

cppx.hatenablog.com

このソースコードについて説明していきたいと思います。

これの左から右に加工するまでの手順です。 f:id:cppx:20180830015715p:plain

では、目次です。

環境

説明

ポケモンのアイコンを識別するやつ(1)にも書きましたが、だいたいの流れはこのような感じです。

エッジ検出して、輪郭とって、輪郭の大きさと内部の色合いから相手のパーティ切り取って、矩形の傾きを修正して、そこまでいくとアイコン座標が固定なので、座標決め打ちで切り取ります。

以下の画像に対して操作を行なっていきます。
名前部分が隠れていますが、実際には隠れてないものを使います。 f:id:cppx:20180830011813j:plain

エッジ検出

get_contourの中での処理です。

パーティ枠が黒いので2値化してエッジを検出します。 f:id:cppx:20180830011638p:plain

流石にくっきりはっきり出てきています。

輪郭取得

取得したグレースケール画像に対して、輪郭検出を行います。
opencv便利ですね。

検出した輪郭領域から、面積がある程度でかいものに絞り込みます。
今回は気分で60,000よりでかいものにしました。
比率とかにすれば良かったのですが、サクッと試したかったのでひとまず自分のカメラ解像度に合わせて決め打ちです。

取得した輪郭からバウンティングボックスを作成して、領域内の色合いを見ています。

今回は、敵パーティが知りたいので、一番赤い成分が多いものを用います。

画像の回転

写真を取る人次第で、パーティ画像が傾くので、傾きを修正します。

取得した相手パーティのバウンティングボックスを用いて、傾きを計算します。

まず、1点決めて、隣接した点までの距離を計算します。
短い方を取得して、線分の傾きが平行になるように画像を回転させます。

その後、もう1回輪郭検出して、得られたバウンティングボックスで切り取るとパーティ部分が切り取られます。

f:id:cppx:20180830013715p:plain

上記は、trimming関数にパーティ画像とredを与えた結果です。
いい感じです。

短い線分は上辺か底辺なのですが、どちらなのかわからないので、写真の撮り方によってはパーティ画像が逆さまになります。
この問題点は機械学習でごまかしています。

ちなみに、blueを与えると自分のパーティ画像を取得できます。

アイコンの切り抜き

アイコンの座標は固定なので、決め打ちで切り抜いていきます。

名前部分の幅が、だいたい画像の1/7です。
その分を引いてから、縦に3等分、横に半分で切り抜いていくだけです。
識別するときにレベル表記が邪魔なのと、アイコンが大きめに映って欲しいため、固定値で若干端っこを切り落としています。

f:id:cppx:20180830014508p:plain

上記は、get_pokemon_imgsにパーティ画像を与えた結果です。

いい感じに切り取れました。

これにてアイコンの切り抜き完了です。

おわり

このアイコンは学習時には使いません。

アイコンにラベル付けをする手間を行いたくないため、訓練データはこのような生データf:id:cppx:20180827092117p:plainだけを使います。

次の記事では、アイコンを識別していく処理の説明を行おうかと思います。

他の記事
ポケモンのアイコンを識別するやつ(1)
ポケモンのアイコンを識別するやつ(2) now
ポケモンのアイコンを識別するやつ(3)