我该如何使用OpenCV中的MatchTemplate?

14

我正在尝试在另一张图片中找到一个图像。

im = cv.LoadImage('1.png', cv.CV_LOAD_IMAGE_UNCHANGED)
    tmp = cv.LoadImage('e1.png', cv.CV_LOAD_IMAGE_UNCHANGED)
    w,h = cv.GetSize(im)
    W,H = cv.GetSize(tmp)
    width = w-W+1
    height = h-H+1
    result = cv.CreateImage((width, height), 32, 1)
    cv.MatchTemplate(im, tmp, result, cv.CV_TM_SQDIFF)
    print result
当我运行这段代码时,一切都正常执行,没有出现错误。但是我不确定接下来该怎么做。文档说明result存储"比较结果的映射"。我尝试打印它,但它给出了图像的宽度、高度和步长信息。
我该如何使用这些信息找出一个图像是否在另一个图像中/以及它在哪里?

1
为了让您更轻松地使用OpenCV,请尝试SimpleCV。它是OpenCV模块的包装器,使它们易于使用:http://simplecv.org/ - Blender
2个回答

13

请注意,无论模板图像是否存在,此代码将始终返回x,y。我建议改用阈值来判断。 - Alexis Drakopoulos

12

MatchTemplate返回的是相似度图,而不是位置信息。你可以使用这张图来找到位置。

如果你只想要单个匹配,可以像下面这样获取位置信息:

minVal,maxVal,minLoc,maxLoc = cv.MinMaxLoc(result)
然后,minLoc 指向最佳匹配位置,minVal 描述了模板匹配的程度。你需要设置一个 minVal 的阈值来决定该结果是否匹配。
如果你想在图像中找到多个匹配项,你需要使用非极大值抑制等算法。

那么,如果我使用的方法记录了maxLoc处的最佳匹配,我应该查看的是maxVal吗? - Lightsout

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