2016-01-11 117 views
0

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

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

和两个测试图像:

enter image description hereenter image description here

我用模板匹配(使用AForge.net,但我认为这是相同的OpenCV和Emgu使用的algorthym ,我可能是错的,我是新来的CV),发现在.80563的阈值下,我会发现上面两个确切的匹配,并且在我尝试的图像中没有匹配那个ico n为不

我以为我找到感觉,直到我看了什么返回随着比赛的每个图像中:(蓝色突出显示的方框是该图像的匹配。)

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

我意识到这个问题是任何或全部:

  • 图标我正在寻找将在大小,颜色和阴影类似,但没有瓜尔在上述任何情况下,他们都是相同的。 (注意:角度方向和比例应该是一致的,我不想要一个带有“+”的圆圈来匹配模板,我也不想要一个带有小“X”的巨大圆圈来匹配。)
  • 我的模板不是正方形,我只是猜测透明像素不会包含在比赛中。
  • 考虑到上述两个问题,模板匹配可能是错误的方法。也许我需要使用别的东西来做到这一点?

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

回答

3

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

  • 你的模板是错误的,你在找什么。在第二张图片中,由于按钮的灰色值与背景中的某个位置更加相似,因此结果不佳。如果你想搜索的白色十字,然后用一个白色十字架作为tamplate,就像这样:

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; 
} 
+0

谢谢!像魅力一样工作! – SvdSinner

+0

#Miki所以,在睡觉之后,让我看看我是否在这里提炼出一般概念:对于一个好的模板,我想使用最独特的功能,使用最少量的(不太明显的)环境?确切地说, – SvdSinner

+0

。在你的情况下,你不是在寻找一个白色十字,而是在内部有一个白色十字的灰色sh区域。因此,即使它们没有内部交叉,你对灰色sh区域的反应也最高。 – Miki

0

这可能会结束如果你想检测只有少数变化的模式,就杀了。训练haar级联分类器将使您能够更准确地检测这些模式,并且不必担心阈值。