在一个较大的图像中快速查找一个较小的图像

4
无论如何让这件事快些?因为现在对于大小为1024x768的源图像和50x50左右的模板,需要大约6秒。使用AForge,如果有人知道其他更快且简单的方法,请提供。我试图完成的任务是在屏幕截图中找到一个较小的图像。最好能够快速完成,我的限制是1秒钟。我要寻找的图像是一个红色矩形简单图像,而屏幕截图则更加复杂。
System.Drawing.Bitmap sourceImage = (Bitmap)Bitmap.FromFile(@"C:\SavedBMPs\1.jpg");
System.Drawing.Bitmap template = (Bitmap)Bitmap.FromFile(@"C:\SavedBMPs\2.jpg");
// create template matching algorithm's instance
// (set similarity threshold to 92.5%)

ExhaustiveTemplateMatching tm = new ExhaustiveTemplateMatching(0.921f);
// find all matchings with specified above similarity

TemplateMatch[] matchings = tm.ProcessImage(sourceImage, template);
// highlight found matchings

BitmapData data = sourceImage.LockBits(
    new Rectangle(0, 0, sourceImage.Width, sourceImage.Height),
    ImageLockMode.ReadWrite, sourceImage.PixelFormat);
foreach (TemplateMatch m in matchings)
{

        Drawing.Rectangle(data, m.Rectangle, Color.White);

    MessageBox.Show(m.Rectangle.Location.ToString());
    // do something else with matching
}
sourceImage.UnlockBits(data);

图片示例无法提供:它说我需要超过10的声望才能这样做。目前我只有4。 - Mandah Mr.
我已经为你的两个问题点赞,所以现在你有10+的声望了。你现在可以发布图片了吗? - SynerCoder
有一个白色的矩形,而其中间的红色矩形就是我在寻找的。 - Mandah Mr.
@SynerCoder,感谢Syner支持我的声誉。 - Mandah Mr.
请做一件Syner所做的事情,这样这个问题就会保持相关性,虽然有类似的问题,但它们都没有得到答案。 - Mandah Mr.
显示剩余4条评论
1个回答

2

FastMatchTemplate - 这里提供了一种有趣的想法来加速模板匹配,即通过两个步骤进行匹配,首先尝试匹配下采样图像,当找到匹配时,在较小的搜索区域内匹配原始图像。

此外,matchTemplate函数是opencv中模板匹配的实现方式。该函数已经移植到了GPU上,可以显著提高速度。

请参见以下链接

matchTemplate函数

OpenCV GPU - 关于移植到GPU上的OpenCV功能。


服务器上的 GPU 可能存在问题。很遗憾,FE 托管服务器和几乎没有 VPS 可以访问 GPU。 - TomTom
1
你是正确的,无论如何,从第一个链接进行下采样的技巧可以在不使用GPU实现的情况下获得足够的加速。 - Michael Kupchick
@MichaelKupchick 哇……这是很重的东西……我需要更多有关图像的想法,谢谢你欣赏。我不知道现在是否有效,但让我检查一下,如果匹配,我会投票支持你的答案。希望不要太久。 - Mandah Mr.
@MichaelKupchick 对不起让你等这么久,我不知道是否正确,但我理解的思路是将原始图像分解成较小的图像以提高搜索时间,对吗? - Mandah Mr.
不,这个想法是将原始图像和模板下采样(使其变小但内容相同),然后如果你找到了较小的模板,就可以计算出在原始图像上的模板区域,并进行精细调整搜索。 - Michael Kupchick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接