• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:UWSC 画像認識で条件分岐)

UWSCで画像認識を利用した条件分岐について

このQ&Aのポイント
  • UWSCを使用して画像認識を利用した条件分岐を実装する方法について詳しく説明します。
  • 画像Aが出てくるまで待ち画面をクリックし、その後、画像Bが出てくるまで待ち画面をクリックする処理を実装するには、UWSCのif文とrepeat文を使用します。
  • 画像Aが現れなければ画像Bが出るまで待ち、画像をクリックする処理を実装できますが、画像Aが現れるとそこで処理が止まってしまう問題が発生しているようです。

質問者が選んだベストアンサー

  • ベストアンサー
  • RandenSai
  • ベストアンサー率54% (305/561)
回答No.4

> 以下のように記述してみたんですが 完璧じゃないですか!画像Aがクリックしたい目標物だったら、確かにG_IMG_X,G_IMG_Yを使うのが一番確実な方法です。これだと、もし画像Aの表示される場所が変わっても影響を受けませんから。ただG_IMG_X,G_IMG_Yは画像の左上隅を指しているため、個人的には気味が悪いと感じるので(すごいギリギリの場所をクリックしているわけだから)、4くらい足しています。画像がクリック目標に対して余白を持っている場合は、足す数が4では足りない場合もあります。 ちなみにG_IMG_Xを変数にコピーせずに使うことも可能なので、それでやると大幅に短く書けます。 REPEAT SLEEP(0.1) IF chkimg("A.bmp") Then BTN(left,0,G_IMG_X,G_IMG_Y,50) UNTIL chkimg("B.bmp") BTN(left,0,100,100,50) > 私が質問文であげていたのでは、画像Aをチェックする文に繰り返し処理がかかって > いなかったのですね。それで止まっていたんだと思います。 VBAだけ見てきた人が知ってる世界とUWSCはかなり異質なものなので、迷って当然と思います。VBAはある意味普通のVBと同じくイベント駆動型の言語だから、クリックイベントなどの中に処理を書いておけば、いちいちループで繰り返し見張っている必要がないのに対し、UWSCにはイベントの概念がなく、クリックもキー入力もスクリプトに書いた場所でしか判定されない、よって繰り返しにしないと一回しか見てくれない。またVBAだとマクロの最終行に来ても次の操作が来るまで待機するだけだけど、UWSCではスクリプトが終了する等。

shimP
質問者

お礼

たびたびありがとうございます。 同じようなものかと思っていたら、ふとしたとこでつまづいていました。 これからも少しずつ勉強していきます!

その他の回答 (3)

  • RandenSai
  • ベストアンサー率54% (305/561)
回答No.3

回答No.2です。 > 画像Aが現れず、画像Bが現れることもあるのですが…。 うぐっ、その条件を考慮してませんでした…てっきり画像Bに必ず先立って、画像Aが表示される前提でやっていました。 最初の相談にあったスクリプトでうまくいかない理由は釈然としませんが、恐らく画像をクリックした後にその画像が消えることを確認する処理を入れれば、うまくいくと思います。私も今androidタブレットなのでUWSCが使えない状況ですが、以下のスクリプトで多分いけるんじゃないかなと。ただし画像AとBの両方が同時に画面に出ている瞬間があるようだと、うまくいきません。 While True If GetKeyState(VK_ESC) Then Break //Escキーを押したらループを抜ける Ifb Chkimg("A.bmp") Then //A.bmpが現れたか? Btn(Left,Click,100,100,50) //A.bmpが消えるのを待つ While ChkImg("A.bmp") Sleep(0.1) Wend EndIf Ifb Chkimg("B.bmp") Then //B.bmpが現れたか? Btn(Left,Click,100,100,50) //B.bmpが消えるのを待つ While ChkImg("B.bmp") Sleep(0.1) Wend EndIf Sleep(0.1) Wend

shimP
質問者

お礼

たびたびありがとうございます。 提示してくださったスクリプトでいけました。 私が質問文であげていたのでは、画像Aをチェックする文に繰り返し処理がかかっていなかったのですね。それで止まっていたんだと思います。 いろいろ悩んでたんですが、繰り返し処理の際、条件を2つ入れ込めばよかったんですねぇ。 画像が消えることを確認する処理は入れなくても大丈夫みたいです。 また提示してくださったものを参考にして以下のように記述してみたんですが、こちらも同様にうまく走りました! REPEAT SLEEP(0.1) IF chkimg("A.bmp",) x=G_IMG_X y=G_IMG_Y BTN(left,0,x,y,50)  ENDIF UNTIL chkimg("B.bmp") BTN(left,0,100,100,50)

  • RandenSai
  • ベストアンサー率54% (305/561)
回答No.2

クリックする場所が同じで良ければ、もっと安直にできます。 bmps="A.bmp" While True If GetKeyState(VK_ESC) Then Break //Escキーを押したらループを抜ける Sleep(0.2) If Chkimg(bmps) Then Btn(Left,Click,100,100,50) Else Continue If bmps="A.bmp" Then bmps="B.bmp" Else bmps="A.bmp" Wend 一目瞭然ですが、変数bmpsに画像のファイル名を入れておいて、画像を見つけてクリックしたら、bmpsの中身をもう片方の画像のファイル名にすり替えてしまうというやり方です。もしB.bmpをクリックしたら処理を終わらせたい場合は、以下のようにしてください。 bbmps="A.bmp" While True If GetKeyState(VK_ESC) Then Break //Escキーを押したらループを抜ける Sleep(0.2) If Chkimg(bmps) Then Btn(Left,Click,100,100,50) Else Continue If bmps="A.bmp" Then bmps="B.bmp" Else Break Wend 一応どちらもEscキーを押すと終了しますが、この見方では反応が悪くて連打しないと効かないことがあるので注意。

shimP
質問者

お礼

ありがとうございます。 If Chkimg(bmps) Then Btn(Left,Click,100,100,50) Else Continue Continueって処理せずにループの先頭にもどるんですよね。 これだと、画像Aが現れない限り、ずっとループすることにはならないのでしょうか 。 画像Aが現れず、画像Bが現れることもあるのですが…。 今、UWMCを使うことができない環境で、適当なことを言っていたらすみません。

  • neKo_deux
  • ベストアンサー率44% (5541/12319)
回答No.1

どれが「待ち画面」のクリックなのか、「画像」のクリックなのか、分からないので何ともいえません。 > btn(left,0,100,100,50) > btn(left,0,100,100,50) 同じ処理ですが、「待ち画面」も「画像」も同じ場所に表示されるとかなら、画像気にせずにひたすらクリックで良いのでは? > 画像Aが現れるとそこで止まってしまいます。 止まったように見えるけど、同じ場所をクリックし続けてるのでは? > どこがまずいのでしょうか。 コメント入れたり、Printで処理内容を表示させたりしては?と思います。

shimP
質問者

お礼

ありがとうございます。 画像Aがでたときは、画像Aをクリック、画像Bが出たときは待ち画面をクリックです。 画像Aの座標が、100,100なので、このように書いておりました。 処理内容を表示、試して見ます。

関連するQ&A