1. まとめトップ

【UWSC】CHKIMG関数の使用方法まとめ

UWSCである画像が画面にあるかチェックし、あればその情報を取得するCHKIMG関数。これが使えると指定画像を探してその場所をクリックしたり、画像が見つかれば所定の動作を行なわせるなどUWSCでやれることが広がります。私がCHKIMG関数を使ったスクリプトを作成している時に調べた事をまとめました

更新日: 2013年07月17日

13 お気に入り 128815 view
お気に入り追加

この記事は私がまとめました

yuukikengoさん

目次

1.CHKIMG関数の仕様
2.通常の画像認識方法
3.複数の画像の情報を取得する方法
4.透過色を含む画像を認識する方法
5.透過色を含む複数の画像を認識する方法

CHKIMG関数の仕様

指定画像が画面上にあるかチェックする
戻値 = CHKIMG( 画像名, [透過色/色無視, x1, y1, x2, y2, 番号, 色幅] )

"引数の説明

画像名:
(相対パスまたは絶対パスで)画像ファイル名 ※BMP形式のみ
透過色/色無視:

0:指定なし(デフォルト)
1:左上、2:右上、3:左下、4:右下の1ピクセルの色を透過色として処理
-1:色を無視して形でチェックする
x1, y1, x2, y2:サーチ範囲

番号:
複数ある場合の左上からの順番を指定
-1が指定された場合はヒットした数を戻値として返し、
座標情報はALL_IMG_X[], ALL_IMG_Y[] に格納
G_IMG_X、G_IMG_Yには最後にヒットした位置が入る

色幅:
チェックに色幅を持たせる
色無視指定時もしくは16bitカラー以下の場合は無効

IMG_MSK_BGR1:各色(BGR)に対し 2/256の色幅を許可
IMG_MSK_BGR2:各色(BGR)に対し 4/256の色幅を許可
IMG_MSK_BGR3:各色(BGR)に対し 8/256の色幅を許可
IMG_MSK_BGR4:各色(BGR)に対し 16/256の色幅を許可
IMG_MSK_B1, 2, 3, 4:青に対し 2/256, 4/256, 8/256, 16/256の色幅を許可
IMG_MSK_G1, 2, 3, 4:緑に対し 2/256, 4/256, 8/256, 16/256の色幅を許可
IMG_MSK_R1, 2, 3, 4:赤に対し 2/256, 4/256, 8/256, 16/256の色幅を許可

出典元:CHKIMG | UWSC コバヤシ式
http://canal22.org/kansu/chkimg/

通常の画像認識方法

まず、UWSCの実行ファイルのあるフォルダに認識したい画像をBMP方式で保存します。
デフォルトならCHKIMG関数の引数は画像ファイル名だけでOKです。
一致する画像が見つかった場合はG_IMG_X、G_IMG_Yに画面上の画像の座標が入ります。
座標は画面上の画像の左上になります。

画面上に画像があればその画像をクリックするサンプルコードは下記のようになります。

ifb CHKIMG( "test.bmp")
x=G_IMG_X // 画像の座標をxへ代入
y=G_IMG_Y // 画像の座標をyへ代入
BTN(LEFT, CLICK, x+2, y+2, 80)   // 画像の場所を左クリック 
else
PRINT "画像を探しても見つかりませんでした。"
endif

CHKIMGの戻り値はブール値になるのでifb文の条件式にそのまま使えます。
BTN関数でx、yに+2しているのは取得された座標は画像の一番左上のため、右下に補正しています。

複数の画面上の同一画像情報を取得する方法

複数の画像を認識したい場合はCHKIMG関数の第7引数を-1を指定します。
戻り値はヒットした画像の個数になります。
引数で特に指定する必要のない項目は何も入力せずにカンマで区切ります。
例:CHKIMG("test.bmp",,,,,,-1)
ヒットした各画像の座標はALL_IMG_X[]、ALL_IMG_Y[]配列に格納されます。
G_IMG_X、G_IMG_Yには最後にヒットした座標が入ります。

