グラフィカルな画面で何かを見つけることをいじってみて、私は現在、画像内の特定の形状を見つける方法について途方に暮れています。画像の形状は異なるスケールを持つ可能性があり、もちろん、未知のx、yオフセットになります。
異なるスケールに起因するピクセルアーティファクトは別として、両方の画像にわずかなノイズもあるため、ある程度許容できる検索が必要です。
これが私が探している画像です。
それは私の(デュアル)スクリーンバッファのスクリーンダンプのどこかに表示されるはずです。サイズはおよそ3300x1200ピクセルです。もちろんブラウザウィンドウで見つけることを期待していますが、その情報は必要ないはずです。
この演習の目的は(これまでのところ)、次のような結果を出すことです。
- はい、(そのおおよその色で、おそらくわずかに切り詰められた形の)木製のフレームが私の画面で見つかりました(または見つかりませんでした)。と
- ゲームのクライアント領域(フレーム内の黒い領域)は、から
(x1,y1)
までの長方形を占め(x2,y2)
ます。
スケーリングやディザリングによって発生する可能性のあるノイズに対して堅牢になりたいです。一方、回転や非剛性など、通常のCVの課題のいくつかを除外することはできます。そのフレームの形状は、人間の脳にとって非常に簡単に識別できますが、専用のソフトウェアではどれほど難しいのでしょうか。これはAdobeFlashアプリケーションであり、最近まで、ゲームGUIからの画像の認識はパイのように簡単なはずだと思っていました。
針と干し草の山の間で可能な限り最大のオーバーラップが発生するx、y変換を見つけることができるアルゴリズムを探しています。可能であれば、一連の可能なスケール係数を繰り返す必要はありません。理想的には、アルゴリズムは、縮尺に依存しない方法で画像の「形状」を抽象化できます。
フーリエ変換についていくつか興味深いことを読んで、似たようなことを達成しました。同じスケールのターゲット画像が与えられた場合、FFTといくつかの行列計算により、検索パターンに対応する大きな画像のポイントが得られました。しかし、これを実践するための理論的背景がありません。また、このアプローチがスケールの問題を適切に処理できるかどうかもわかりません。助けていただければ幸いです!
テクノロジー:私はClojure / Javaでプログラミングしていますが、他の言語のアルゴリズムを適応させることができます。私はCの呼び出し規約に従うライブラリとインターフェースできるはずだと思いますが、純粋なJavaソリューションを好みます。
私が実際の画像を提示することを避けた理由を理解できるかもしれません。これはばかげたゲームですが、画面を読み上げる作業は、私が思っていたよりもはるかに難しいことがわかりました。
私は明らかに、画像を構成するピクセル(黒を除く)を画面バッファーで徹底的に検索することができ、1分以内で実行されます。しかし、私の野心は、スケーリングとディザリングから生じる可能性のある違いに関係なく、形状に一致する技術を使用してその木製フレームを見つけることでした。
実際、ディザリングは、このプロジェクトで私が抱えている多くのフラストレーションの1つです。私はエッジ抽出によっていくつかの有用なベクトルを抽出することに取り組んできましたが、特定の領域のピクセルは広く一貫性のない色を持っているため、エッジはひどくとらえどころのないものです-したがって、ローカルのディザリングアーティファクトから実際のエッジを区別するのは難しいです。このようなシンプルなゲームが、ソフトウェアが認識しにくいグラフィックを生成することになるとは思いもしませんでした。
機能を探し始める前に、ピクセルをローカルで平均化することから始める必要がありますか?ピクセルカラー値の最下位ビットを破棄して、色深度を減らす必要がありますか?
私は純粋なJavaソリューション(実際にはClojure / Javaミックスでプログラミング)を試しているので、opencv(.DLLまたは.soをCコードでインストールする)に夢中ではありません。私の言語の選択について心配する必要はありません。学習体験はパフォーマンスよりもはるかに興味深いものです。