2 bmp画像があります。 ImageAはスクリーンショット(例)です。ImageBはそのサブセットです。たとえば、アイコンと言います。
(存在する場合)ImageA内のImageBのX、Y座標を検索したい。
どうすればいいですか?
最初の2つの質問に対する答えがいいえおよびはいである場合、単純な問題があります。また、Q3に対する答えを知るのにも役立ちます。
更新:
基本的な考え方はこれです。imageBのすべてのピクセルの周りのウィンドウをimageAのすべてのピクセルと照合して相関をチェックする代わりに、追跡可能な両方の画像の関心のあるポイント(または機能)を特定しましょう。そのため、コーナーの周りの領域はある程度似ているため(詳細には触れません)、コーナーは本当に追跡可能であるように見えます-したがって、両方の画像で実際に強いコーナーをいくつか見つけて、コーナーを検索しましょう最もよく似ています。
これにより、BのすべてのピクセルをAで検索するという問題が、たとえばBの500コーナーをAの1000コーナー(またはそのようなもの)で検索するという問題が軽減されます。
そして素晴らしいことは、あなたが OpenCV で自由に使えるそのようなコーナー検出器をいくつか持っていることです。 emguCV (C#varriant)を使用したくない場合は、 [〜#〜] fast [〜#〜] 検出器を使用して、一致するコーナーを見つけ、複数の場所を特定します画像間の機能。それができたら、画像の左上隅の場所を見つけることができます。
ここに簡単なサンプルがありますが、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);
画像Bが画像Aのexactサブセットである場合(つまり、ピクセル値はまったく同じです)、これは画像処理の問題ではなく、2Dでの文字列照合にすぎません。 99%の場合、Bの中央から線を引き、それをAの各線と照合すると、思い通りの結果が得られます&mdhas; C#にはその機能があると思います。マッチ(通常は数個)を取得したら、B全体をAの適切な部分と照合します。
私がこれで目にすることができる唯一の問題は、場合によっては、あまりにも多くの一致を取得できることです。例えば。 Aがデスクトップで、Bがアイコンで、背景のみで構成されるBの行を選択するのは不運です。この問題は簡単に解決できます(Bから行をもう少し慎重に選択する必要があります)が、これは問題の詳細によって異なります。