2017年3月10日金曜日

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

UWSCという開発ソフトを使って作り上げる作業を実際にやってみるカテゴリ。準備した自作関数や使い方、トラブルを記事にしていきます。得るものがあれば幸いです。
前回ビットマップ画像の幅と高さを得る関数を作ったので、その前回の表示画像の座標を返す関数を改良します。

記事の内容

○表示された画像の中心座標を返す関数

スマホで閲覧されている方へ
このブログは画面横幅を広くしてあります。スマホ解像度での閲覧は厳しいと思いますので、ウェブバージョンへどうぞ。

(2017年9月15日修正)こちら([UWSC]あいまいな画像認識の前に“できない理由”を調べる)でデバッグ機能を追加したものに作り直ししております。

前回、ビットマップ画像の幅と高さを得る関数を作成したので、そのまた前回に作った表示画像の座標を得る関数を中心座標を返すように改良します。


表示された画像の中心座標を返す関数

こちらの記事([UWSC]指定画像が表示された座標を返す関数)とほぼ同じです。4行目で、
wh=bmp(pic)
として、前回の関数に画像のパスを渡しています。こうするとwh[0]に幅、 wh[1]に高さが入ります。それを画像が見つかった座標にそれぞれ1/2したものを足し算しています。

imgxyc()関数
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
36
FUNCTION imgxyc(m,pic)//m:色幅指定、pic:ビットマップファイルのパス
            DIM xy[1]
            find=0
            wh=bmp(pic)
      SELECT m
      CASE 1
         IF CHKIMG(pic,,SX1,SY1,SX2,SY2,,IMG_MSK_BGR1)
            xy[0]=G_IMG_X+wh[0]/2
            xy[1]=G_IMG_Y+wh[1]/2
            find=1
         ENDIF
      CASE 2
         IF CHKIMG(pic,,SX1,SY1,SX2,SY2,,IMG_MSK_BGR2)
            xy[0]=G_IMG_X+wh[0]/2
            xy[1]=G_IMG_Y+wh[1]/2
            find=1
         ENDIF
      CASE 3
         IF CHKIMG(pic,,SX1,SY1,SX2,SY2,,IMG_MSK_BGR3)
            xy[0]=G_IMG_X+wh[0]/2
            xy[1]=G_IMG_Y+wh[1]/2
            find=1
         ENDIF
      CASE 4
         IF CHKIMG(pic,,SX1,SY1,SX2,SY2,,IMG_MSK_BGR4)
            xy[0]=G_IMG_X+wh[0]/2
            xy[1]=G_IMG_Y+wh[1]/2
            find=1
         ENDIF
      SELEND
         IF find=0
            xy[0]=0
            xy[1]=0
         ENDIF
            RESULT=SLICE(xy,0,LENGTH(xy)-1)
FEND
関数プログラム説明(○⇒:成り立つ場合、×⇒:成り立たない場合)
1,36行目1
36
FUNCTION imgxyc(m,pic)//m:色幅指定、pic:ビットマップファイルのパス
FEND
imgxyc()関数宣言:表示された画像の中心のx座標とy座標を返す関数。戻り値は配列として返します。引数mで色幅を指定、引数picは画像ファイルのパスです。
2~4行目2
3
4
            DIM xy[1]
            find=0
            wh=bmp(pic)
見つけた画像のx座標とy座標を代入するための配列変数xy[]を宣言。
画像が見つかったかどうかを記憶する変数findを初期化します。
また、目的のBMP画像の幅と高さを取得しておきます。bmp()関数はこちらの記事[UWSC]BMP画像の幅と高さを得る関数で作成した自作関数。
5~6,12,18,24,30行目5
6
12
18
24
30
      SELECT m
      CASE 1
      CASE 2
      CASE 3
      CASE 4
      SELEND
引数m(色幅)によって分岐します。
※m=1のとき(7~11行目)のみ説明します。色幅を指定する特殊変数が異なるだけなので。
7~11行目7
8
9
10
11
         IF CHKIMG(pic,,SX1,SY1,SX2,SY2,,IMG_MSK_BGR1)
            xy[0]=G_IMG_X+wh[0]/2
            xy[1]=G_IMG_Y+wh[1]/2
            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_WG_SCREEN_Hというのは、表示画面の幅と高さが入っているUWSCの特殊変数です。

画像が見つかった場合、xy[0]xy[1]findに値を記憶します。
G_IMG_Xは、直前にCHKIMG関数で探し当てた画像左上のX座標が入っているUWSCの特殊変数。
G_IMG_Yは、直前にCHKIMG関数で探し当てた画像左上のY座標が入っているUWSCの特殊変数。

探し当てた座標にそれぞれwh[0]/2wh[1]/2(4行目で取得したBMP画像の幅と高さ)を加算して中心座標に直してxy[0]xy[1]に代入。
31~35行目31
32
33
34
35
         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
2
3
   xy=imgxyc(4,"C:\poku\ポク太郎アイコン.bmp")//4は色幅の指定です
   x=xy[0]//見つかった位置のx座標(画像の中心)が入る
   y=xy[1]//見つかった位置のy座標(画像の中心)が入る
呼び出し側プログラム説明
1~3行目1
2
3
   xy=imgxyc(4,"C:\poku\ポク太郎アイコン.bmp")//4は色幅の指定です
   x=xy[0]//見つかった位置のx座標(画像の中心)が入る
   y=xy[1]//見つかった位置のy座標(画像の中心)が入る
配列xy[0]にX座標(画像の中心)が代入される。
配列xy[1]にY座標(画像の中心)が代入される。



記事の内容

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


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


スポンサーリンク



↓ Ctrlキーを押しながら ↓

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

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

スポンサーリンク





0 件のコメント:

コメントを投稿