Сопоставление с образцом изображения (если существуют возвращаемые координаты) - PullRequest
6 голосов
/ 02 марта 2011

В настоящее время я в C # пытаюсь найти способ найти определенный шаблон в большом изображении, на самом деле скриншот.Требуется 100% -ное совпадение, поэтому проблема довольно проста.

Материал теста: http://www.myhideout.eu/temp/pattern.png (Примечание: прозрачные пиксели не имеют значения и не должны проверяться.) http://www.myhideout.eu/temp/test.png

Если шаблон найден, мне понадобится какая-то координата, чтобы я знал, где, но это самая простая часть.

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

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

Однако, мой самый большойбеспокойство время.Это лишь небольшая часть длительного процесса, и цель состоит в том, чтобы сократить общее время выполнения до нескольких секунд.Представьте себе изображение 1920 * 1200, которое приблизительно соответствует пределу, где шаблон находится в конце, и перед этим происходит несколько частичных совпадений.

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

Я также думал о том, можно ли будет преобразовать шаблон иПротестируйте изображение с каким-то набором битов, а затем просто «И», «СДВИГ» и / или «ПРОСМОТРЕТЬ», но это выходит за рамки моих текущих возможностей.

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

Я буду очень признателен за любую помощь.

Ответы [ 4 ]

6 голосов
/ 02 марта 2011
1 голос
/ 02 марта 2011

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

Однако, если вы проверяете по изображениям, которые были повернуты, преобразованы в оттенки серого или любые другие виды преобразования, это быстро завершится неудачей.

У меня нет кодадля вас, но есть несколько хороших ресурсов из Generation5 (статьи AI), в частности из курса Mc-Gill University по COMP-644 (распознавание образов) .

Надеюсь, вам понравитсяматематика.

0 голосов
/ 06 июля 2019
Using Aforge framework and Drawing.Imaging, worked for me!

    public static bool CompareBitmaps(Bitmap imageTemplate, Bitmap imagePattern)

    {
        ExhaustiveTemplateMatching tm = new ExhaustiveTemplateMatching(0.9f);
        // find all matchings with specified above similarity
        TemplateMatch[] matchings = tm.ProcessImage(imageTemplate, imagePattern);

        bool retorno = false;

        try
        {
            if (matchings[0].Similarity > 0.95f)
            {
                retorno = true;
            }
        }
        catch (Exception)
        {
            retorno = false;
        }

        return retorno;
    }
0 голосов
/ 02 марта 2011

В дополнение к общим исследованиям сопоставления с образцом

  1. Описание вашей стратегии поиска звучит как алгоритм поиска грубой силы;Можете ли вы применить оптимизированные методы поиска строк (например, Boyer Mooore) к вашей проблеме?
  2. Просмотр вашей схемы и вашего «стога сена» - (быстрый?) поиск серой рамки, прежде чем искать значки, должен улучшитьсяскорость выполнения.
  3. Если вы можете ограничить область ожидания шаблона и предварительно обработать шаблоны, можно использовать концепцию / код OCR.

Конечно, ничто не может побитьбиблиотека, которая делает именно то, что вы хотите.

...