目次
画像の曖昧検索を行います。
- 構文
- CHKIMGX( 画像名, ID, x1, y1, x2, y2, 番号, 判定閾値, 着目する色 )
- 引数
- 画像名 (String)必須
- 画像ファイル名(BMP, PNG, JPEG, 形式は拡張子から判断)
- ID (Integer)省略可
- Windowを識別するID (0 であればスクリーン全体)
- x1, y1, x2, y2 (Integer)省略可
- サーチ範囲(指定ウィンドウの左上が原点。クライアント領域基準ではない)
- 番号 (Integer)省略可
- マッチした箇所が複数ある場合に順番を指定 (左上から)
- -1
- -1が指定された場合はヒットした数を戻値として返し、座標,スコア,画像番号の情報は一致率の高い順で ALL_IMGX_X[ ], ALL_IMGX_Y[ ], ALL_IMGX_SCORE[ ], ALL_IMGX_NUM[ ] に格納。
G_IMGX_X, G_IMGX_Y, G_IMGX_SCORE, G_IMGX_NUMには最も一致率の高い箇所の情報が入る
- 判定閾値 (Integer)省略可
- [0-100](%) マッチしたと判定する閾値(0は完全一致のみ)マッチした場合のスコアはG_IMGX_SCOREに格納。値が小さいほど厳しくなる。1~20程度が実用範囲と思われる。
- 着目する色 (Integer)省略可
- 指定した色とどれだけ近いかでグレースケール化した画像を使ってマッチングの計算を行う。文字の色などを指定することで背景の変化に強いマッチング判定を行うことが可能。
$000000〜$FFFFFFのRGB値で指定。-1は色指定なし。
- 戻り値
- 有ればTRUE、無ければFALSE
TRUEの場合は見つかった座標、スコアをグローバル変数G_IMGX_X、G_IMGX_Y、G_IMGX_SCOREに格納
番号にて -1指定時はヒットした数を返し、座標,スコア,画像番号は配列変数ALL_IMG_X[ ],ALL_IMG_Y[ ]
ALL_IMGX_SCORE[ ], ALL_IMGX_NUM[ ]に格納(配列はゼロから)
※内部処理の制限で最大200個までしか検出しない。番号に201以上を指定すると常にFALSEが返る
ダウンロード方法
UWSCの標準関数であるCHKIMG関数は完全に一致した画像にしかマッチしないため、少しでも変わってしまうと検知されなくなってしまいます。 そこで下記サイトにある拡張機能(ChkImgX関数)を利用すると曖昧検索できるようになります。
ChkImgX-ver1.2.1.zipをクリックしダウンロードします。バージョンは変わっている可能性がありますが、最新版をダウンロードしてください。
初期設定
ダウンロードしたZIPファイルを解凍します。
-
ChkImgX-1.2.1
-
ChkImgX
-
src
- ChkImgX
- include
- NekoAddon
- ChkImgX.sln
- ChkImgX.dll
- ChkImgX.uws
- NekoAddon.dll
- Readme.txt
- sample.png
- sample.uws
- 簡単キャプチャ.exe
-
src
-
ChkImgX
プログラムを動かすのに必要なのは以下のファイルのみです。
-
ChkImgX-1.2.1
-
ChkImgX
- ChkImgX.dll
- ChkImgX.uws
- NekoAddon.dll
-
ChkImgX
これらのファイルがある同じ階層にChkImgX関数を実行するUWSCファイルを置きます。
CALL ChkImgX.uws
ChkImgX関数を実行するには、startup_chkimgx()〜shutdown_chkimgx()で囲う必要があります。
startup_chkimgx()
// CHKIMGX()
shutdown_chkimgx()
特殊変数
マッチした画像の情報が以下の特殊変数に代入されます。第七引数の番号に-1が指定された場合は、一致率の高い(スコア値が低い)順でAll_*に代入され、G_*には最も一致率の高い(スコア値が最低)情報が代入されます。
- G_IMGX_X(ALL_IMGX_X)
- x座標
- G_IMGX_Y(ALL_IMGX_Y)
- y座標
- G_IMGX_SCORE(ALL_IMGX_SCORE)
- スコア
1-類似度[%]で求められる値。0=完全一致。例えば95%一致した画像にマッチした場合、5が出力されます。 - G_IMGX_NUM(ALL_IMGX_NUM)
- 画像番号
ファイル名.番号.拡張子の形式で指定したすべてのパターン画像で判定しマッチした画像の番号。
画像にtest.pngを指定した場合、test.pngとtest.n.png(nは自然数)のすべてのファイルをパターン画像とし、test.2.pngにマッチした場合2を、test.pngにマッチした場合-1を返す。
使い方
NoxPlayerのウィンドウで画像認識を行いたい場合、第二引数にNoxPlayerのIDを指定。
DIM ID = GETID("NoxPlayer", "Qt5QWindowIcon")
ChkImgX("image.png", ID)
以下はNoxPlayerのアプリストア.pngの画像を検索。
- NoxPlayerの画面(IDに指定しているウィンドウ)
- 探す画像(アプリストア.png)
DIM ID = GETID("NoxPlayer", "Qt5QWindowIcon")
PRINT ChkImgX("アプリストア.png", ID)
- 結果
1
アプリストア.pngをクリックする。
DIM ID = GETID("NoxPlayer", "Qt5QWindowIcon")
IF ChkImgX("アプリストア.png", ID) THEN BTN(LEFT, CLICK, G_IMGX_X, G_IMGX_Y)
第七引数の番号に1以上の数値を指定するとi番目にマッチした画像の情報を取得できます。見つからなかった場合はFalseを返すので、以下のように記述するとマッチしたすべての画像に処理が行なえます。
以下はマッチした画像のx座標、y座標、スコア、番号を取得する例。
CALL ChkImgX.uws
startup_chkimgx()
DIM i = 1
WHILE TRUE
DIM bool = ChkImgX("image.png", 0, 0, 0, 0, 0, i, 3)
IF !bool THEN BREAK
PRINT i + "," + G_IMGX_X + "," + G_IMGX_Y + "," + G_IMGX_SCORE + "," + G_IMGX_NUM
i = i + 1
WEND
shutdown_chkimgx()
番号, x座標, y座標, スコア, 画像番号
1, 53, 81, 0, -1
2, 165, 81, 1.624, -1
3, 52, 190, 0, -1
4, 164, 190, 0, -1
第七引数に-1を指定した場合は、配列変数にマッチした画像の情報が格納されます。
CALL ChkImgX.uws
startup_chkimgx()
DIM num = ChkImgX("image.png", 0, 0, 0, 0, 0, -1, 5)
FOR i = 0 TO num - 1
PRINT ALL_IMGX_X[i] + "," + ALL_IMGX_Y[i] + "," + ALL_IMGX_SCORE[i] + "," + ALL_IMGX_NUM[i]
NEXT
shutdown_chkimgx()
x座標, y座標, スコア, 画像番号
53, 81, 0, -1
52, 190, 0, -1
164, 190, 0, -1
165, 81, 1.624, -1
ゲームなどを操作するときは以下のように無限ループでチェックを行います。優先度の高いものから順に記述していきます。
G_IMGX_XとG_IMGX_YをG_IMGX_X + 10、G_IMGX_Y - 15とかすることでクリックする位置をずらすことができます。
マッチしたらカーソルが持っていかれるので、ESCでプログラムを強制終了するようにしています。
SETHOTKEY(VK_ESC, EMPTYPARAM, “forceQuit”)
CALL ChkImgX.uws
startup_chkimgx()
DIM ID = 0
WHILE TRUE
IFB CHKIMGX("image1.png", ID, 0, 0, 0, 0, -1, 10) <> 0
BTN(LEFT, CLICK, G_IMGX_X, G_IMGX_Y)
ELSEIF CHKIMGX("image2.png", ID, 0, 0, 0, 0, -1, 10) <> 0
BTN(LEFT, CLICK, G_IMGX_X, G_IMGX_Y)
ELSEIF CHKIMGX("image3.png", ID, 0, 0, 0, 0, -1, 10) <> 0
BTN(LEFT, CLICK, G_IMGX_X, G_IMGX_Y)
ELSEIF CHKIMGX("image4.png", ID, 0, 0, 0, 0, -1, 10) <> 0
BTN(LEFT, CLICK, G_IMGX_X, G_IMGX_Y)
ELSEIF CHKIMGX("image5.png", ID, 0, 0, 0, 0, -1, 10) <> 0
BTN(LEFT, CLICK, G_IMGX_X, G_IMGX_Y)
ENDIF
SLEEP(3.000)
WEND
shutdown_chkimgx()
//////////////////////////////////////////////////
// 【引数】
//
// 【戻り値】
//
//////////////////////////////////////////////////
PROCEDURE forceQuit()
EXITEXIT
FEND
マッチしない場合は第二引数にIDを設定している場合は0にして範囲を画面にする、もしくは第八引数の閾値を+10〜20程度増やし判定を緩くしてみるとかしてみてください。IDを0にしてマッチしたなら指定するIDが間違っていたことになりますし、閾値を上げてマッチしたなら画像が厳密過ぎたことになります。
CHKIMGからChkImgXへの書き換え
画像名は拡張子(BMP、PNG、JPEG)まで記述する必要があります。
CHKIMG("画像名")
startup_chkimgx()
CHKIMGX("画像名.拡張子")
shutdown_chkimgx()
番号(第七引数)を指定するときは、ID、x座標、y座標は省略不可。
DIM num = ChkImgX("image.png", 0, 0, 0. 0, 0, -1)
IDを指定していればバックグラウンドでも検知できます。
エラー
存在しないファイルを指定
ファイル名に存在しないファイルを指定すると発生します。1行目のimage.pngには指定したファイル名が入ります。画像は実行しているUWSCファイルと同じフォルダに置いてください。
該当ファイルが1つもありません: image.png
以下、スタックトレース
1: スタックトレースの取得に失敗
2: スタックトレースの取得に失敗
3: get_mouse_click() - 0x58fc6b00
4: chkimgx_generic() - 0x58fc80f0
5: TMethodImplementationIntercept() - 0x45b028
6: TMethodImplementationIntercept() - 0x45b028
7: TMethodImplementationIntercept() - 0x45b028
8: TMethodImplementationIntercept() - 0x45b028
9: TMethodImplementationIntercept() - 0x45b028
10: TMethodImplementationIntercept() - 0x45b028
11: TMethodImplementationIntercept() - 0x45b028
12: TMethodImplementationIntercept() - 0x45b028
13: TMethodImplementationIntercept() - 0x45b028
14: TMethodImplementationIntercept() - 0x45b028
15: TMethodImplementationIntercept() - 0x45b028
16: TMethodImplementationIntercept() - 0x45b028
17: TMethodImplementationIntercept() - 0x45b028
18: TMethodImplementationIntercept() - 0x45b028
19: TMethodImplementationIntercept() - 0x45b028
20: TMethodImplementationIntercept() - 0x45b028
chkimgxでエラーが発生しました。やり直します!
指定範囲が無効
x1 > x2またはy1 > y2で0を除く自然数を座標として指定した場合、エラーが発生します。1行目の[x2,x1,y2,y1]には指定した座標が入ります。
指定範囲が有効ではありません: [top,left,bottom,right] = [x2,x1,y2,y1]
以下、スタックトレース
1: スタックトレースの取得に失敗
2: スタックトレースの取得に失敗
3: chkimgx_generic() - 0x5cf580f0
4: TMethodImplementationIntercept() - 0x45b028
5: TMethodImplementationIntercept() - 0x45b028
6: TMethodImplementationIntercept() - 0x45b028
7: TMethodImplementationIntercept() - 0x45b028
8: TMethodImplementationIntercept() - 0x45b028
9: TMethodImplementationIntercept() - 0x45b028
10: TMethodImplementationIntercept() - 0x45b028
11: TMethodImplementationIntercept() - 0x45b028
12: TMethodImplementationIntercept() - 0x45b028
13: TMethodImplementationIntercept() - 0x45b028
14: TMethodImplementationIntercept() - 0x45b028
15: TMethodImplementationIntercept() - 0x45b028
16: TMethodImplementationIntercept() - 0x45b028
17: TMethodImplementationIntercept() - 0x45b028
18: TMethodImplementationIntercept() - 0x45b028
19: TMethodImplementationIntercept() - 0x45b028
20: TMethodImplementationIntercept() - 0x45b028
chkimgxでエラーが発生しました。やり直します!
Android画面をPCにミラーリング
Androidを操作したい場合、PCに画面をミラーリングすることで操作することができます。
無料版では連続で10分の制限時間がありますが接続し直せば何度でも使えるので、無料版でも十分かと思います。無料版で動作のテストを行い有料版を購入するのでも良いと思います。
- PCのリンク
- ApowerMirror-スマホをリアルタイムにミラーリング/制御する
- Google Play(Android)のリンク
- Google Play
ApowerMirrorのIDは以下で指定できます。
DIM ID = GETID("ApowerMirror")