web-dev-qa-db-ja.com

別の中にある画像を見つける方法は?

2 bmp画像があります。 ImageAはスクリーンショット(例)です。ImageBはそのサブセットです。たとえば、アイコンと言います。

(存在する場合)ImageA内のImageBのX、Y座標を検索したい。

どうすればいいですか?

30
esac
  1. それで、ImageAでImageBのゆがみはありますか?
  2. ピクセルごとにsameのように、イメージはどのように「正確」ですか?
  3. これにはどのくらいの計算能力がありますか?

最初の2つの質問に対する答えがいいえおよびはいである場合、単純な問題があります。また、Q3に対する答えを知るのにも役立ちます。

更新:

基本的な考え方はこれです。imageBのすべてのピクセルの周りのウィンドウをimageAのすべてのピクセルと照合して相関をチェックする代わりに、追跡可能な両方の画像の関心のあるポイント(または機能)を特定しましょう。そのため、コーナーの周りの領域はある程度似ているため(詳細には触れません)、コーナーは本当に追跡可能であるように見えます-したがって、両方の画像で実際に強いコーナーをいくつか見つけて、コーナーを検索しましょう最もよく似ています。

これにより、BのすべてのピクセルをAで検索するという問題が、たとえばBの500コーナーをAの1000コーナー(またはそのようなもの)で検索するという問題が軽減されます。

そして素晴らしいことは、あなたが OpenCV で自由に使えるそのようなコーナー検出器をいくつか持っていることです。 emguCV (C#varriant)を使用したくない場合は、 [〜#〜] fast [〜#〜] 検出器を使用して、一致するコーナーを見つけ、複数の場所を特定します画像間の機能。それができたら、画像の左上隅の場所を見つけることができます。

15
Jacob

ここに簡単なサンプルがありますが、4〜6秒ほどかかりますが、探していることを正確に実行しており、この投稿が古いことを知っていますが、最近この投稿にアクセスしている人がいる場合は、.NET AForge名前空間またはフレームワークgoogle itおよびそれをインストールすると、プロジェクトにAForge名前空間が含まれます。これは、別の画像を検索して座標を提供することです。

System.Drawing.Bitmap sourceImage = (Bitmap)Bitmap.FromFile(@"C:\SavedBMPs\1.jpg");
            System.Drawing.Bitmap template = (Bitmap)Bitmap.FromFile(@"C:\SavedBMPs\2.jpg");
            // create template matching algorithm's instance
            // (set similarity threshold to 92.1%)

           ExhaustiveTemplateMatching tm = new ExhaustiveTemplateMatching(0.921f);
                // find all matchings with specified above similarity

                TemplateMatch[] matchings = tm.ProcessImage(sourceImage, template);
                // highlight found matchings

           BitmapData data = sourceImage.LockBits(
                new Rectangle(0, 0, sourceImage.Width, sourceImage.Height),
                ImageLockMode.ReadWrite, sourceImage.PixelFormat);
            foreach (TemplateMatch m in matchings)
            {

                    Drawing.Rectangle(data, m.Rectangle, Color.White);

                MessageBox.Show(m.Rectangle.Location.ToString());
                // do something else with matching
            }
            sourceImage.UnlockBits(data);
16
Mandah Mr.

画像Bが画像Aのexactサブセットである場合(つまり、ピクセル値はまったく同じです)、これは画像処理の問題ではなく、2Dでの文字列照合にすぎません。 99%の場合、Bの中央から線を引き、それをAの各線と照合すると、思い通りの結果が得られます&mdhas; C#にはその機能があると思います。マッチ(通常は数個)を取得したら、B全体をAの適切な部分と照合します。

私がこれで目にすることができる唯一の問題は、場合によっては、あまりにも多くの一致を取得できることです。例えば。 Aがデスクトップで、Bがアイコンで、背景のみで構成されるBの行を選択するのは不運です。この問題は簡単に解決できます(Bから行をもう少し慎重に選択する必要があります)が、これは問題の詳細によって異なります。

1
AVB
0
SwDevMan81