SikuliXで複数の異なる画像を一括検索!findBest(), findAny()の使い方

SikuliXで複数の異なる画像を一括検索!findBest(), findAny()の使い方

こんにちは、業務自動化ツール開発担当の吉池(@valmore_myoshi)です。

SikuliXを使ってパソコン画面上の画像を検索するにはRegion.find()やRegion.findAll()があります。画像を1枚だけ指定すれば、画面上で一致したMatchを返してくれます。

しかし、検索したい画像が複数の場合はどうでしょう。Region.find()では画像を一枚しか指定できないので、複数の場合は対応できません。

そこで本記事では、複数の異なる画像を検索できるRegion.findBest(), Region.findAny()の使い方を解説します。これらを使いこなせれば、画像検索の幅が広がるのでぜひマスターしましょう!

1枚の画像を検索するならRegion.find()

複数の異なる画像検索の前に、1枚の画像検索をおさらいしましょう。画像を1枚だけ検索する場合はRegion.find()を使います。

reg = selectRegion()
m = reg.find("someVisual.png")

一方、指定した画像に一致するパターンをパソコン画面上から複数検索する場合はRegion.findAll()を使います。指定した画像に一致したパターンをリスト形式のMatchとして返します。

reg = selectRegion()
matches = reg.findAll("someVisual.png")

複数の異なる画像を検索する方法

それでは、複数の異なる画像を検索する方法を見ていきましょう。検索方法は大きく分けてRegion.findBest()Region.findAny()の2つあります。

サンプル画像として下記の画像を使います。本記事と同じ手順で試したい方はこちらから画像をダウンロードできます。

類似度が最も高いものだけを返すRegion.findBest()

Region.findBest()は指定した複数の異なる画像のうち、類似度が最も高いものをMatchとして返します。例えば、上記のサンプル画像を加工し、元画像と合わせて4種類の画像を用意して試してみます。

複数の異なる画像

Region.findBest()に4種類の画像を指定し、パソコン画面上にいずれかの画像を表示して実行すると一番マッチする元画像が返されます。マッチした画像を調べるにはMatch.getIndex()を使います。

実行結果は下記のとおりです。元画像をパソコン画面上に表示して実行しているので類似度が最も高いimg0が返されます。

パソコン画面上に表示する画像を切り替えてRegion.findBest()を実行した結果は下記の動画でご覧いただけます。画像を切り替えるとマッチする画像も変わることがわかります。

Region.findBest()に似たメソッドにRegion.findBestList()がありますが、指定する引数がリストになるだけで機能は同じです。

類似度が閾値を超えたものをすべて返すRegion.findAny()

類似度が閾値を超えたものをすべて取得するときはRegion.findAny()を使います。検索したい画像を複数指定して実行すると、画面上で一致したMatchをリスト形式で取得できます。

例えば、下記コードではサンプル画像を4つ指定しています。結果として4つのMatchをリスト形式で取得できました。

Region.findAny()の実行結果
実行結果

Region.findAny()に似たメソッドとしてRegion.findAnyList()がありますが、引数がリストになっただけで機能は変わりません。

まとめ

複数の異なる画像を検索できるRegion.findBest(), Region.findAny()の使い方を解説しました。Region.find()は1枚の画像検索に役立ちますが、複数画像となると対応できません。

1枚だけでなく、複数の状態変化を感知したいときにも使えます。検索処理一つとってもさまざまなメソッドがあるので、状況に応じて使い分けましょう!