Быстрый поиск фрагмента картинки - 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;
}