class Program
{
static void Main(string[] args)
{
try
{
Bitmap pic1 = (Bitmap)Bitmap.FromFile(@"C:\SavedBMPs\1new.jpg");
Bitmap pic2 = (Bitmap)Bitmap.FromFile(@"C:\SavedBMPs\2new.jpg");
if (findIN(pic1, pic2))
{
Console.WriteLine("Found\n");
}
else
{
Console.WriteLine("Not Found\n");
}
}
catch(Exception e)
{
Console.WriteLine(e);
}
Console.ReadKey();
}
static bool findIN(Bitmap pic1, Bitmap pic2)
{
bool found = false;
ExhaustiveTemplateMatching tm = new ExhaustiveTemplateMatching(0.91f);
TemplateMatch[] matchings = tm.ProcessImage(pic1, pic2);
BitmapData data = pic1.LockBits( new Rectangle(0, 0, pic1.Width, pic1.Height), ImageLockMode.ReadWrite, pic1.PixelFormat);
foreach (TemplateMatch m in matchings)
{
Drawing.Rectangle(data, m.Rectangle, Color.White);
if (m.Rectangle.Location.X >= 0 && m.Rectangle.Location.Y >= 0)
{
found = true;
Console.WriteLine("Upper Left : { X = " + (m.Rectangle.Location.X) + " , Y = " + (m.Rectangle.Location.Y) + " }");
Console.WriteLine("Bottom Right : { X = "+(m.Rectangle.Location.X + pic2.Width) + " , Y = " + (m.Rectangle.Location.Y + pic2.Height)+" }");
}
}
pic1.UnlockBits(data);
return found;
}
}
此程序在大图像2new.jpg
中查找图像1new.jpg
,然后返回其左上角(起始坐标)和下端下部(结束坐标)。问题在于该程序太慢,需要13.126 ms才能运行(尤其是这一部分:TemplateMatch[] matchings = tm.ProcessImage(pic1, pic2);
)。您有什么想法/建议如何优化此功能?
答案 0 :(得分:1)
如果我正确理解了您的意图。
您正在尝试在图像(pic2
)上找到模板(pic1
)并使用AForge.Net Framework
。
假定尺寸“ pic1”为NxM,尺寸“ pic2”为KxL 所需的乘法总数与 N x M x K x L (大约)成正比,其中'x'为乘法。
pic1
裁剪到步骤1 +边距中找到的区域。并计算出匹配结果。例如,主图像pic1
的尺寸为4000x4000像素,模板“ pic2”的尺寸为100x100像素。
计算总数成比例:
4000 x 4000 x 100 x 100 = 160,000,000,000。
如果首先将大小减小2(按比例缩小),则会得到:
2000 x 2000 x 50 x 50 = 10,000,000,000-表示性能提高160/10 = 16。 (大约)