0

我正在尝试使用 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 像素

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

4

2 回答 2

1

作为其他答案的补充,对于您的情况,我想说:

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

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

关于这个

称为金字塔搜索。

确实,对于更大的图像,该算法的运行速度更快。实际上图像金字塔是基于模板匹配的。如果我们采用最流行的实现(我发现并使用过):

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;
    }

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

页面金字塔

作为底线 - 尝试使用不同的方法。也许更接近Sikuli.Net的集成。或者你可以试试accord .Net较新版本的AForge。

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

于 2015-04-16T07:47:24.407 回答
0

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

根据模板详细信息,您可以尝试使用更低的比例(1/8)。

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

于 2013-03-02T08:13:25.063 回答