2017年2月25日土曜日

[UWSC]指定画像が表示された座標を返す関数 [自作関数]

UWSCという開発ソフトを使って作り上げる作業を実際にやってみるカテゴリ。準備した自作関数や使い方、トラブルを記事にしていきます。得るものがあれば幸いです。
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)

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

imgxy()関数
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に値を記憶します。
G_IMG_Xは、直前にCHKIMG関数で探し当てた画像左上のX座標が入っているUWSCの特殊変数。
G_IMG_Yは、直前にCHKIMG関数で探し当てた画像左上のY座標が入っているUWSCの特殊変数。
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]配列変数と関数[使い方まとめ])を参照下さい。

呼び出し側は、
呼び出し側
1xy=imgxy(3,"C:\ポク太郎製\いたずらソフト\poku.bmp")
呼び出し側プログラム説明
1行目1xy=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]に入るので、特殊変数等をいちいち調べる必要がありません。


記事の内容

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


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


【関連記事】[UWSC]あいまいな画像認識の前に“できない理由”を調べる
[UWSC]高圧縮jpegと劣化なしのbmp画像を取得する関数
[UWSC]表示された指定画像の中心座標を返す関数
[UWSC]BMP画像の幅と高さを得る関数


スポンサーリンク



↓ Ctrlキーを押しながら ↓

ブログ村へ blogramのブログランキング

ポク太郎の「俺の説明聞いてくれ」 コンテンツ
ポク太郎の「俺の説明聞いてくれ」最キラー記事 IT関連
映画・ドラマ・芸能
ブログ運営
アホの雑記
ホームへ戻る

スポンサーリンク





0 件のコメント:

コメントを投稿