opencv - 在图像中查找图标

标签 opencv computer-vision emgucv aforge

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

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

和两个测试图像:

enter image description here
enter image description here

我使用模板匹配(使用AForge.net,但我认为它是相同的算法
OpenCV和Emgu使用的。我可能是错的,我是CV的新手),发现阈值为.80563时,我在以上两个示例中都找到了完全匹配的内容,而在我尝试不使用该图标的图像中未找到匹配的内容。

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

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

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

我正在寻找的

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

  • 最终,我需要一些基本的帮助来解决我的匹配出了什么问题,以便至少可以恢复正确的方向。模板是否匹配正确的方法,但是我需要更改一些内容?还是我需要查看这些库中的其他功能之一?对于这项简单的任务,OpenCV(和EMGU)功能与AForge.net功能之间在功能上有什么不同吗?

    最佳答案

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

  • 您的模板不符合您的要求。在第二张图像中,由于按钮的灰度值与背景中的某个位置更相似,因此效果不佳。如果要搜索白色十字,请使用白色十字作为模板,如下所示:

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

    关于opencv - 在图像中查找图标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34712480/

    相关文章:

    python - 检测和隔离绿色网球 table 板上的线条

    wpf - 在颜色位置获取深度,Kinect SDK

    c# - 用 `new()` 约束类型参数是什么意思?

    machine-learning - 第一个纪元后过度拟合

    python - 如何在openCV中了解Orb输出中关键点和des的格式

    c# - 为什么精确的图像没有精确的描述符?

    python - 在 Ubuntu 16 上安装 openCV 时如何在 cmake 中包含 libgtk2.0-dev 和 pkg-config

    Python Opencv imshow 错误

    python - torch : mask 扩张/延伸

    java - 如何在java中调用CV_L2?