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

Узнай цену своей работы

Формулировка задачи:

Подскажите

, существуют ли

библиотеки

, которые помогут мне быстро

искать фрагмент изображения

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

Решение задачи: «Быстрый поиск фрагмента картинки»

textual
Листинг программы
    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
Похожие ответы