AForge ExhaustiveTemplateMatching工作极其缓慢

时间:2013-03-01 21:18:55

标签: c# .net image-processing aforge

我试图使用AForge框架找到另一个图像的坐标:

ExhaustiveTemplateMatching tm = new ExhaustiveTemplateMatching();
TemplateMatch[] matchings = tm.ProcessImage(new Bitmap("image.png"), new Bitmap(@"template.png"));
int x_coordinate = matchings[0].Rectangle.X; 

ProcessImages大约需要2分钟才能完成。

图像的大小约为1600x1000像素 模板的大小约为60x60像素

有谁知道如何加快这个过程?

2 个答案:

答案 0 :(得分:0)

对于最近的CPU而言,2分钟似乎太多,图像是您正在使用的模板尺寸。但是有几种方法可以加快这个过程。第一个是使用较小的比例。这称为金字塔搜索。您可以尝试将图像和模板除以4,这样您将拥有400x250的图像和15x15的模板,并匹配此较小的模板。这将运行得更快,但也不太准确。然后,您可以使用15x15模板中找到的有趣像素,使用60x60模板搜索1600x1000图像中的相应像素,而不是搜索整个图像。

根据模板细节,您可以尝试更低的比例(1/8)。

要知道的另一件事是更大的模板运行得更快。这是违反直觉的,但是使用更大的模板,您将需要更少的像素来进行比较。因此,如果可能的话,尝试使用更大的模板。如果您的模板已经尽可能大,那么有时这种优化是不可能的。

答案 1 :(得分:0)

除了其他答案之外,我会说你的情况:

  

图像的大小约为1600x1000像素模板的大小约为60x60像素

这个框架不是最合适的。您要尝试实现的更多是在其他图像中搜索图像,而不是比较具有不同分辨率的两个图像(例如“可以使用Google搜索此图像”)。

关于这个

  

称为金字塔搜索。

对于更大的图像,算法运行速度更快。实际上image-pyramid基于template matching。如果我们采用最流行的实现(我发现并使用):

private static bool IsSearchedImageFound(this Bitmap template, Bitmap image)
    {
        const Int32 divisor = 4;
        const Int32 epsilon = 10;

        ExhaustiveTemplateMatching etm = new ExhaustiveTemplateMatching(0.90f);

        TemplateMatch[] tm = etm.ProcessImage(
            new ResizeNearestNeighbor(template.Width / divisor, template.Height / divisor).Apply(template),
            new ResizeNearestNeighbor(image.Width / divisor, image.Height / divisor).Apply(image)
            );

        if (tm.Length == 1)
        {
            Rectangle tempRect = tm[0].Rectangle;

            if (Math.Abs(image.Width / divisor - tempRect.Width) < epsilon
                &&
                Math.Abs(image.Height / divisor - tempRect.Height) < epsilon)
            {
                return true;
            }
        }

        return false;
    }

它应该给你一张接近这张照片的照片:

page pyramid

作为底线 - 尝试使用不同的方法。可能与Sikuli更接近integration .Net。或者您可以尝试accord .Net更新版本的AForge。

如果这工作太多,您可以尝试通过裁剪所需的页面元素来扩展屏幕截图功能(Selenium example)。