2012-12-01 25 views
10

パズルを解く(グラフアルゴリズムを開発しようとする)アプリケーションを構築しようとしています。私は、手作業で入力する必要はありません。別の画像の中の画像を見つける

編集:私はゲームを構築しようとしていません。私はゲーム "SpellSeeker"を演じるエージェントを作ろうとしています

私は画像の中に数字の入った画像を添付していますが、私はボックスの位置を知っています。これらの数字の画像。私がやりたいことは、どの画像(数字)が対応するボックスにあるかを単に伝えることです。

Numbers http://i46.tinypic.com/3089vyt.jpg

だから、私は

bool isImageInsideImage(Bitmap numberImage,Bitmap Portion_Of_ScreenCap)またはそのような何かを実装する必要があると思います。私が試した何

public static bool Contains(this Bitmap template, Bitmap bmp) 
{ 
    const Int32 divisor = 4; 
    const Int32 epsilon = 10; 

    ExhaustiveTemplateMatching etm = new ExhaustiveTemplateMatching(0.9f); 

    TemplateMatch[] tm = etm.ProcessImage(
     new ResizeNearestNeighbor(template.Width/divisor, template.Height/divisor).Apply(template), 
     new ResizeNearestNeighbor(bmp.Width/divisor, bmp.Height/divisor).Apply(bmp) 
     ); 

    if (tm.Length == 1) 
    { 
     Rectangle tempRect = tm[0].Rectangle; 

     if (Math.Abs(bmp.Width/divisor - tempRect.Width) < epsilon 
      && 
      Math.Abs(bmp.Height/divisor - tempRect.Height) < epsilon) 
     { 
      return true; 
     } 
    } 

    return false; 
} 

を(AForgeライブラリを使用して)である。しかし、この画像では黒のドットを検索するときにはfalseを返します。

どうすれば実装できますか?

+0

いくつかのスドクやティックタックのつま先のゲームですか? – bonCodigo

+0

[類似のグランド](http://stackoverflow.com/questions/2472467/how-to-find-one-image-inside-of-another)で他の質問がありましたか? – bonCodigo

+0

「スペルシーカー」と呼ばれるゲームです。しかし、このような問題を解決するためのアルゴリズムを構築したいだけでは大したことではありません。そして、実際、私はこの解決策を他の質問で見つけましたが、彼らは私を助けませんでした。そして、私の怠け者のために私を許してくださいが、私は本当にこれのためのより簡単な方法があるはずだと思います:) – marvin

答えて

5

私は答えている:あなたが本当には、画像内の画像があるかどうかを確認したい場合は(VBコードではないが)

、私は別のポストのために書いたこの拡張機能をチェックアウトすることができます私は解決策を見つけたので、私の質問は:

thisは私のために働いた:唯一の問題は、それが

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.5%) 

      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); 

ましたそのゲームのためのすべての(58)箱を見つけていた。すなわち、それは唯一の指定された数の画像(テンプレート)

編集を見つけ0.98に値0.921fを変更すると、それは完璧に作らしかし、私は実際には異なる映像のために異なる類似性しきい値を入力する必要があります。私は最後に試して最適化された値を見つけました。

float getSimilarityThreshold(int number) 
1

より良いアプローチは、画像そのものに頼るのではなく、必要なすべての情報を保持するカスタムクラスを作成することです。例えば

:あなたがタイルのクラスを「動き回る」と代わりに、画像を解析のValueフィールドから値を読み取ることができ

public class MyTile 
{ 
    public Bitmap TileBitmap; 
    public Location CurrentPosition; 
    public int Value; 
} 

この方法です。クラスが保持している画像を、現在保持している位置に描画します。

private list<MyTile> MyTiles = new list<MyTile>(); 

は、必要に応じてクラスを拡張(とが不要になったときに、それらの画像を配置するために覚えていない):

あなたのタイルは次のように配列に保持することができます。
Vb.Net Check If Image Existing In Another Image

+0

この回答をありがとう。私はすでにこれに似たクラスを持っています。私は、値(テキストボックス内)を持つNodeクラスと、Node配列を持つTileクラスを持っています。しかし、すべてのノードを初期化するという問題は依然として残っています。私はテキストボックスにそれらを入力することができますが、それでも2秒間の実行時間のために手で〜60の数字を入力する必要があることを意味します。だから私はprintscreenイメージを使用してそれらを初期化する方法を探しています。 – marvin

関連する問題