Быстрый поиск фрагмента картинки - 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;
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д