2017年2月25日土曜日

[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()関数の引数が多すぎて覚えるの嫌です。
というわけで、使いそうな機能だけに絞って翻訳関数を作っておきます。翻訳関数と呼んでるのは単に文字数を少なくしたり、引き渡すパラメータを一部固定にして呼び出すときに簡単にするポク太郎の造語。

とりあえず使いそうなのは色幅。
グラフィックカードによって同じ画像でも個々に表示が変わるなんてことも考えられるので、多少幅を持たせて認識した方がよさそうです。
IMG_MSK_BGRなんて暗号は覚える気にならないので、数値指定にします。
関数の仕様とソースは、

自作関数imgxy(m,pic) xy=imgxy(3,"C:\ポク太郎製\いたずらソフト\poku.bmp")
             色幅指定IMG_MSK_BGR3で画面上を探し、
             poku.bmpと同じ部分が見つかったらその座標、見つからなかったら(0,0)を返す関数。

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

プログラム中にある命令・関数
CHKIMG関数 画像を探すための関数(上にリファレンスを引用している関数)
SX1
SX2
SY1
SY2
ここでグローバル変数として宣言した画像の検索範囲を指定するための座標です。
(SX1,SY1)~(SX2,SY2)の範囲を探しに行きます。

これはポク太郎が勝手に宣言した変数なので、使用しない場合は、
SX1とSY1を0、SX2をG_SCREEN_W、SY2をG_SCREEN_Hに変えれば画面全体を探します。
G_SCREEN_W、G_SCREEN_Hというのは、
UWSCの特殊変数で表示画面の幅と高さが入っています。
G_IMG_X UWSCの特殊変数。
直前にCHKIMG関数で探し当てた画像の左上のX座標が入っています。
G_IMG_Y UWSCの特殊変数。
直前にCHKIMG関数で探し当てた画像の左上のY座標が入っています。
SELECT 変数~
CASE 値~
SELEND
UWSCでの条件分岐命令の一つ。
変数がCASEで示した値の場合にそのCASE文中の処理だけを実行する命令です。

IF(条件)ELSEIF(条件)ELSE~ENDIFの命令でも同じことができるのですが、
分岐が多い場合にプログラムを見やすくしたい場合に使います。

この命令は大抵の開発環境で実装しています。


こうしておくと呼び出し側から、
xy=imgxy(色幅を表す数値、画像ファイルのパス)  とするだけで、
X座標、Y座標がxy[0]、xy[1]に入るので、特殊変数等をいちいち調べる必要がありません。

記事の内容

記事の内容は伝わりましたでしょうか。
○指定画像が表示された座標を返す関数



関数群のダウンロードはこちら
func_poku.uwsのコメント欄に呼び出し方が書いてあります。


【関連記事】  [UWSC]配列変数と関数
[UWSC]日付時刻を文字列で返す関数
[UWSC]よく使う記号をグローバル宣言
[UWSC]配列の最大要素を返す関数





0 件のコメント:

コメントを投稿