Быстрый поиск фрагмента картинки - C#

  1. Подскажите, существуют ли библиотеки, которые помогут мне быстро искать фрагмент изображения на картинке? Размер основной картинки: FullHD Думаю, что FullHD, это очень большая картинка и поиск по ней займет около 1 минуты. Это очень долго. Ну, кто знает какие библиотеки есть для этого случая.


textual

Код к задаче: «Быстрый поиск фрагмента картинки - C#»

    public partial class Form1 : Form
    {
        Template template;
        Bitmap source;
        Point? foundPoint;
 
        public Form1()
        {
            InitializeComponent();
 
            //загружаем изображение
            source = new Bitmap(new WebClient().OpenRead("http://blog.webpixel.co/wp-content/uploads/City-Wallpaper-1080p-371.jpg"));
 
            //уст стандартное DPI
            source.SetResolution(96, 96);
 
            //берем фрагмент из большого изображения
            var fragment = new Bitmap(100, 100);
            using (var gr = Graphics.FromImage(fragment))
                gr.DrawImage(source, -1000, -490);
 
            //создаем шаблон
            template = new Template(fragment);
 
            //отображаем
            pbSource.Image = source;
            pbTemplate.Image = fragment;
        }
 
        private void btFind_Click(object sender, EventArgs e)
        {
            //засекаем время
            var sw = Stopwatch.StartNew();
 
            //ищем шаблон 
            foundPoint = template.Find(source);
 
            //отрисовываем
            lbFindTime.Text = "Find time: " + sw.Elapsed;
            pbSource.Invalidate();
        }
 
        private void pbSource_Paint(object sender, PaintEventArgs e)
        {
            //рисуем рамку, если найдено
            if (foundPoint != null)
            using(var pen = new Pen(Color.Red, 4))
            {
                e.Graphics.DrawRectangle(pen, foundPoint.Value.X, foundPoint.Value.Y, 100, 100);
            }
        }
    }
 
    class Template
    {
        List<ColorPoint> FeaturePoints = new List<ColorPoint>();
 
        public Template(Bitmap template)
        {
            //ищем в шаблоне 10 пикселов с разными цветами, запоминаем в FeaturePoints
            var colors = new HashSet<Color>();
            using (var wr = new ImageWrapper(template))
            foreach (var p in wr)
            {
                var c = wr[p];
                
                if (c != Color.Black || c!= Color.White)//игнорируем банальные цвета
                if (!colors.Contains(c))
                {
                    colors.Add(c);
                    FeaturePoints.Add(new ColorPoint {Color = c, Location = p});
                    if (FeaturePoints.Count > 10) break;
                }
            }
        }
 
        //ищем фрагмент в большом изображении
        public Point? Find(Bitmap source)
        {
            using (var wr = new ImageWrapper(source))
            foreach (var p in wr)
            {
                var c = wr[p];
                if (c == FeaturePoints[0].Color)
                {
                    var offset = new Point(p.X - FeaturePoints[0].Location.X, p.Y - FeaturePoints[0].Location.Y);
                    //проверяем все особые точки
                    foreach (var fp in FeaturePoints)
                    {
                        var pp = fp.Location;
                        pp.Offset(offset);
                        if (wr[pp] != fp.Color)
                            goto next;
                    }
                    return offset;
                }
                next:;
            }
 
            return null;
        }
    }
 
    struct ColorPoint
    {
        public Point Location;
        public Color Color;
    }

СДЕЛАЙТЕ РЕПОСТ

12   голосов, оценка 4.167 из 5



Похожие ответы
  1. Получаю json файл, как сделать, чтобы программа считывала строку из json id:1 и выписывала значение в MessageBox? пытался все сделать на примере api vk не вышло, если мой код не правильный тоже подправьте меня, если не сложно.

  1. Помогите написать программу которая будет искать нужные элементы. Пример есть у нас 50 елементов, 45 с них имеют одинаковое название до 10 символа, а 5 до 9, те 5 названий мне надо. как это реализовать?

  1. Здравствуйте есть задача, я её решил, но не проходит тест (тест онлайн). Подскажите пожалуйста что я не верно сделал? Спасибо! Задание: Suppose we are given two sequences of numbers. All numbers in the first sequence are sorted. For each element from the second sequence print the index where an element must be inserted into the first sequence without breaking the sorting. In case when element b of the second sequence is in the first sequence, the lowest index for element b, which does not break the sorting must be printed. The indexes start from 0. The input data are integer numbers. All numbers are separated by spaces. First number n is a number of members of the first sequence. Next n numbers are elements of the first sequence. Next number m is a number of members of the second sequence. Next m numbers are elements of the second sequence. Input data guarantees that the inputs and the result will be less than 2 147 483 647. Output data must be a number of elements of the second sequence and indexes for each element of the second sequence, where they must be inserted into the first sequence without breaking the sorting. All numbers must be separated by spaces. код:

  1. Здравствуйте. Каким образом можно реализовать частичный поиск на совпадение в определенном слове? Например, мне надо выбрать все слова, которые хотя бы на 70-80% похожи на слово "Режиссер". Т.е., как вариант, слова "режиссёр", "режисер", "режисёр" и т.д. тоже должны подойти под это условие отбора. Заранее я не могу знать все варианты нужных мне слов, только их первоначальный вид, т.е. "Режиссер". Перебирать с использованием метода Contains не выйдет, придется много раз модифицировать код, добавляя в него все новые и новые слова.

  1. Добрый день. Есть код.

  1. Есть ли у кого программка для поиска в ширину/в глубину на графах с использованием матрицы смежности? (С#)

  1. Создать матрицу размером n на m где m и m вводятся с клавиатуры, заполнить ее рандом, найти минимальный и максимальный элемент внутри каждого столбца и колонки и их позиции, найти максимальный и минимальный элемент во всей матрице и его позицию, сделать сортировку матрицы как минимум тремя способами.

  1. Напишите метод который в качестве входных параметров принимает массив целых чисел. Результатом работы метода является индекс максимального элемента массива.

  1. Диапазон идет от 0 до пустой строки "". То есть допустим 1960 и раньше год это 0, 2017 и выше это пустая строка, между ними буква b 0b. будет значить, что поиск нужно вести от начала времен и до сегодняшнего дня. Дальше интереснее, зависимости не нашел, поэтому и спрашиваю, может кто-нибудь увидит ее. У каждой функции в поиске авито, будь то год, пробег и т.п., есть свой префикс, у года он 188_ , то есть чтобы найти допустим года с 1999 по 2004, нужно послать авито вот такие агрументы 188_892b897., точка это как бы переход на следующую функцию, и не обязательна, если следующей функции нет. Вот что у меня получилось, делал с помощью switch Помогите найти закономерность в формировании запроса, а то так слишком громоздко получается.. ((