首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AForge ExhaustiveTemplateMatching运行速度极慢

AForge ExhaustiveTemplateMatching运行速度极慢
EN

Stack Overflow用户
提问于 2013-03-02 05:18:55
回答 2查看 6.9K关注 0票数 0

我正在尝试使用AForge框架查找一个图像中另一个图像的坐标:

代码语言:javascript
复制
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像素

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-16 15:47:24

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

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

这个框架并不是最合适的。你要做的事情是更多地在其他图像中搜索图像,而不是比较两个不同分辨率的图像(比如可以使用"Search Google for this image“)。

关于这个,所以

称之为金字塔搜索。

确实,对于较大的图像,该算法的运行速度要快得多。实际上,image-pyramid是基于template matching的。如果我们以最流行的实现(我找到并使用)为例:

代码语言:javascript
复制
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;
    }

它应该会给你一张与这张图片很接近的图片:

作为底线--试着使用不同的方法。也许更接近.NetSikuli integration。或者,您可以尝试AForge的accord .Net更新版本。

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

票数 1
EN

Stack Overflow用户

发布于 2013-03-02 16:13:25

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

根据模板的详细信息,您可以尝试更低的级别(1/8)。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15167054

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档