2012-12-01 19 views
10

Bir bulmacayı çözen bir uygulama oluşturmaya çalışıyorum (bir grafik algoritması geliştirmeye çalışıyorum) ve her zaman el ile örnek girişi girmek istemiyorum.Başka Bir Görüntü İçinde Bir Resim Bulma

Düzeltme: Bir oyun oluşturmaya çalışmıyorum. "SpellSeeker" oyununu oynatan bir aracı oluşturmaya çalışıyorum

Ekranda sayılar içeren bir görüntüm var (eke bakın) ve kutuların yerlerini biliyorum. bu sayılar için resimler. Ne yapmak istediğim, ilgili kutuda hangi resmin (sayı) olduğunu söylemek.

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

Yani ben böyle

bool isImageInsideImage(Bitmap numberImage,Bitmap Portion_Of_ScreenCap) falan uygulamak gerekiyor sanırım. Ben denedim ne

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 kütüphaneleri kullanılarak) 'dir Fakat bu görüntüde siyah bir nokta ararken yanlış döndürür.

Bunu nasıl uygulayabilirim?

+0

Bazı sudoku veya tic tac toe oyunu? – bonCodigo

+0

[Benzer zemin üzerinde başka soru gördünüz mü (http://stackoverflow.com/questions/2472467/how-to-find-one-image-inside-of-another)? – bonCodigo

+0

Bu "spellseeker" adlı bir oyun. Ama önemli değil, sadece bu problemi çözmek için algoritma kurmak istiyorum. Ve evet, aslında bu çözümü diğer sorularda buldum, ama bana yardım etmediler. Ve benim lazyness için beni affet ama gerçekten bu soru için daha kolay bir yol olmalı diye düşünüyorum :) ilginç soru için – marvin

cevap

5

Ben cevap veriyorum: Eğer gerçekten görüntünün içinde bir görüntü olup olmadığını görmek istiyorsanız (VB kodu rağmen)

, sen başka yazı için yazdığı bu uzantıyı kontrol edebilirsiniz Ben çözüm bulduk beri benim sorum:

this benim için çalıştım: tek sorun

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

oldu oyun için tüm (58) kutuları buluyordu. Ancak, 0.921f değerini 0.98 olarak değiştirmek onu mükemmelleştirdi, yani yalnızca belirtilen sayıyı (şablon)

Edit: Aslında farklı resimler için farklı benzerlik eşikleri girmem gerekiyor.Denemeye çalışarak optimize edilmiş değerleri buldum, sonunda bir fonksiyonum var

float getSimilarityThreshold(int number) 
1

Daha iyi bir yaklaşım, görüntünün kendisine güvenmek yerine ihtiyacınız olan tüm bilgileri içeren özel bir sınıf oluşturmaktır. Örneğin

: yerine görüntüyü analiz Value alandan değer kiremit sınıfını "hareket" ve okuyabilir

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

Bu şekilde. Sınıfı tuttuğu pozisyona hangi görüntüyü çizerseniz çizersiniz.

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

gerektiği gibi sınıf uzatın (ve artık ihtiyaç olduğunda bu görüntüleri imha unutmayın):

Sen fayans gibi bir dizi tutulabilir.
Vb.Net Check If Image Existing In Another Image

+0

Bu cevap için teşekkürler. Zaten buna benzer bir sınıfım var. Değerler (metin kutularında) ve Düğüm dizisine sahip bir Çini sınıfı olan bir Düğüm sınıfım var. Ancak tüm düğümleri başlatma sorunu hala devam ediyor. Onları metin kutularına girebiliyorum ama yine de 2 saniyelik çalışma süresi için ~ 60 rakamı elle girmek zorunda olduğum anlamına geliyor. Bu yüzden, baskı ekran görüntüsünü kullanarak bunları başlatmanın bir yolunu arıyorum. – marvin

İlgili konular