前回の記事でImageSearchを使った画像認識(画面に指定した画像やアイコンがあるか)を紹介しましたが、ImageSearchはちょっとでも色が変わったりすると認識が一気にできなくなったり、処理がすごく遅くなったりしてあまり使えないなーという感じです。
(とは言え、お手軽で画面の色合いなんて使ってるPCで変わることはまずない)
ちょっと微妙な違いでも認識出来るように、OpenCVを使ったあいまいな画像認識(テンプレートを紹介します。これが出来るとRPAライクな業務自動化がより安定しますね。
1. Ver3~のOpenCVは気軽に使えない
2020年1月現在、OpenCVはバージョン4.2となっていますが、バージョン3以上はお手軽に使えません。AutoItで使えるDllCall()に対応していない(詳しい人追加説明求む)
extern C とかしてマングリングまではなんとなく理解しました。

じゃあOpenCV4.2をextern Cつけてビルドしていけばいいのでは?というのは時間が空いた時にやろうと思います。
ソースからビルドしてDLL作ってそこから画像認識する方法は下記の方がやっています。ちなみにVisual Studio2019、OpenCV4.2でもできます。ビルドしなくてもOpenCVのリリースページの4.2->Windowsでダウンロードしたexeを展開した中にもopencv_world420.dll, opencv_world420.libがあるのでビルドはスキップ出来ます。(50M以上あるdllですが)
2. OpenCV UDFをダウンロード
下記が本家ですが、これをラップした便利なソースのほうをダウンロードします。
まずは本家。(ダウンロードしなくてもいい)
上記をラップしたような関数_MatchPicture()がある(こちらをダウンロードして展開)
展開すると以下のような構成になっています。

- DLLs opencv2.4.13で画像認識するのに必要なライブラリが入っています
- Matchフォルダ 画面内で検索しようとする画像です。
1.pngをAnalyticsのアイコンにしておきます - SNapshot-Tool スナップショット作れるツールだと思いますが使ってないので
- Example.au3 UDFを使うサンプルです。Matchフォルダの1.png,2.pngを使います
- OpenCV-Match_UDF.au3 UDF本体です
2.1 DLLを公式から取得する(任意)
附属のDLLが不安だと思うのでしたら、OpenCV公式から2.4.13.6(リリースの2ページ目)のWindowsをクリックするとexeがダウンロードされ、build/x64/vc14/bin/内にdllがあるのでそれを上書きしても良いです。
3. Exampleを実行してみる
Matchフォルダにある1.pngをAnalyticsアイコンにし、ブラウザでAnalyticsに行き画面にアイコンが出ているようにします。


Example.au3をビルド・実行すると、まず1.pngをロードし、次に画面キャプチャしマッチングする。マッチしたらマーキング出して、マウスもそこに持っていく。
メモ帳開いて2.png開いて・・・という感じです。
3.1 マスク付き画像でも大丈夫
pngの白を抜いて(マスキング)それを1.pngにしても大丈夫でした。
3.2 対象が少し明るいなど色の違いも大丈夫
Phtooshopでブラウザキャプチャしたのを色相・再度で少し明るく、色相を-5にして保存したpngを画面に出してやってみましたが、こちらも認識しました。Thresholdで1.0にしてないから思った通りの結果と言えばそうですが、ImageSearchと大きく違うのはThreshold0.7でも早いです。
ImageSearchではtoleranceを増やすと一気に遅くなります。なので、OpenCV使えるといいですね。
下記のような背景ハイライトでも認識。いいですね。

クリックなどのアクションをしてから特定のアイコンやテキストが出るまで待つ。
などの使い方が出来ますね。
ImageSearchだと少し違うとダメになるので、これを使うことでより安定した自動化が出来そうです。
4. OpenCV-Match_UDF.au3のエラー処理を追加したほうがいい
うまく動かなかった時、どこが悪いのかわからなくなるので、DllOpen(),DllCall()のエラーに対して処理追加したほうが良いと思います。
4.1 _OpenCV_Startup() ->DllOpen()
DllOpen()が失敗すると返値が-1になるのでそれぞれ変数チェックしたほうが良いです。
ちなみに成功するとハンドル1,2,という値がセットされている模様。
4.2 DllCall()
DllCall()で失敗すると@error=1,2,3が入ります。
1=DLLOpenに失敗していたりすると出てくる
2=返り値が不明?なったことないので
3=関数が見つからない extern Cしてるか確認
コメント
OpenCV UDFの使用ですごくはまったポイントを一つ
DllOpen()
で、ものすごくはまりました。
開発環境では動いて、移植した環境では動かないという事が起こりました。
同じ原因ではまってる人がいるのではと思い一応残します。
原因は、<Microsoft Visual C++ ランタイムライブラリ>
が入っていないことが原因です。
環境の差異を洗い出し、一つずつランタイム入れて実行を繰り返し特定しました。
動作させるには、以下が必要です。
・Visual Studio 2015、2017、2019、および 2022
・Visual Studio 2013 (VC++ 12.0)
(https://docs.microsoft.com/ja-JP/cpp/windows/latest-supported-vc-redist?view=msvc-170)
上記が入っていない場合、サンプルのExampleでもこけると思います。
上記(OpenCV UDF)と書きましたが、
OpenCV-Match_UDF.au3 内のDllOpenで起こる不具合事象に関連した内容になります。
訂正します。