CHKIMG関数の使い方

実際に画像認識させる場合のサンプルをいくつか載せたいと思います。

IFではなくIFBを使っているのは処理が複数行に渡る場合を考慮しているからです。

 

基本的な使い方

まずは基本的な使い方として次のような構造で処理させます。 「//」はコメント用として使います。 同じ行の「//」以降は無視されます。

サンプル用に画像を用意しました。名前を付けて保存でbmp形式を選んでください。ファイル名にも気をつけましょう。ちなみに背景が紫ですが正常です。sample1

IFB CHKIMG("sample1.bmp") // 認識させたい画像ファイルを指定する
  // 画像認識に成功した場合の処理をここに書く
ELSE
  // 画像認識に失敗した場合の処理をここに書く
ENDIF

この時点では画像認識に成功しても失敗しても何も処理が書かれていないので何もしません。

 

画像認識に成功した場合、座標情報を表示させてみる

先ほどのサンプルから一歩進んで、画像認識に成功したらメッセージボックスを表示させてみます。 ついでに座標情報も表示させてみます。

先ほどの画像をもう一度載せておきます。先ほど保存したファイルでこの画像を認識できるか試してみてください。

sample1

IFB CHKIMG("sample1.bmp") // 認識させたい画像ファイルを指定する
  // 画像認識に成功した場合の処理をここに書く
  MSGBOX("画像認識に成功しました。<#CR>G_IMG_X = " + G_IMG_X + "<#CR>G_IMG_Y = " + G_IMG_Y)
ELSE
  // 画像認識に失敗した場合の処理をここに書く
  MSGBOX("画像認識に失敗しました。")
ENDIF

画像認識に成功しましたか?

 

透過色を指定して画像認識させる

ゲームでキャラクターを画像認識させたい場合は背景が邪魔になります。 そのような場合には透過色を指定してキャラクターだけを認識させるようにしましょう。

先ほどのサンプルに少々手を加えます。 CHKIMG関数の透過色/色無視に1を指定して画像の左上の色を透過色として処理させます。 これでキャラクターのみを画像認識させることができます。

左上の画像がキャラクターの画像の一部になっている場合は当然ですが上手く透過処理できません。
キャラクターの画像に余裕を持たせて透過処理を問題なくできるようにするか、左上以外の場所で透過処理させるようにしましょう。

キャラクターのみを画像認識できるかチェック用に画像を用意しました。sample2

IFB CHKIMG("sample1.bmp",1) // 認識させたい画像ファイルを指定する
  // 画像認識に成功した場合の処理をここに書く
  MSGBOX("画像認識に成功しました。<#CR>G_IMG_X = " + G_IMG_X + "<#CR>G_IMG_Y = " + G_IMG_Y)
ELSE
  // 画像認識に失敗した場合の処理をここに書く
  MSGBOX("画像認識に失敗しました。")
ENDIF

 

いくつ画像認識に成功したか調べる方法

ただ画像認識させるだけではなく、いくつ画像認識に成功したかを調べたい場合もあるでしょう。 そのような場合はCHKIMG関数の番号で-1を指定すると戻り値に画像認識に成功した数が代入されます。 この戻り値を変数に代入しておくと後から利用できます。 言葉では理解しにくいと思うのでサンプルを試してみましょう。

同じキャラクターが複数表示されている画像を用意しました。sample3

COUNT = CHKIMG("sample1.bmp",1,,,,,-1) // 認識させたい画像ファイルを指定する
IFB COUNT > 0
  // 画像認識に成功した場合の処理をここに書く
  MSGBOX("画像認識に成功しました。<#CR>戻り値 = " + COUNT + "<#CR>G_IMG_X = " + G_IMG_X + "<#CR>G_IMG_Y = " + G_IMG_Y)
ELSE
  // 画像認識に失敗した場合の処理をここに書く
  MSGBOX("画像認識に失敗しました。")
ENDIF

画像認識に成功した数が戻り値に代入されますが、その戻り値を変数COUNTに代入しています。 その後のIFB命令では変数COUNTを利用して条件判断させています。

画像認識で対象が1つならG_IMG_X, G_IMG_Yの変数に位置情報が格納されていましたが、今回は複数認識できているのでALL_IMG_X[], ALL_IMG_Y[]の配列に位置情報が格納されています。 このように複数認識に成功した場合のG_IMG_X、G_IMG_Yには最後にヒットした位置が代入されるので注意しましょう。