在图像中查找图标

Svd*_*ner 0 opencv computer-vision aforge emgucv

我刚刚开始学习计算机视觉,并且正在从事一个简单的项目,以在静止图像中查找基本图标。

我有一个模板图片: 在此处输入图片说明

和两个测试图像:

在此处输入图片说明在此处输入图片说明

我使用了模板匹配(使用 AForge.net,但我认为它与 OpenCV 和 Emgu 使用的算法相同。我可能是错的,我是 CV 的新手)并发现阈值为 0.80563,我会找到准确的以上两个中的一个匹配,并且在我尝试过的图标不在的图像中没有匹配。

我以为我找到了某个地方,直到我查看了每个图像中作为匹配项返回的内容:(蓝色突出显示的方块是图像匹配的位置。)

在此处输入图片说明 (正确)和 在此处输入图片说明 (完全错误)

我意识到问题是以下任何一项或全部:

  • 我正在寻找的图标在大小、颜色和阴影方面都相似,但不能保证它们在上述任何一个中都相同。(注意:角度方向和比例应该是一致的。我不希望一个带有“+”的圆圈与模板匹配。我也不希望一个带有小“X”的大圆圈匹配。)
  • 我的模板不是正方形,我只是猜测透明像素不会包含在匹配中。
  • 鉴于上述 2 个问题,模板匹配可能是错误的方法。也许我需要使用其他东西来做到这一点?

最终,我需要一些基本的帮助来了解我的匹配出了什么问题,这样我至少可以重新朝着正确的方向前进。模板匹配正确的方法,但我需要改变一些东西吗?或者我是否需要查看这些库中的其他功能之一?对于这个简单的任务,OpenCV(和 EMGU)功能和 AForge.net 功能之间是否有很多功能差异?

Mik*_*iki 5

在这种情况下,模板匹配是正确的选择,但您必须正确执行:

  • 您的模板不符合您的要求。在您的第二张图片中,您的结果很糟糕,因为按钮的灰度值与背景中的某个地方更相似。如果要搜索白十字,则使用白十字作为模板,如下所示:

在此处输入图片说明

  • 不要使用固定阈值,而是搜索最高响应点。

根据这些指南,您可以找到您的按钮(红色小矩形):

在此处输入图片说明

在此处输入图片说明

这是 OpenCV (C++) 中的代码作为示例:

#include <opencv2\opencv.hpp>
using namespace cv;

int main()
{
    // Load template and image
    Mat3b templ = imread("path_to_template");
    Mat3b img = imread("path_to_image");

    // Convert to grayscale
    Mat1b img_gray;
    Mat1b templ_gray;
    cvtColor(img, img_gray, COLOR_BGR2GRAY);
    cvtColor(templ, templ_gray, COLOR_BGR2GRAY);

    // Match template
    Mat1f result;
    matchTemplate(img, templ, result, TM_CCOEFF_NORMED);

    // Find highest response
    Point maxLoc;
    minMaxLoc(result, NULL, NULL, NULL, &maxLoc);

    // Draw the red rectangle
    rectangle(img, Rect(maxLoc, templ.size()), Scalar(0,0,255), 2);

    // Show results
    imshow("Result", img);
    waitKey();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)