初心者でもわかる? ネットゲームなどのマクロスクリプト作成に利用されているUWSC画像認識入門。
本ブログではUWSCのTIPS記事などもたまに投稿していたりするのですが、記事のアクセス流入の検索キーワードなどを分析すると、どうやらネットゲームなどのマクロスクリプト・自動化botを作成しようとしている人に多く読んでいただいているようです。
UWSCはPC作業の自動化・効率化で広く使うことができる便利ツールですので、別にゲーム専用のソフトではないのですが、どうも検索トレンドを見る限り、そういうイメージを持っている人も多そうです。
事実、uwscの検索キーワードとしては、以下のような関連キーワードが上位に上がってきていますw。
uwsc グラブル
uwsc 使い方 艦これ
uwsc 使い方 ゲーム
ゲームなどの場合、DOM操作することが難しいと思うので、画像認識による制御が人気のようです。
私はゲーム用のマクロスクリプトは作ったことはないので的確な記事は書けないかもしれませんが、本記事ではUWSC画像認識の簡単な使い方とトラブルシューティングをまとめてみました。(^◇^)
CHKIMG関数の概要。指定したビットマップ画像が画面上にあるかどうかを簡単にチェックできる便利な関数です。
UWSCにおいては画像認識は「CHKIMG関数」を利用します。
あまり難しいことは考えず関数1つで簡単に画像認識が実装できるのが、UWSCの利点の1つではあります。
関数の概要は以下のとおりです(「UWSCコバヤシ式」様のサイトより引用)。
CHKIMG関数
指定画像が画面上にあるかチェックする
戻値 = CHKIMG( 画像名, [透過色/色無視, x1, y1, x2, y2, 番号, 色幅] )画像名:
(相対パスまたは絶対パスで)画像ファイル名 ※BMP形式のみ
透過色/色無視:
0:指定なし(デフォルト)
1:左上、2:右上、3:左下、4:右下の1ピクセルの色を透過色として処理
-1:色を無視して形でチェックする
x1, y1, x2, y2:サーチ範囲
番号:
複数ある場合の左上からの順番を指定
-1が指定された場合はヒットした数を戻値として返し、座標情報はALL_IMG_X[], ALL_IMG_Y[] に格納
G_IMG_X、G_IMG_Yには最後にヒットした位置が入る
色幅:
チェックに色幅を持たせる
指定次第でうまく使うと、完全に一致する画像だけでなく、似ている画像や形は同じで色が違う画像も認識できたりします。
ただ、本記事は難しいものには触れず、完全一致する画像についてのみ記載します。
《準備編》 画像認識をより使いやすくするために便利な共通関数を用意しておく。BMP画像取得用、座標取得用のソフトを入れておく。
UWSC本体をダウンロードする。無料版でOKです。
まずは、当たり前ですが、UWSCの本体がないとスクリプトは実行できません。
本記事の読者層はもうダウンロード済かもしれませんが、念のため作成者様サイトへのリンクを書いておきます。
UWSCは広く使われている便利で安全なソフトですので、安心してご利用いただけます。有料版・シェアウェア版もあるのですが、基本的に無料版だけでもかなり使うことができます。画像認識の操作なども無料版で全く問題なく使えます。
なお、UWSC自体の使い方などの超初心者的な内容は、本記事では省かせていただきます。以下記事などを参考にしてみてください。
さらに、認証・チェック・クリックなど、便利に使うための共通関数を用意します。
「CHKIMG関数」単体では、あくまで画面上に画像があるかどうかをチェックする関数にすぎません。
一方、実際にこの関数を使ってやりたい事は、
画像があったか判定して、処理を分けたい。
画像があった場合に、画像をクリックしたい。
などであることが多いです。
そのため、やりたいことを実現しやすくするために共通Functionを用意します。
今回はシンプルな画像検索+判定+クリックを行える共通Functionを用意しました。まあ、どのように使いたいかによって、準備する共通Functionは変わってくると思いますが・・・。
ダブルクリックするか、右上のボタンクリックでコピーできますので、ご参考まで。
// 画像認証クリック用共通関数 FUNCTION COMMON_IMG_CLICK(gazou_name, click_flg, append_x, append_y, sleeptime, verify_flg) RESULT = False IFB CHKIMG(gazou_name + ".bmp", 0) IFB click_flg = True BTN(LEFT, CLICK, G_IMG_X + append_x, G_IMG_Y + append_y, 200) SLEEP(sleeptime) ENDIF IFB verify_flg = False RESULT = True ELSE IFB !CHKIMG(gazou_name + ".bmp", 0) RESULT = True ELSE RESULT = False ENDIF ENDIF ENDIF FEND
なお、本共通FunctionはQiitaのTIPS記事を参考にさせていただき、改造を加えています。共通部品化については以下記事を参考にしてください。
画像キャプチャーソフトは昔ながらのWinShotがオススメ。無料ダウンロードです。
UWSCの画像認識には認識する画像ファイルを準備する必要があります。
しかし、この画像ファイルは基本的にビットマップ方式(.BMP)しか対応していません。
画像ファイルの準備は、昔からあるキャプチャソフトの「WinShot」が推奨です。このソフトの利点は、以下のとおり、トリミングや保存形式の変更などをしなくても、一発でビットマップ画像を作れるところです。
後述しますが、UWSCの画像認識で失敗しやすいポイントは画像が正しくないケースがほとんどです(形式が違う、トリミングなどの加工の過程でおかしくなってしまう、等)。一発でビットマップファイルを取得できるソフトを使う方が確実です。
メニューから「ビットマップ保存」→「短形範囲指定」をクリック。
画像認識で使う画像を範囲指定して取得(赤い枠で必要な部分のみを取得できます)。
ビットマップ画像ファイルが出力されます(WinShotのフォルダ)。⇒そのままUWSC画像認識で使えます!
座標の確認はWinRulerが推奨。こちらも無料ダウンロードできます。
また、画像認識するだけでなく、画像をクリックしたい場合は、座標指定する必要があります。
CHKIMG関数のG_IMG_X、G_IMG_Yは認識した画像の位置を座標で返します。クリックする場合は、その座標にクリック座標を追加してクリックする必要があります。
座標の確認は「WinRuler」がシンプルで使いやすいと思います。
以下のとおり、透過された定規のようなものが表示され、マウスがある位置の座標を左上に表示してくれます。
《実践編》 画像認識のやり方・テクニックまとめ。マクロスクリプトでPC作業を自動化・効率化!
画像が存在するかどうかチェックし、画像有無により処理分岐する。
今回準備した共通Functionには、引数を6個用意しています。
gazou_name:画像認識するビットマップファイル名を指定。
click_flg:画像をクリックするかどうかを指定。
append_x:画像をクリックする場合、起点から加算するX座標を指定。
append_y:画像をクリックする場合、起点から加算するY座標を指定。
sleeptime:画像をクリックする場合、クリック後の待ち秒数を指定。
verify_flg:画像をクリックする場合、クリック後に認識画像が消えたかどうかを判定に含める。
画像があるかどうか確認し、有無により処理を分岐する場合は、1つ目の引数だけ指定すればOKです。
今回は準備編で用意したgoogleの画像を「WS000000.BMP」というファイル名で保存し、作成したスクリプトファイル(.UWSファイル)と同じフォルダパス・場所に置いてます。
kekka = COMMON_IMG_CLICK("WS000000", 0, 0, 0, 0, 0) IFB kekka msgbox("画像を発見しました!") ELSE msgbox("画像はありません・・") ENDIF // 画像認証クリック用共通関数 FUNCTION COMMON_IMG_CLICK(gazou_name, click_flg, append_x, append_y, sleeptime, verify_flg) RESULT = False IFB CHKIMG(gazou_name + ".bmp", 0) IFB click_flg = True BTN(LEFT, CLICK, G_IMG_X + append_x, G_IMG_Y + append_y, 200) SLEEP(sleeptime) ENDIF IFB verify_flg = False RESULT = True ELSE IFB !CHKIMG(gazou_name + ".bmp", 0) RESULT = True ELSE RESULT = False ENDIF ENDIF ENDIF FEND
画像が存在する場合は、以下のメッセージが表示されるはずです。
画像が存在するかどうかチェックし、画像をクリックする(画像から相対的に定位置にあるボタンなどをクリックする)。
次に探した画像をクリックします。クリックする場合は2~5個目の引数も指定します。
kekka = COMMON_IMG_CLICK(“WS000000”, 1, 5, 5, 3, 0)
とした場合は、「WS000000.BMPの画像を探し、あった場合は画像をクリックし、クリック後に3秒待つ」という処理になります(正確には「検出した画像の左上端からX/Y軸で5pxずつ追加した場所をクリック」)。
クリックするだけで、成功の判定が不要の場合は、戻り値無しの記述をすることも可能です。
COMMON_IMG_CLICK(“WS000000”, 1, 5, 5, 3, 0)
また、ここでのポイントは、必ずしも「クリックする場所=画像認識する場所」とする必要性はないということです。
CHKIMG(G_IMG_X/G_IMG_Y)は検出した画像の「左上端の座標」を返すだけです。
クリック自体はそこから必要座標数を追加するわけですから、認識画像から見て相対的に定位置にある場所はすべてクリック可能ということです。
クリックしたい場所の画像認識がうまく動かない場合は、その場所から相対的に定位置にある別のシンボルで画像認識して、座標を調整してクリックさせる方法もあります。ついついクリックしたい場所をビットマップ画像にしがちですけど、このテクニックを知っていると選択肢が広がります。
例えば、以下のように、Googleのアイコン画像を認識して、その下にある「I’m feeling lucky」ボタンを押すということもできます(画像の左上端からX軸207、Y軸222を追加)。
kekka = COMMON_IMG_CLICK("WS000000", 1, 207, 222, 3, 0) IFB kekka msgbox("画像を発見しました!") ELSE msgbox("画像はありません・・") ENDIF
画像が存在するかどうかチェック・画像をクリックした後、クリックが成功したかどうか判定する。
さらに、画像認識→クリック後にクリックが成功したかどうか、判定することもできます(ただし、クリックにより画面遷移し、認識画像が表示されなくなるケースのみ)。
6個目の引数をONにします。この場合、クリック後に同じ画像で再度画像認識し、その結果を戻り値に含めますので、「画像認識ができたかどうか」ではなく「画像認識・クリックの結果、正常に画面遷移し、認識画像が表示されなくなったかどうか」の結果が取得できます。
kekka = COMMON_IMG_CLICK("WS000000", 1, 207, 320, 3, 1) IFB kekka msgbox("画像のクリックに成功!") ELSE msgbox("画像のクリックに失敗・・") ENDIF
例えば、「I’m feeling lucky」ボタンの場合は、クリックすると画面遷移し、googleのロゴが画面表示されなくなりますので、クリックが成功した場合のみだけ、戻り値にTrueが返ります。
画像認証が成功するまで画像認証処理を繰り返す。
また、ありがちな処理として、画像認証が成功するまで繰り返すという処理も可能です。
ただし、永久ループに入ることがないように、タイムアウト時間を設定しておくことが推奨されます。
以下の例では、画像認証するまで繰り返すが、10秒たっても認識できなかった場合は、タイムアウトする処理になります。
kekka = 0 START_TM = Gettime() WHILE (COMMON_IMG_CLICK("WS000000", 0, 0, 0, 0, 0) = False) SLEEP(0.5) IFB Gettime() - START_TM > 10 kekka = 1 BREAK ENDIF WEND IFB kekka = 1 MSGBOX("おお・・タイムアウトしてしまうとは情けない・・") ELSE MSGBOX("画像が発見できました!") ENDIF
認識できないお(´・ω・`)・・・。よくありがちな事例とトラブルシューティング。UWSC画像認識で困ったら、確認すべきチェックリスト。
ビットマップ画像が正しいかどうか確認する。
ファイル形式は正しいかどうか?(ビットマップ(.BMP)のみ。png、jpgなどは基本的に不可。)
画像のトリミングで失敗をしてないかどうか?(トリミングの際に誤って縮尺を変えてしまったりしていないか)
画像の加工などで失敗をしてないかどうか?(24ビット・256色の保存形式等、画質を劣化させてしまったりしていないか、透過色の指定が誤っていないか)
複数のPCで同じビットマップ画像を使いまわしたりしていないか?(ビットマップ画像はUWSCを実行するPCで都度取り直す)
同じPCでも、OS入れ替え・ビデオドライバー更新などした場合は、画像を取り直しているか?(ビットマップ画像はUWSCを実行する環境で都度取り直す)
ブラウザなどの場合、うっかりブラウザ表示自体を拡大・縮小させてたりしていないか?(たまにあるw)
「画像認識の100%の成功は無理」という前提でロジックを組む。
同じPCで環境も変わってないのに、普通に動いていたものが、10日くらい立つと突然認識できなくなることがある(たぶんアンチエイリアスが微妙に変わってる??)。
この場合は、再度ビットマップ画像を取り直し、新旧両方の画像のどちらかで認識すればOKという感じにロジックを修正する(画像を複数パターン用意しておいて、どこかで引っ掛かればよいというロジックで実装する)。
100%画像認証が成功する前提とはしない。失敗するケースも考慮してロジックを組む。
UWSC実行環境のPCを確認する。
当たり前ですが、PCがスリープしてしまったりすると、動作しませんw。設定を確認してください。
ディスプレイが自動でブラックアウトする設定にしている場合、ブラックアウトした途端に画像認識ができなくなるケースがあるようです。
この場合は設定を外してブラックアウトしないようにします。UWSC実行中にディスプレイを切りたい場合は、ディスプレイの電源を「物理的」に落とす運用にするとうまくいくようです。
それでも解決しない?
プログラミングで困ったときに、「Yahoo!知恵袋」や「教えて!Goo」で質問しても、適切な答えってなかなか返ってこないです。
プログラミングに特化したプロが集まる「teratail」なら回答が付く確率9割です。
もちろん登録無料ですので、登録して詳しい人に聞くのもアリ。
UWSC記事
他にもUWSCの記事を書いています。画像認証しなくても画面コントロールをクリックする方法もありますので参考まで。