画像認識の設定と実行 - x0oey6B8/KeyToKey-Web GitHub Wiki
- 概要
- 画像認識の設定の大まかな流れ
- 画像認識の設定を作成する
- C#スクリプトで画像認識を実行する
- ブロックマクロで画像認識を実行する
- アクションマクロで画像認識を実行する
- テンプレート画像の選択について
- 特定のウィンドウで画像認識
画像認識はテンプレート画像に類似する画像が指定した探索範囲にあるかどうか探します。
画像認識の結果(スコア)が自分で指定したスコア以上の場合に類似するかどうかを判断します。
基本的に画像認識の設定はマクロ上で行わず専用の設定画面で行います。
画像認識はフルスクリーンモードでは正常に動作しません。
ウィンドウモード・ボーダレスモード(仮想フルスクリーン)で使用してください。
- 画像認識の設定を作成する
- テンプレート画像を設定する
- 探索範囲を設定する
- テストを行いスコア(類似度)を設定する
ホーム、もしくは左側のアイコンから「画像認識/設定」を開きます。
「新しい設定」をクリックします。設定が追加されると同時に設定画面が開きます。
初めにテンプレート画像を選択する必要があります。
テンプレート画像の選択方法には下記のようなものがあります。
具体的な説明についてはテンプレート画像の選択についてを見てください。
方法 | 説明 |
---|---|
画像をファイルを選択 | テンプレート画像がすでにある場合はこちらを使用します。 |
撮影 | 赤枠をテンプレート画像にしたい対象に合わせ、Enter キーを押すことで撮影することができます。 |
クリップボードの画像を保存+選択 | Win+Shift+S キーでテンプレート画像にしたい対象を撮影することでクリップボードに画像がコピーされます。 その画像を保存し、テンプレート画像として使用します。 |
画像を切り抜く | 既にある画像ファイルやクリップボードの画像から特定の部分を切り抜きテンプレート画像として使用することができます。 |
お好きな方法でテンプレート画像を作成・設定してください。
識別キーは画像認識の設定項目を識別するための文字であり、画像認識を実行する際に使用されます。
テンプレート画像を選択すると、テンプレート画像のファイル名が識別キーになります。
変える必要は基本ありませんが、他の設定の識別キーと重複する場合は変えてください。
設定方法には以下のようなものがあります。
方法 | 説明 |
---|---|
座標と範囲を選択 | 赤い枠をしようして座標と範囲を決定することができます。 テンプレート画像が小さい場合は、赤い枠も小さく表示されるので注意してください。 座標と範囲が決まれば、Enter キーで設定を完了します。 |
モニターのサイズに合わせる | 特定のモニターに座標と範囲を合わせます。 |
画像から座標と範囲を選択 | こちらは特定のウィンドウに対して画像認識を行う場合に使用されます。 詳しくは特定のウィンドウで画像認識を参照してください。 |
画像認識処理は範囲が広いほど時間がかかります。
そのため、テンプレート画像周辺だけで十分な場合は、画像より一回り大きい範囲を設定するといいでしょう。
スコアとは画像認識の結果の数値(スコア)のことを指します。
スコアがどの程度の数値になれば類似画像として認識するのかを決める基準値のことです。
テストでは画像認識を一度実行し、スコアがどれだけでるのかを確認することができます。
テストにはいくつか実行方法がありますが、ここでは「画像を撮影してテストを実行」の解説を行います。
「画像を撮影してテストを実行」をクリックすると、画像認識のテストに使用する画像を記録するためのウィンドウが開きます。
記録の準備ができたら「記録を開始」もしくは、ショートカットキー「Pause」を押して記録を開始します。
また、「記録を停止」もしくは、ショートカットキー「Pause」を押して記録を終了します。
記録が終了するとテスト用のウィンドウが表示されます。
ウィンドウの内容をざっくり説明しますと以下のとおりです。
- 記録した画像が表示されます。
- スライダーやボタンで記録した画像を変更することができます。
- 画像認識の設定/実行を行うことができます。
- 画像認識の実行後、スコアが表示されます。
とりあえず、画像認識を実行してみてください。
テンプレート画像が見つかれば、結果(スコア)が右下に表示されます。
表示されたスコアを見て目的の画像だけが認識されるように設定のスコアを調整します。
スコアは 0.0 ~ 1.0 の範囲で 1.0 に近いほどテンプレート画像との類似性が高いことを示します。
画像のように「0.9」と設定した場合は「0.9 以上」だった場合に類似画像としてみなされます。
もしテンプレート画像と違うものが認識されたり、想定していた画像が認識しなかった場合は、スコアを調整した後に再度実行してみてください。
なお、検出方法によって設定するスコアが変わりますのでご注意ください(詳しくはスコアの横にあるアイコンから)
これで画像認識の設定は以上になります。
次はマクロで画像認識を実行する方法について紹介します。
スクリプトエディタ上でCtrl+T
でテンプレート挿入機能を使いtmd
と検索して画像認識を実行するコードを挿入します。
if (Match("識別キー", out var result))
{
Console.WriteLine(result.X);
Console.WriteLine(result.Y);
Console.WriteLine(result.Score);
Move(result.X, result.Y, 0);
}
else
{
Console.WriteLine("画像は見つかりませんでした。");
}
複数の画像を見つけたい場合はtmsd
と検索します。
if (Matches("識別キー", out var results))
{
foreach (var result in results)
{
Console.WriteLine(result.X);
Console.WriteLine(result.Y);
Console.WriteLine(result.Score);
Move(result.X, result.Y, 200);
}
}
else
{
Console.WriteLine("画像は見つかりませんでした。");
}
右側のツールボックスから「画像認識」を選択し、テンプレートをワークスペース内にドラッグアンドドロップします。
アクションリストで右クリック「テンプレートを追加する」>「画像認識:一つだけ探す」>「末尾に追加」をクリックすると画像認識のテンプレートが追加されます。
アクションリストで右クリック「テンプレートを追加する」>「画像認識:複数探す」>「末尾に追加」をクリックすると画像認識のテンプレートが追加されます。
ファイル選択ダイアログから画像を選択します。
既に画像ファイルがある場合はこちらを使用するといいでしょう。
Win+Shift+S を押すことで、任意の範囲を撮影することができます。
撮影を行うと、撮影された画像はクリップボードへコピーされます。
コピーした画像を「クリップボードの画像を保存+選択」をクリックすることでテンプレート画像として使うことができます。
「撮影」をクリックすると赤い枠のウィンドウが表示されます。
撮影したい範囲にサイズを調整してEnter キーを押すことで撮影・保存を行うことができます。
この機能を使用する場合は、事前に画像を用意するか、Windows の機能を使ってスクリーンショットを行いクリップボードへ画像をコピーしておく必要があります。
スクリーンショットは以下の方法で実行してください。
機能 | ショートカットキー |
---|---|
任意の範囲の撮影 | Win + Shift + S |
ディスプレイ全体の撮影 | Win + PrintScreen |
アクティブウィンドウの撮影 | Alt + Printscreen |
「画像を切り抜く」をクリックすると画像を切り抜くためのウィンドウが表示されます。
初めに、左上の「画像」から画像を読み込みます。
この画面では次の操作を行うことができます。
操作 | 機能 |
---|---|
マウスの右・中ボタンドラッグ | 画像の移動 |
マウスホイール | ズーム |
マウスの左ボタンドラッグ | 画像の切り抜き |
マウスの左ボタンをドラッグすることで画像の一部分を切り抜くことができます。
「テンプレート画像として使う」をクリックすると切り抜いた画像の保存とテンプレート画像への設定を行うことができます。
画像認識はメインディスプレイの左上を原点(0,0)として実行されます。
しかしウィンドウが移動してしまう設定されていた座標と範囲から外れることがあり、その都度、座標と範囲を設定し直す必要があります。
それは面倒であるためウィンドウの左上を原点にすることも可能にしてあります。
プロセス名(ウィンドウのタイトルでも設定可)を指定することで、KeyToKey は画像認識実行時にそのプロセスがもつウィンドウを探し、ウィンドウの左上を画像認識の原点にすることができます。
プロセス名には下記の条件の組み合わせを設定することができます。
これらは「プロセス・ウィンドウを指定」ボタンから設定することができます。
条件の組み合わせ | 補足 |
---|---|
プロセス名(完全一致) | |
プロセス名(部分一致) | |
ウィンドウタイトル(完全一致) | |
ウィンドウタイトル(部分一致) | 少し時間がかかる処理なので注意してください |
アクティブウィンドウ | プロセス名に_ アンダースコアを設定することで、アクティブウィンドウを指定することができます。 |
プロセス名に関してはプロセス名の名前を直接指定することができますが、プロセス名の部分一致やウィンドウのタイトルを指定する場合は次のようなjson
を指定する必要があります。
なお「プロセス・ウィンドウを指定」を使うと自動でjsonが指定されます。
{ "Text": "KeyToKey", "Target": 1, "Method": 0 }
名前 | 内容 |
---|---|
Text | プロセス名、もしくはウィンドウ名 |
Target | 0: プロセス名, 1: ウィンドウタイトル |
Method | 0: 完全一致, 1: 部分一致 |
一つのプロセスが複数のウィンドウを持っている場合は、ウィンドウタイトルを設定することを推奨します。
プロセス名を指定すると「検出するウィンドウの範囲にタイトルバーに含める」を有効にすることができます。
上の方でプロセス名が指定されてあると、そのプロセスのもつウィンドウの左上が原点になると説明しましたが、これは少々正しくない説明です。
正しくは、タイトルバーを含まないウィンドウ(クライアント領域)の左上が原点になります。
「座標と範囲」の機能である「画像から座標と範囲を選択」を使用する時に有効にします。
例えば、Alt+PrintScreen でアクティブウィンドウのスクリーンショットを撮影し、スクリーンショットを使って座標と範囲を設定すると画像認識実行時に座標にズレが生じます。
何故かというと、Alt+PrintScreen のスクリーンショットにはタイトルバーが含まれているためです(通常はタイトルバーを除いたクライアント座標が原点になるため)
このオプションを有効にすることで、座標のズレを修正することができます。