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

初期設定

ダウンロードした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を返す。

使い方

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)
結果
プレーンテキスト
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()
CSV
番号,   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()
CSV
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()

//////////////////////////////////////////////////
// 【引数】
//   
// 【戻り値】
//   
//////////////////////////////////////////////////
PROCEDURE forceQuit()
	EXITEXIT
FEND

マッチしない場合は第二引数に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]には指定した座標が入ります。

プレーンテキスト
指定範囲が有効ではありません: [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/