python - 如何读取matchTemplate的结果(Python中的OpenCV2)

标签 python opencv image-processing opencv-python template-matching

以下代码实际上是我立即打印出的结果:

result = cv.matchTemplate(haystack_img, needle_img, cv.TM_SQDIFF_NORMED
图片尺寸:
  • haystack_img = 27x16
  • needle_img = 7x7

  • 但是,我真的不明白这意味着什么。
    enter image description here

    最佳答案

    输出为您提供了一个响应图像,其大小为21 x 10,其中7 x 7 needle_img模板在图像上从左到右,从上到下滑动,并提取了与该模板重合的每个7 x 7窗口,计算相关性。注意输出尺寸的减小。它比搜索图像小,因为假定模板完全适合图像内部。
    但是,您选择的度量是距离度量(cv2.TM_SQDIFF_NORMED)。对于此响应图像中的每个元素,它为您提供了模板和每个窗口之间的差异。赋予最小值的位置意味着,如果将模板的左上角放在此位置,则模板将与图像最匹配。
    以下是一些代码,将绘制一个边界框,其中模板在干草堆图像中最匹配:

    result = cv2.matchTemplate(haystack_img, needle_img, cv.TM_SQDIFF_NORMED)
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
    top_left = min_loc
    w, h = (7, 7)
    bottom_right = (top_left[0] + w, top_left[1] + h)
    img_to_show = haystack_img.copy()
    cv2.rectangle(img_to_show, top_left, bottom_right, 255, 2)
    cv2.imshow("Result", img_to_show)
    cv2.waitKey(0)
    
    运行模板匹配,然后使用cv2.minMaxLoc查找最小和最大值以及它们在图像中的位置。给定您正在使用的方法(距离),我们想使用最小值的位置。 min_loc将提供模板最匹配位置的左上角的列和行坐标。我们根据模板的尺寸创建右下角的坐标,然后创建图像的新副本,并在该图像上绘制一个白色矩形,以表明您是最匹配的模板,然后在最后显示图像。

    关于python - 如何读取matchTemplate的结果(Python中的OpenCV2),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64084943/

    相关文章:

    python - 使用opencv中的轮廓检测来检测视网膜图像中的视盘?

    algorithm - 通过低带宽连接上的补丁程序增量传输大图像

    python - 如何从 Scollector 运行外部收集器?

    visual-c++ - 与VC++编译器标志等效的g++编译器标志

    c++ - 估算边绘图的平均边厚

    c++ - OpenCV 边缘增强

    c - 我想在 OpenCV 中将图像转换为铅笔草图

    python - 从其他实例属性派生的类实例属性

    python - 使用 Enigma Catalyst 检索 Bittrex 交换的分钟频率数据时出错

    python - 如何在列表中的字典中搜索值