在图像中查找图标

时间:2016-01-11 00:32:59

标签: opencv computer-vision emgucv aforge

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

我有一个模板图片: enter image description here

和两个测试图像:

enter image description here  和enter image description here

我使用了模板匹配(使用AForge.net,但我认为它与algorthym相同 OpenCV和Emgu使用。我可能是错的,我是CV的新手,并发现在阈值为.80563的情况下,我会在上述两个中找到完全一个匹配,并且在图像中没有匹配,我尝试了图标不在。< / p>

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

enter image description here(正确)和enter image description here(完全错误)

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

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

最终,我需要一些基本的帮助来解决我的匹配问题,这样我才能至少回到正确的方向。模板是否匹配正确的方法,但我需要改变一些东西?或者,我是否需要查看这些库中的其他功能?对于这个简单的任务,OpenCV(和EMGU)功能与AForge.net功能之间是否存在很多功能差异?

2 个答案:

答案 0 :(得分:3)

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

  • 您的模板对于您正在寻找的内容是错误的。在第二张图片中,您会得到不好的结果,因为按钮的灰度值与背景中的某个位置更相似。如果要搜索白色十字,请使用白色十字作为模板,如下所示:

enter image description here

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

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

enter image description here

enter image description here

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

答案 1 :(得分:0)

如果您想要检测只有少量变体的模式,这可能会有点过分。训练haar级联分类器将使您能够更准确地检测这些模式,并且您不必担心阈值。