下のサンプルコードはヒットした複数の画像の座標を配列imgX,imgYに格納するプログラムになります。
imgX,imgY配列の要素数は都合に合わせて変更してください。

dim imgX[10], imgY[10] //画像の座標を格納する配列
hits = CHKIMG("test.bmp",,,,,,-1) //画像を探してヒットした個数を格納
ifb hits > 0
For i = 0 To hits-1
imgX[i]=ALL_IMG_X[i] // 画像の座標をimgXへ代入
imgY[i]=ALL_IMG_Y[i] // 画像の座標をimgYへ代入
NEXT
else
PRINT "画像を探しても見つかりませんでした。"
endif

透過色を含む画像を認識する方法

透過色を含む画像を認識させたいときはCHKIMG関数の第2引数に1~4を指定します。
例:CHKIMG( "test.bmp" ,1) //第2引数に1を指定して透過色モードにする
1~4で指定すると1:左上、2:右上、3:左下、4:右下の1ピクセルの色と一致する色の領域は透過色として指定されます。
透過色を含んだ画像を判定元画像(フォルダに保存する画像ファイル)としてそのまま使用するとうまくいきません。透過色領域は引数で指定した色と一致するように単色で塗りつぶす必要があります。
その手順を説明します。

右の画像はMozilla FireFoxのMの文字をWinShotで切り取って保存したものです。
文字の背景が透過処理されており、そのままではうまく判別できません。

Mの文字部分以外を単一の色で塗りつぶします。
左の画像の場合は白色で塗りつぶしました。
これで引数で指定する四隅の色と同じ色の領域は全て無視され、Mの文字部分だけが判定の対象となります。

UWSCの実行ファイルのあるフォルダ、もしくは相対パスで指定したフォルダに下降した画像ファイルを保存します。
左の画像ではtest.bmpがその画像になります。

次のソースコードは透過色を含んだ画像を探してクリックするプログラムになります。
CHKIMG関数の第2引数に1を指定して左上の1ピクセルと同一色の領域はどんな色でも一致したものとして画像判定を行ないます。

ソースコード
ifb CHKIMG( "test.bmp" ,1) //第2引数に1を指定して透過色モードにする
x=G_IMG_X // 画像の座標をxへ代入
y=G_IMG_Y // 画像の座標をyへ代入
BTN(LEFT, CLICK, x+2, y+2, 80)   // 画像の場所を左クリック
else
PRINT "画像を探しても見つかりませんでした。"
endif

注意事項

左の画像の白色の領域はどんな色でも一致することになります。文字が黒、背景がどんな色でも良いとなると黒色でも良いということになります。そうなると画面上に黒色の広い領域があるとそこが全てヒットしてしまいます。

また、黒い透過背景に白い文字の場合だと、白い領域が全てヒットすることになります。
白い領域はエクスプローラやエディタ、ブラウザ等、そこらじゅうにあるので注意が必要です。

この場合の対処方法はよくわかりませんでした。
画面から黒い領域や白い領域を表示させないようにしたり、CHKIMG関数の第3~第6引数で画像探索領域を指定して狭めるくらいしか思いつきませんでした。

透過色を含む複数の画像を認識する方法

上記の2つの組み合わせです。
CHKIMG関数の第2引数に1を、第7引数にー1を指定します。
サンプルコードとして透過色を含んだ画像を複数見つけ出し、その座標を配列imgX、imgYに格納するソースコードを掲載します。

hits = CHKIMG("test.bmp",1,,,,,-1)
ifb hits > 0
For i = 0 To hits-1
imgX[i]=ALL_IMG_X[i] // 画像の座標をxへ代入
imgY[i]=ALL_IMG_Y[i] // 画像の座標をyへ代入
NEXT
else
PRINT "画像を探しても見つかりませんでした。"
endif

参考にしたページ

1