コミュ障だから明日が僕らをよんだって返事もろくにしなかった

何かを創る人に憧れたからブログをはじめたんだと思うよ

きっと何者にもなれない僕だから

UWSCという自動化ツールは画像認識ができるらしいのでやってみた

自動化ツールで楽をしよう(準備編)

マウスをぐるぐる動かしてメモ帳起動させるだけのツールと思っていましたが、画像認識ができるっぽいね、このツール。画像認識ができるようになればこれまでの生活が大分楽になるね。どう楽になるかはよくわかってないけどね。

さっそく作ったよ。

まずは結果から。

f:id:andron:20161008004327p:plain
認識した場合、画像認識に成功しましたのログと認識した数が、しなかった場合は失敗しましたのログがでるよ。

ソースコードはこちらから。

// CHKIMG( [画像名, 透過色/色無視, x1, y1, x2, y2, 番号, 色幅] )
IFB CHKIMG("sample1.bmp", 1)
  PRINT "画像認識に成功しました。"
  
  // 画像のカウント
  COUNT = CHKIMG("sample1.bmp", 1, ,,,,-1)
  IFB COUNT > 0
  	PRINT "認識した画像数: " + COUNT
  ENDIF

ELSE
  PRINT "画像認識に失敗しました。"
ENDIF

そう、CHKIMG関数で画像認識ができちゃうんですよ。
でも画像の透過設定とかファイル形式とかが若干面倒かもしれない。

そんなこの関数の仕様は以下のとおりです。

// 指定画像が画面上にあるかチェック、あればその情報を返す
戻値 = 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 に格納(配列はゼロから)

言い忘れてしまったけれど、実際にこちらのコードを使うときは同じ階層に同名の画像ファイル名が存在しないとちゃんと機能しないから注意だよ(未確認)。


ここから余談

画像認識のやり方を調べるついでに副産物としてカラーピッカーも作ってしまったのでついでにこちらに公開します。
こんなのできました。
f:id:andron:20161008005520p:plain

以下、ソース。

WHILE TRUE
	// カーソル位置の色を表示
	x = G_MOUSE_X; y = G_MOUSE_Y
	c = PeekColor(x, y)
	FUKIDASI ("赤="+G_赤(c)+",緑="+G_緑(c)+",青="+G_青(c))
	SLEEP(0.5)
WEND
// 関数
FUNCTION G_赤(c)
  Result = c and $FF
FEND
FUNCTION G_緑(c)
  Result = (c and $FF00) / $100
FEND
FUNCTION G_青(c)
  Result = (c and $FF0000) / $10000
FEND

あれ? ついでに作ったものだけど、こっちの方が有用な気がする...