Нахождение образа внутри другого образа

Я пытаюсь создать приложение, которое решает головоломку (пытается разработать алгоритм графика), и я не хочу вводить образец ввода вручную все время.

Edit: Я не пытаюсь построить игру. Я пытаюсь создать агент, который играет в игру "SpellSeeker"

скажем, у меня есть изображение (см. вложение) на экране с числами в нем, и я знаю расположение ящиков, и у меня есть точные изображения для этих чисел. Что я хочу сделать, так это просто скажите, какое изображение (номер) находится на соответствующем поле.

номера http://i46.tinypic.com/3089vyt.jpg

поэтому я думаю, что мне нужно реализовать

bool isImageInsideImage(Bitmap numberImage,Bitmap Portion_Of_ScreenCap) или что-то подобное.

то, что я пробовал (используя AForge библиотеки)

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

но он возвращает false при поиске черной точки На этом изображении.

Как я могу реализовать это?

2 ответов


я отвечаю на свой вопрос, так как я нашел решение:

этой у меня получилось:

System.Drawing.Bitmap sourceImage = (Bitmap)Bitmap.FromFile(@"C:\SavedBMPs.jpg");
            System.Drawing.Bitmap template = (Bitmap)Bitmap.FromFile(@"C:\SavedBMPs.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.921 f на 0.98 сделало его идеальным, т. е. он находит только изображение (шаблон) указанного числа

редактировать: на самом деле мне нужно ввести разные пороги сходства для разных изображений. Я нашел оптимизированные значения, попробовав, в в конце у меня есть функция, как

float getSimilarityThreshold(int number)

лучший подход-создать пользовательский класс, который содержит всю необходимую информацию, а не полагаться на само изображение.

например:

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

таким образом, вы можете "перемещаться" по классу плитки и читать значение из