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