画像位置の特定

画像認識してボタンをクリックするのを自動化するために,Rでコードを書いていたら,やはり使いものにならないぐらい遅かった. そこで,Rcppを使ってC++で書き直した. 最低でも10倍,うまくいけば50倍ぐらいになると思っていたが,3倍ぐらいの速度にしかならない. しかも,場合によっては3倍ぐらい遅いこともある. たぶん,C++の書き方が良くないのだと思うが,別の方法で実装することにした.

同じような色だけの画像を認識するのは難しいが,通常

1 needle_imageとhaystack_imageの各ピクセルで共通する色を抽出
2 抽出した色のうちhaystack_imageで出現頻度の少ないものから1つ選んでneedle_imageでの位置を把握
3 needle_imageでの位置をもとに,haystack_imageの基準点(1,1)を抽出
4 出現頻度の少ないものから,順次2と3を繰り返し
5 haystack_imageの基準点が1つに絞れたら,それが探し出そうとしている画像の基準点と一致しているはず

全ピクセルの一致を目指しているのではないので,厳密な一致はしない可能性はあるが,画像があれば必ず一致するはずだ. 厳密な一致を求めるときは,最後にチェックを入れれば良い.

ということで,コードを書いたら結構速い速度になって,満足. 単一色の画像の中からその一部を特定するのは無理だが(このコードに限らず,そもそも無意味),実用的な範囲では使えそうな感じだ.