47671


SikulixまたはOpenCVで複数画像のどれか一つが画面内にあるかを高速に判定するロジックはあるのでしょうか。

社内で使用している社外製ERPパッケージに対してRPAもどきの自動処理をするため、Sikulixで簡単な画像認識を行っています。  
画面内に表示される特定のアイコンを検知して、そのアイコンの座標をもとに次の処理を行うロジックになっているのですが速度が遅いので改善方法を探しています。  
特定のアイコンは画面のどこに表示されるか分かりません。  
そして特定のアイコンは12種類であり、そのうちの1つがランダムに表示されるのを検知しなければいけません。

今は12種類のアイコンをループで回して画面内で存在チェックしています。  
exists関数のコストが高く、当然ですがアイコンが存在しない場合にはループを全て回すため最も処理時間が長くなります。

下記のコードでは擬似的に0-9をアイコンに見立てて存在チェックをしています。  
0-9の数字をそれぞれ`0.png`など画像化してsikuliのプロジェクトフォルダに配置し、Notepadにランダムな数字を表示することでどのアイコンが表示されているかを判定します。  
手元の環境では約30秒かかります。

[code]

    import random
    
    app = App("notepad.exe")
    app.focus()
    reg = Region(App.focusedWindow())
    #画面内のどこかに任意のアイコンが表示されることを再現する疑似コード
    type(str(random.randint(0, 9)))
    start = time.time()
    
    #複数種類のアイコンが存在するかチェックする疑似コード
    for i in range(10):
        #ループしながらexistsを回すため処理時間が長い(サンプルコードのため0-9.pngにそれぞれの数字のキャプチャを入れている)
        if reg.exists("{}.png".format(i)) != None:
            #データがあれば処理を継続する
            print(i)
        else:
            print('not exists')
    elapsed = time.time() - start
    print(elapsed)
    
[/code]

n件の画像の配列または複数画像を連結した画像に対して、高速に存在チェックをするロジックがあればご教示ください。


CC BY-SA 4.0
2018-08-10T12:16:21.063
47420
2018-08-20T22:25:48.840
2018-08-20T22:24:32.363
9820
9820
question
opencv sikulix
SikulixまたはOpenCVで複数種類の画像存在チェックを効率的に行う方法


[exists](https://sikulix-2014.readthedocs.io/en/latest/region.html#Region.exists)の第2引数に待ち時間を設定していないことが原因でした。

引数省略時の待ち時間は3秒であるため、存在しないアイコンに対して`exists`を実行した回数に応じて処理時間が長くなりました。

下記の対応で約30秒(31～32秒)の処理が約2秒に短縮できました。

  * `if reg.exists(imgPath, 0) != None:`のように第2引数で0を渡す
  * for文の前に`reg.setAutoWaitTimeout(0)`を記述し、Regionの[タイムアウト設定](https://sikulix-2014.readthedocs.io/en/latest/region.html#Region.setAutoWaitTimeout)を0にする

[類似質問](https://answers.launchpad.net/sikuli/+question/205876)の回答に、他の高速化方法として`MoveMouseDelay`の設定や`getLastMatch`の使用などのTipsが寄せられていました。


CC BY-SA 4.0
2018-08-20T22:25:48.840
47671
2018-08-20T22:25:48.840
9820
47420
answer