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

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

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

Подскажите

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

библиотеки

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

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

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

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

textual
Листинг программы
  1.     public partial class Form1 : Form
  2.     {
  3.         Template template;
  4.         Bitmap source;
  5.         Point? foundPoint;
  6.  
  7.         public Form1()
  8.         {
  9.             InitializeComponent();
  10.  
  11.             //загружаем изображение
  12.             source = new Bitmap(new WebClient().OpenRead("http://blog.webpixel.co/wp-content/uploads/City-Wallpaper-1080p-371.jpg"));
  13.  
  14.             //уст стандартное DPI
  15.             source.SetResolution(96, 96);
  16.  
  17.             //берем фрагмент из большого изображения
  18.             var fragment = new Bitmap(100, 100);
  19.             using (var gr = Graphics.FromImage(fragment))
  20.                 gr.DrawImage(source, -1000, -490);
  21.  
  22.             //создаем шаблон
  23.             template = new Template(fragment);
  24.  
  25.             //отображаем
  26.             pbSource.Image = source;
  27.             pbTemplate.Image = fragment;
  28.         }
  29.  
  30.         private void btFind_Click(object sender, EventArgs e)
  31.         {
  32.             //засекаем время
  33.             var sw = Stopwatch.StartNew();
  34.  
  35.             //ищем шаблон
  36.             foundPoint = template.Find(source);
  37.  
  38.             //отрисовываем
  39.             lbFindTime.Text = "Find time: " + sw.Elapsed;
  40.             pbSource.Invalidate();
  41.         }
  42.  
  43.         private void pbSource_Paint(object sender, PaintEventArgs e)
  44.         {
  45.             //рисуем рамку, если найдено
  46.             if (foundPoint != null)
  47.             using(var pen = new Pen(Color.Red, 4))
  48.             {
  49.                 e.Graphics.DrawRectangle(pen, foundPoint.Value.X, foundPoint.Value.Y, 100, 100);
  50.             }
  51.         }
  52.     }
  53.  
  54.     class Template
  55.     {
  56.         List<ColorPoint> FeaturePoints = new List<ColorPoint>();
  57.  
  58.         public Template(Bitmap template)
  59.         {
  60.             //ищем в шаблоне 10 пикселов с разными цветами, запоминаем в FeaturePoints
  61.             var colors = new HashSet<Color>();
  62.             using (var wr = new ImageWrapper(template))
  63.             foreach (var p in wr)
  64.             {
  65.                 var c = wr[p];
  66.                
  67.                 if (c != Color.Black || c!= Color.White)//игнорируем банальные цвета
  68.                 if (!colors.Contains(c))
  69.                 {
  70.                     colors.Add(c);
  71.                     FeaturePoints.Add(new ColorPoint {Color = c, Location = p});
  72.                     if (FeaturePoints.Count > 10) break;
  73.                 }
  74.             }
  75.         }
  76.  
  77.         //ищем фрагмент в большом изображении
  78.         public Point? Find(Bitmap source)
  79.         {
  80.             using (var wr = new ImageWrapper(source))
  81.             foreach (var p in wr)
  82.             {
  83.                 var c = wr[p];
  84.                 if (c == FeaturePoints[0].Color)
  85.                 {
  86.                     var offset = new Point(p.X - FeaturePoints[0].Location.X, p.Y - FeaturePoints[0].Location.Y);
  87.                     //проверяем все особые точки
  88.                     foreach (var fp in FeaturePoints)
  89.                     {
  90.                         var pp = fp.Location;
  91.                         pp.Offset(offset);
  92.                         if (wr[pp] != fp.Color)
  93.                             goto next;
  94.                     }
  95.                     return offset;
  96.                 }
  97.                 next:;
  98.             }
  99.  
  100.             return null;
  101.         }
  102.     }
  103.  
  104.     struct ColorPoint
  105.     {
  106.         public Point Location;
  107.         public Color Color;
  108.     }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы