目次
画像の曖昧検索を行います。
- 構文
- 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関数)を利用すると曖昧検索できるようになります。
Classic RPA – NEWS Automatic Detection- Classic RPA – NEWS Automatic Detection(Internet Archive)
- UWSC 本体とあいまい検索 | 日々彼是
ChkImgX-ver1.2.1.zipをクリックしダウンロードします。バージョンは変わっている可能性がありますが、最新版をダウンロードしてください。
また、ChkImgX関数の使用には.NET Framework 4.5以上のバージョンがインストールされている必要があります。
以下のプログラムでレジストリからインストールされている.NET Frameworkのバージョンを求めることができます。値からバージョンの関係値はインストールされている .NET Framework のバージョンを確認する - .NET Framework | Microsoft Learnを参考にしました。
HASHTBL version
version["378389"] = ".NET Framework 4.5"
version["378675"] = ".NET Framework 4.5.1"
version["378758"] = ".NET Framework 4.5.1"
version["379893"] = ".NET Framework 4.5.2"
version["393295"] = ".NET Framework 4.6"
version["393297"] = ".NET Framework 4.6"
version["394254"] = ".NET Framework 4.6.1"
version["394271"] = ".NET Framework 4.6.1"
version["394802"] = ".NET Framework 4.6.2"
version["394806"] = ".NET Framework 4.6.2"
version["460798"] = ".NET Framework 4.7"
version["460805"] = ".NET Framework 4.7"
version["461308"] = ".NET Framework 4.7.1"
version["461310"] = ".NET Framework 4.7.1"
version["461808"] = ".NET Framework 4.7.2"
version["461814"] = ".NET Framework 4.7.2"
version["528040"] = ".NET Framework 4.8"
version["528372"] = ".NET Framework 4.8"
version["528449"] = ".NET Framework 4.8"
version["528049"] = ".NET Framework 4.8"
version["533320"] = ".NET Framework 4.8.1"
version["533325"] = ".NET Framework 4.8.1"
DIM WshShell = CREATEOLEOBJ("WScript.Shell")
DIM Release = WshShell.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full\Release")
PRINT version[Release]初期設定
ダウンロードした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.uwsChkImgX関数を実行するには、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を返す。
使い方
マインスイーパー
マインスイーパーのページで画像認識を行います。プログラムはブラウザのズーム倍率を100%にして実行してください。
画像は以下のボタンからダウンロードして同じフォルダに置いて使用してください。
以下のプログラムは画面上にある未開放.pngのx座標、y座標を出力します。ゲーム開始時に実行すると9×9で81個の画像を認識します。
プログラム実行中にブラウザの画面をスクロールすると正しく認識できなくなる可能性があります。
画像が認識しない場合はChkImgX関数の第八引数の判定閾値の値を10から20くらいにして判定を甘くしてみてください。
それでも認識しない場合はZIPファイル内の画像を参考にスクリーンショットを撮り、PNGファイルとして保存して置き換えてください。
CALL ChkImgX.uws
startup_chkimgx()
DIM num = ChkImgX("未開放.png", 0, 0, 0, G_SCREEN_W, G_SCREEN_H, -1, 0)
FOR i = 0 TO num - 1
PRINT i + "," + ALL_IMGX_X[i] + "," + ALL_IMGX_Y[i]
NEXT
shutdown_chkimgx()- 結果
0,270,343 1,480,343 2,340,343 3,410,343 4,235,343 5,305,343 6,375,343 7,480,378 8,445,343 9,235,378 10,305,378 11,375,378 12,410,378 13,445,378 14,515,378 15,515,343 16,270,378 17,340,378 18,235,413 19,270,413 20,305,413 21,340,413 22,410,413 23,480,413 24,375,413 25,445,413 26,515,413 27,235,448 28,270,448 29,305,448 30,375,448 31,410,448 32,445,448 33,480,448 34,515,448 35,340,448 36,340,483 37,410,483 38,480,483 39,270,483 40,445,483 41,235,483 42,305,483 43,375,483 44,515,483 45,305,518 46,375,518 47,445,518 48,480,518 49,515,518 50,270,518 51,410,518 52,235,518 53,340,518 54,480,553 55,515,553 56,270,553 57,340,553 58,375,553 59,410,553 60,445,553 61,235,553 62,305,553 63,305,588 64,375,588 65,445,588 66,515,588 67,270,588 68,480,588 69,235,588 70,340,588 71,410,588 72,480,623 73,515,623 74,270,623 75,305,623 76,340,623 77,410,623 78,375,623 79,445,623 80,235,623
マインスイーパーの各マスの状態を配列に格納し出力します。images配列に格納されている画像名を順番に画像認識のチェックを行い、該当する配列の位置に格納していきます。
CALL ChkImgX.uws
startup_chkimgx()
DIM board[8][8]
SETCLEAR(board, "?")
DIM images[] = "未開放", "済", "旗", "旗ミス", "爆弾", "爆発", "1", "2", "3", "4", "5", "6", "7", "8"
DIM values[] = "未", "済", "旗", "✕", "爆", "●", "1", "2", "3", "4", "5", "6", "7", "8"
DIM xs[-1]
DIM ys[-1]
DIM fields[-1]
FOR i = 0 TO UBound(images)
IFB ChkImgX(images[i] + ".png", 0, 0, 0, G_SCREEN_W, G_SCREEN_H, -1, 0) THEN
arrayMerge(xs, ALL_IMGX_X)
arrayMerge(ys, ALL_IMGX_Y)
FOR j = 0 TO LENGTH(ALL_IMGX_X) - 1
arrayPush(fields, values[i])
NEXT
ENDIF
NEXT
DIM xmin = CALCARRAY(xs, CALC_MIN)
DIM ymin = CALCARRAY(ys,CALC_MIN)
FOR i = 0 TO UBound(xs)
board[(ys[i] - ymin) / 35][(xs[i] - xmin) / 35] = fields[i]
NEXT
// ボード出力
FOR i = 0 TO UBound(board)
DIM str = ""
FOR j = 0 TO UBound(board[0])
str = str + board[i][j]
NEXT
PRINT str
NEXT
shutdown_chkimgx()- 結果
未未未未未未未未未 未未未未未未未未未 未未未未未未未未未 未未未未未未未未未 未未未未未未未未未 未未未未未未未未未 未未未未未未未未未 未未未未未未未未未 未未未未未未未未未
以下は盤面を進めたとき。
- 結果
済1未未未未未未未 済12未未未未未未 済済112未未未未 済済済済113未未 済済済済済済2未未 済済済済済済12未 11済済済済済1未 未211済済済11 未未未1済済済済済
以下はゲームオーバーのとき。
- 結果
済1●21済12✕ 済12爆2✕2爆爆 済済112爆333 済済済済113?2 済済済済済済2爆2 済済済済済済122 11済済済済済1爆 爆211済済済11 12爆1済済済済済
NoxPlayer
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()マッチしない場合は第二引数に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")