Splatoonのインク面積判定を画像から行う

f:id:ehu_J:20180719214055j:plain
こんにちは!ehu-151です。

第一記事目は「Splatoonのインク面積判定」をリザルト画面から行ってみました。青陣が何%、黄陣が何%と、なるようなプログラムを作りました。さて、みなさんが気になるのは、その前処理、計算方法、ロジックと求めた面積はどのくらいリザルト画面の結果と違うのか?だと思います。まずは、その計算方法から…、それではいってみましょう。

その前にGithub
github.com

言葉の定義

まず、言葉の定義から、
マップ画面:リザルト画面をスクリーンショットで撮った生の画像
ステージ:イカリング(プレイヤーの操作するキャラのこと)達が戦う戦場です。マップ画面で見ると白い枠で囲われております。インクを塗る場所であり、枠の外に出ると場外となり、イカリングはリスポーン(初期位置)に戻ります。

前処理

ます、画像を計算しやすいように加工します。

  • ステージを切り取る

f:id:ehu_J:20180719214055j:plain

※先にお断り:リスポーン地点円の面積は取得できていません。

ステージを切り取るには、マップ画像から白い枠の周囲が一番長い内側だけを切り取ります。どうして、一番長いかというと、マップ画像にはバックに薄い黒のレイヤーの下にインクが表示されたりします。もし、そのインクが白色だったら、インクを白い枠と認識してしまいます。黒いレイヤーがあるから、明るさでフィルターをかけることができますが、確実ではありません。
そして、マスク画像を生成します。

f:id:ehu_J:20180719214210j:plain

ここまでで、ステージの切り取りができました。次に色の面積を求めたいと思います。

HSV色空間で求める

全然大した計算方法ではありませんので悪しからず。
f:id:ehu_J:20180719194807p:plain
Wikipedia contributors. "HSV色空間." Wikipedia. Wikipedia, 3 Jul. 2018. Web. 3 Jul. 2018.
*1

まず、ステージ画像の色相(Hue)を求め、グラフ化します。
f:id:ehu_J:20180720191719p:plain
※0~180の範囲で色相が表されています。
グラフを見るに、とびぬけて高い二か所がインクの色と分かります。ここから、さらに極大値を求め、インクの色を決定します。

インクの色を指定(ただし段差で色が濃くなっている部分があるので範囲を持たせる)して、面積を出力します。

f:id:ehu_J:20180720191759j:plain
出来ました。あとは、ステージの面積を求め、割るだけですね。

53%と28%ですね。スプラトゥーンの結果はどうなっているのでしょうか?
f:id:ehu_J:20180720192553j:plain

全然違う!!

原因を探る

どうしてでしょうか?改めてもう一度、加工途中の画像を見てみましょう。
f:id:ehu_J:20180720191759j:plain
もうお分かりですね。

  • リスポーンの色が抜けている
  • 金網が色の上にあるせいで色が抜けている

そこで、リスポーン地点の面積を足し再度計算しました。

だめでした。さっぱりです。金網があるせいでこれ以上やっても意味がないのでここら辺で終わりとさせていただきます。

ありがとうございました。