我如何使用OpenCV MatchTemplate?

时间:2012-03-14 20:18:58

标签: python opencv image-processing computer-vision

我试图在另一个中找到一个图像。

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存储“比较结果图”。我试过打印它,但它给了我宽度,高度和步数。

如何使用此信息查找某个图像是否位于另一个图像/所在位置?

2 个答案:

答案 0 :(得分:11)

MatchTemplate返回相似度图而不是位置。 然后,您可以使用此地图查找位置。

如果你只是在寻找一个匹配,你可以做这样的事情来获得一个位置:

minVal,maxVal,minLoc,maxLoc = cv.MinMaxLoc(result)

然后minLoc具有最佳匹配的位置,minVal描述模板的匹配程度。您需要为minVal设置一个阈值,以确定您是否认为此结果是匹配。

如果您要为每张图片寻找多个匹配项,则需要使用非最大限制等算法。

答案 1 :(得分:7)

这可能适合你! :)

def FindSubImage(im1, im2):
    needle = cv2.imread(im1)
    haystack = cv2.imread(im2)

    result = cv2.matchTemplate(needle,haystack,cv2.TM_CCOEFF_NORMED)
    y,x = np.unravel_index(result.argmax(), result.shape)
    return x,y

CCOEFF_NORMED只是众多比较方法中的一种。 请参阅:http://docs.opencv.org/doc/tutorials/imgproc/histograms/template_matching/template_matching.html 完整列表。

不确定这是否是最好的方法,但速度很快,对我来说效果很好! :)