2022-09-18

Sikulixでウマ娘のステータス情報を読み取る

Sikulixは画像を検出してクリックなどの操作を自動化できるツールです。お仕事やゲームなどのパソコン上の操作を自動化する便利ツールです。

画像の検出とクリックの繰り返しだけであれば SikuliXの汎用的な自動周回用スクリプト・改のように操作したい画像を用意してやれば可能です。

しかし、変化する情報から次の操作を決定するような場合は、単純な画像検索ではなく、表示内容を読み取ることが必要になります。

Sikulixには、画面上の文字情報を認識するOCR機能が組み込まれているため簡単に分析が可能です。

サンプルとして、ウマ娘のゲーム画面からステータス情報を読み取る仕組みを構築してみます。

ウマ娘のステータス情報を読み取る


ウマ娘はトレーニングによりステータスが上昇していきます。同じトレーニングのみを選択するのであれば単純に画像検索のみで実現可能ですが、まともにゲームを進めることができません。(スピードだけ上げればよいバクシン的な娘もいますが。

不足しているステータスに対するトレーニングを選択するためには、現状のステータスがどのようになっているか認識する必要があります。ここで、SikulixのOCR機能が使えます。

Sikulixでステータス情報を読み取る

SikulixのOCR機能を使い、ウマ娘のゲーム画面上からステータス情報を読み取ってみます。

OCR機能の使い方は簡単で、文字を認識させたい領域オブジェクト「Region」を作成し、「text()」メソッドを呼び出すだけです。


# 文字列検出させる領域を設定
r = Region(35,520,380,35)
# OCRを実行しログ出力
print(r.text())

Regionで指定してる領域には以下情報が表示されています。


text()の結果得られる文字列は以下。

(225 F119 GP Ss! fp 144i pp 124) 131°


部分的に数値を検出できていますが、関係ない部分も無理やり文字として読み取ってしまっています。

読み取り処理の改善

ゲーム画面などは多様なフォントやデザインからなる画面になっているため、標準的なOCRだとうまく認識されませんでした。

ですので、ステータスの数値の領域のみOCR対象にする必要があります。

# 文字列検出させる領域を設定
r_spd = Region(59,522,36,15)
r_stm = Region(123,522,36,15)
r_pow = Region(187,522,36,15)
r_gut = Region(251,522,36,15)
r_int = Region(314,522,36,15)

# Region確認のためハイライトさせる
r_spd.highlight()
r_stm.highlight()
r_pow.highlight()
r_gut.highlight()
r_int.highlight()
sleep(5)

# OCRを実行しログ出力
print(r_spd.text())
print(r_stm.text())
print(r_pow.text())
print(r_gut.text())
print(r_int.text())

文字列検出させる領域をハイライトさせたときの画面は以下。




実行結果は以下。

225
119
155
144
124


うまく読み取れました。

文字列として読み取れますので、これを数値に変換して「目標値以下なら~」といった条件分岐が可能になります。

まとめ

ウマ娘のステータス情報の読み取りを例にSikulixのOCR機能について記載しました。

標準では英数のみの読み取りのみサポートされています。

日本語の読み取りは日本語用OCRライブラリを導入することで可能となりますが、ゲーム画面などは誤検出が多く、また応答が返ってこなくなるなど不安定でした。

英数のみであっても、画面全体を一度に認識させると誤認識も多いです。

このため、サンプルでは認識したい文字がある領域だけを認識させることで、目的の文字列を読み取るようにしました。

画面上の情報を条件判定に使えるようになることで複雑な条件分岐ができるようになると思います。