ChkImgX関数

本ページには広告が含まれています。

画像の曖昧検索を行います。

構文
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_XG_IMGX_YG_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をクリックしダウンロードします。バージョンは変わっている可能性がありますが、最新版をダウンロードしてください。

また、ChkImgX関数の使用には.NET Framework 4.5以上のバージョンがインストールされている必要があります。

以下のプログラムでレジストリからインストールされている.NET Frameworkのバージョンを求めることができます。値からバージョンの関係値はインストールされている .NET Framework のバージョンを確認する - .NET Framework | Microsoft Learnを参考にしました。

UWSC
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
          • ChkImgX.cpp
          • ChkImgX.hpp
          • ChkImgX.vcxproj
          • ChkImgX.vcxproj.filters
          • Export.def
          • stdafx.h
          • targetver.h
          • tmatch_opencv.h
          • tmatch_opencv.hpp
        • include
          • GDICapture.h
          • GDICapture.hpp
          • LightWnd.h
          • LightWnd.hpp
          • NekoAddon.h
          • NekoAddon.hpp
          • search_base.h
          • search_base.hpp
          • string_buffer.h
          • win_int64.h
        • NekoAddon
          • Export.def
          • NekoAddon.cpp
          • NekoAddon.vcxproj
          • NekoAddon.vcxproj.filters
          • stdafx.cpp
          • stdafx.h
          • targetver.h
        • ChkImgX.sln
      • ChkImgX.dll
      • ChkImgX.uws
      • NekoAddon.dll
      • Readme.txt
      • sample.png
      • sample.uws
      • 簡単キャプチャ.exe

プログラムを動かすのに必要なのは以下のファイルのみです。

  • ChkImgX-1.2.1
    • ChkImgX
      • ChkImgX.dll
      • ChkImgX.uws
      • NekoAddon.dll

これらのファイルがある同じ階層にChkImgX関数を実行するUWSCファイルを置きます。

UWSC
CALL ChkImgX.uws

ChkImgX関数を実行するには、startup_chkimgx()shutdown_chkimgx()で囲う必要があります。

UWSC
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.pngtest.n.png(nは自然数)のすべてのファイルをパターン画像とし、test.2.pngにマッチした場合2を、test.pngにマッチした場合-1を返す。

使い方

マインスイーパー

マインスイーパーのページで画像認識を行います。プログラムはブラウザのズーム倍率を100%にして実行してください。

画像は以下のボタンからダウンロードして同じフォルダに置いて使用してください。

ダウンロードボタン

以下のプログラムは画面上にある未開放.pngのx座標、y座標を出力します。ゲーム開始時に実行すると9×9で81個の画像を認識します。

プログラム実行中にブラウザの画面をスクロールすると正しく認識できなくなる可能性があります。

画像が認識しない場合はChkImgX関数の第八引数の判定閾値の値を10から20くらいにして判定を甘くしてみてください。

それでも認識しない場合はZIPファイル内の画像を参考にスクリーンショットを撮り、PNGファイルとして保存して置き換えてください。

UWSC
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()
結果
UWSC
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配列に格納されている画像名を順番に画像認識のチェックを行い、該当する配列の位置に格納していきます。

UWSC
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()
結果
UWSC
未未未未未未未未未
未未未未未未未未未
未未未未未未未未未
未未未未未未未未未
未未未未未未未未未
未未未未未未未未未
未未未未未未未未未
未未未未未未未未未
未未未未未未未未未

以下は盤面を進めたとき。

結果
UWSC
済1未未未未未未未
済12未未未未未未
済済112未未未未
済済済済113未未
済済済済済済2未未
済済済済済済12未
11済済済済済1未
未211済済済11
未未未1済済済済済

以下はゲームオーバーのとき。

結果
UWSC
済1●21済12✕
済12爆2✕2爆爆
済済112爆333
済済済済113?2
済済済済済済2爆2
済済済済済済122
11済済済済済1爆
爆211済済済11
12爆1済済済済済

NoxPlayer

NoxPlayerのウィンドウで画像認識を行いたい場合、第二引数にNoxPlayerのIDを指定。

UWSC
DIM ID = GETID("NoxPlayer", "Qt5QWindowIcon")
ChkImgX("image.png", ID)

以下はNoxPlayerアプリストア.pngの画像を検索。

NoxPlayerの画面(IDに指定しているウィンドウ)
NoxPlayer.png
探す画像(アプリストア.png)
.png
UWSC
DIM ID = GETID("NoxPlayer", "Qt5QWindowIcon")
PRINT ChkImgX("アプリストア.png", ID)
結果
UWSC
1

アプリストア.pngをクリックする。

UWSC
DIM ID = GETID("NoxPlayer", "Qt5QWindowIcon")
IF ChkImgX("アプリストア.png", ID) THEN BTN(LEFT, CLICK, G_IMGX_X, G_IMGX_Y)

第七引数の番号に1以上の数値を指定するとi番目にマッチした画像の情報を取得できます。見つからなかった場合はFalseを返すので、以下のように記述するとマッチしたすべての画像に処理が行なえます。

以下はマッチした画像のx座標y座標スコア番号を取得する例。

UWSC
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()
UWSC
番号,x座標,y座標,スコア,画像番号
1,53,81,0,-1
2,165,81,1.624,-1
3,52,190,0,-1
4,164,190,0,-1

第七引数に-1を指定した場合は、配列変数にマッチした画像の情報が格納されます。

UWSC
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()
UWSC
x座標,y座標,スコア,画像番号
53,81,0,-1
52,190,0,-1
164,190,0,-1
165,81,1.624,-1

ゲームなどを操作するときは以下のように無限ループでチェックを行います。優先度の高いものから順に記述していきます。

G_IMGX_XG_IMGX_YG_IMGX_X + 10G_IMGX_Y - 15とかすることでクリックする位置をずらすことができます。

マッチしたらカーソルが持っていかれるので、ESCでプログラムを強制終了するようにしています。

UWSC
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程度増やし判定を緩くしてみるとかしてみてください。ID0にしてマッチしたなら指定するIDが間違っていたことになりますし、閾値を上げてマッチしたなら画像が厳密過ぎたことになります。

CHKIMGからChkImgXへの書き換え

画像名は拡張子(BMPPNGJPEG)まで記述する必要があります。

UWSC
CHKIMG("画像名")
UWSC
startup_chkimgx()

CHKIMGX("画像名.拡張子")

shutdown_chkimgx()

番号(第七引数)を指定するときは、IDx座標y座標は省略不可。

UWSC
DIM num = ChkImgX("image.png", 0, 0, 0. 0, 0, -1)

IDを指定していればバックグラウンドでも検知できます。

エラー

存在しないファイルを指定

ファイル名に存在しないファイルを指定すると発生します。1行目のimage.pngには指定したファイル名が入ります。画像は実行しているUWSCファイルと同じフォルダに置いてください。

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 > y20を除く自然数を座標として指定した場合、エラーが発生します。1行目の[x2,x1,y2,y1]には指定した座標が入ります。

UWSC
指定範囲が有効ではありません: [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は以下で指定できます。

UWSC
DIM ID = GETID("ApowerMirror")

参考文献

  1. https://classicrpa.000webhostapp.com/