UWSCでは“画像認識”ができるのですが、その使い方を簡単にする関数を作りました。
○指定画像が表示された座標を返す関数
UWSCでは“画像認識”という機能が使えるそうです。画像認識とは、「ポク太郎を探せ!」と命令をすると「この座標にあります!」「画面上にありません!」などと判定してくれる機能です。
やり方としては、画像ファイルを用意してそのファイルのパスを指定してやることで画像認識の関数に伝えます。
UWSCの画像認識
ここから引用-UWSCリファレンスより
// 指定画像が画面上にあるかチェック、あればその情報を返す
戻値 = CHKIMG( [画像名, 透過色/色無視, x1, y1, x2, y2, 番号, 色幅] )
引数
画像名: 画像ファイル名(BMP形式のみ) (画像名を省略した場合はクリップボードから)
透過色/色無視:
0: 指定なし (デフォルト)
1: 左上、2:右上、3:左下、4:右下 の1ピクセルの色を透過色として処理
-1: 色を無視して形でチェックする
x1, y1, x2, y2: サーチ範囲
番号: 複数ある場合に順番を指定 (左上から)
-1: -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の色幅を許す
※ 演算可 例:IMG_MSK_B1 or IMG_MSK_R3(青に対し 2/256の色幅を許す + 赤に対し 8/256の色幅を許す)
戻値
有ればTRUE、無ければFALSE
TRUE の場合は見つかった座標を特殊変数 G_IMG_X、 G_IMG_Y に格納
番号にて -1指定時はヒットした数を返し、座標情報は配列変数 ALL_IMG_X[], ALL_IMG_Y[] に格納(配列はゼロから)
ここまで引用-UWSCリファレンスより
うーん。
CHKIMG()関数の引数が多すぎて覚えるの嫌です。
というわけで、使いそうな機能だけに絞って翻訳関数を作っておきます。翻訳関数と呼んでるのは単に文字数を少なくしたり、引き渡すパラメータを一部固定にして呼び出すときに簡単にするポク太郎の造語。
画像認識の自作関数imgxy(m,pic)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | FUNCTION imgxy(m,pic)//m:色幅指定、pic:画像ファイルのパス DIM xy[1] find=0 SELECT m CASE 1 IF CHKIMG(pic,,SX1,SY1,SX2,SY2,,IMG_MSK_BGR1) xy[0]=G_IMG_X xy[1]=G_IMG_Y find=1 ENDIF CASE 2 IF CHKIMG(pic,,SX1,SY1,SX2,SY2,,IMG_MSK_BGR2) xy[0]=G_IMG_X xy[1]=G_IMG_Y find=1 ENDIF CASE 3 IF CHKIMG(pic,,SX1,SY1,SX2,SY2,,IMG_MSK_BGR3) xy[0]=G_IMG_X xy[1]=G_IMG_Y find=1 ENDIF CASE 4 IF CHKIMG(pic,,SX1,SY1,SX2,SY2,,IMG_MSK_BGR4) xy[0]=G_IMG_X xy[1]=G_IMG_Y find=1 ENDIF SELEND IF find=0 xy[0]=0 xy[1]=0 ENDIF RESULT=SLICE(xy,0,LENGTH(xy)–1) FEND |
1,35行目 | 1 35 | FUNCTION imgxy(m,pic)//m:色幅指定、pic:画像ファイルのパス FEND |
imgxy()関数宣言:表示された画像の中心のx座標とy座標を返す関数。戻り値は配列として返します。引数mで色幅を指定、引数picは画像ファイルのパスです。 | ||
2,3行目 | 2 3 | DIM xy[1] find=0 |
見つけた画像のx座標とy座標を代入するための配列変数xy[]を宣言。 画像が見つかったかどうかを記憶する変数findを初期化します。 | ||
4~5,11,17,23,29行目 | 4 5 11 17 23 29 | SELECT m CASE 1 CASE 2 CASE 3 CASE 4 SELEND |
引数m(色幅)によって分岐します。 ※m=1のとき(6~10行目)のみ説明します。色幅を指定する特殊変数が異なるだけなので。 | ||
6~10行目 | 6 7 8 9 10 | IF CHKIMG(pic,,SX1,SY1,SX2,SY2,,IMG_MSK_BGR1) xy[0]=G_IMG_X xy[1]=G_IMG_Y find=1 ENDIF |
(引数mが1だった場合)CHKIMG()関数の色幅指定をIMG_MSK_BGR1として画像検索します。 変数SX1、SY1、SX2、SY2は、こちらの記事([UWSC]よく使う記号をグローバル宣言)でグローバル変数として宣言した画像の検索範囲を指定するための座標です。(SX1,SY1)~(SX2,SY2)の範囲を探しに行きます。 これはポク太郎が勝手に宣言した変数なので、使用しない場合は、SX1とSY1を0、SX2をG_SCREEN_W、SY2をG_SCREEN_Hに変えれば画面全体を探します。G_SCREEN_W、G_SCREEN_Hというのは、表示画面の幅と高さが入っているUWSCの特殊変数です。 画像が見つかった場合、xy[0]、xy[1]、findに値を記憶します。 | ||
30~34行目 | 30 31 32 33 34 | IF find=0 xy[0]=0 xy[1]=0 ENDIF RESULT=SLICE(xy,0,LENGTH(xy)–1) |
もし画像が見つからなかった場合は、xy[0]=0、xy[1]=0とし、関数の戻り値として配列変数xy[]を返します。 ※配列変数を返す関数の使用方法はこちらの記事([UWSC]配列変数と関数[使い方まとめ])を参照下さい。 |
呼び出し側は、
1 | xy=imgxy(3,“C:\ポク太郎製\いたずらソフト\poku.bmp“) |
1行目 | 1 | xy=imgxy(3,“C:\ポク太郎製\いたずらソフト\poku.bmp“) |
poku.bmpと同じ画像が見つかったらそのX座標はxy[0]、Y座標はxy[1]に代入。見つからなかった場合は、xy[0]=0、xy[1]=0が代入されます。 |
こうしておくと、呼び出し側から、
xy=imgxy(色幅を表す数値、画像ファイルのパス)
とするだけで、X座標、Y座標がxy[0]、xy[1]に入るので、特殊変数等をいちいち調べる必要がありません。
○指定画像が表示された座標を返す関数
コメント