2012-12-01 21 views
10

मैं एक ऐसा एप्लिकेशन बनाने की कोशिश कर रहा हूं जो एक पहेली हल करता है (ग्राफ एल्गोरिदम विकसित करने की कोशिश कर रहा है), और मैं हर समय हाथ से नमूना इनपुट दर्ज नहीं करना चाहता हूं।एक और छवि के अंदर एक छवि ढूंढना

संपादित करें: मैं एक गेम बनाने की कोशिश नहीं कर रहा हूं। मैं एक एजेंट बनाने की कोशिश कर रहा हूं जो गेम "स्पेलसेकर" खेलता है

कहें कि इसमें स्क्रीन पर स्क्रीन पर एक छवि है (संलग्नक देखें), और मुझे बॉक्स के स्थान पता हैं, और मेरे पास सटीक है इन संख्याओं के लिए छवियों। मैं क्या करना चाहता हूं बस यह बताएं कि कौन सी छवि (संख्या) संबंधित बॉक्स पर है।

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 पुस्तकालयों का उपयोग) है लेकिन यह गलत लौटाता है जब इस छवि में काले बिंदु के लिए खोज।

मैं इसे कैसे कार्यान्वित कर सकता हूं?

+0

कुछ सुडोकू या टिक टैक पैर गेम है? – bonCodigo

+0

क्या आपने [समान जमीन] पर अन्य प्रश्न देखा है (http://stackoverflow.com/questions/2472467/how-to-find-one-image-inside-of-another)? – bonCodigo

+0

यह "स्पेलसेकर" नामक एक गेम है। लेकिन यह महत्वपूर्ण नहीं है कि मैं ऐसी समस्या को हल करने के लिए एल्गोरिदम बनाना चाहता हूं। और हाँ, वास्तव में मुझे यह समाधान अन्य प्रश्नों में मिला, लेकिन उन्होंने मेरी मदद नहीं की। और मुझे अपनी आलस्य के लिए क्षमा करें, लेकिन मुझे सच में लगता है कि इस के लिए एक आसान तरीका होना चाहिए :) दिलचस्प प्रश्न के लिए – marvin

उत्तर

5

मैं जवाब दे रहा हूँ मेरे सवाल के बाद से मैं समाधान मिल गया है:

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

एक बेहतर तरीका एक कस्टम क्लास बनाने के लिए है जिसमें छवि पर भरोसा करने के बजाय आपको आवश्यक सारी जानकारी मिलती है।

उदाहरण के लिए:

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

इस तरह आप के बजाय छवि का विश्लेषण करने के Value क्षेत्र से टाइल वर्ग "चारों ओर ले जाने" कर सकते हैं और पढ़ने के मूल्य। आप कक्षा में जो भी छवि धारण कर रहे हैं उसे उस स्थिति में खींचें जो वर्तमान में हो रहा है।

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

वर्ग के रूप में की जरूरत का विस्तार (और जब वे अब जरूरत हैं उन छवियों को निपटान के लिए याद):

आप टाइल्स की तरह एक सरणी में आयोजित किया जा सकता है।

आप वास्तव में अगर वहाँ छवि के अंदर एक छवि है देखना चाहते हैं, तो आप इस विस्तार मैं एक पद के लिए लिखा था की जांच कर सकते हैं (हालांकि VB कोड में):
Vb.Net Check If Image Existing In Another Image

+0

इस उत्तर के लिए धन्यवाद। मेरे पास पहले से ही एक वर्ग है। मेरे पास मूल्यों (टेक्स्टबॉक्स में) के साथ एक नोड क्लास है, और एक टाइल क्लास जिसमें नोड सरणी है। लेकिन सभी नोड्स को शुरू करने की समस्या अभी भी बनी हुई है। मैं उन्हें टेक्स्टबॉक्स में दर्ज कर सकता हूं लेकिन इसका मतलब है कि मुझे 2-सेकंड चलने वाले समय के लिए हाथ से ~ 60 नंबर दर्ज करना होगा। इसलिए मैं प्रिंटरस्क्रीन छवि का उपयोग करके उन्हें प्रारंभ करने का एक तरीका ढूंढ रहा हूं। – marvin

संबंधित मुद्दे