每日10行代码46:cv2.matchTemplate方法原理最简单解释:寻找相等或相似的子矩阵

    科技2026-04-19  4

    今天研究了下matchTemplate方法,其实原理很简单,在opencv里,会把图片转成由象素点组成的数据,每一个象素点是一个颜色值,如果是rgb三通道的话,那么图像就是一个3维数组,也可以看作是3维矩阵。 模板匹配通俗的说是图片查找,其实在底层就是矩阵查找,如果需要完全匹配呢就是找相等的子矩阵,如果是相似查找呢,就需要找最相似的矩阵,至于怎么确定是否相似这就需要不同的算法了,我也可以人为的定义一个相似度算法,比如我可以定义相同位置值相减差值之和定义位相似度。 定义好相似度后,那么剩下的工作就是循环扫描矩阵,找到符合相似度的矩阵。 扫描矩阵的方法也很简单,相当于开一个滑动小窗,去依次扫过矩阵所有位置,然后依次计算相似度,最后把相似度记录成一个数组,数组的坐标跟小窗的左上角坐标是一样的。

    下面看一个例子: 我用excel弄了个二维矩阵,假如我要找的矩阵是一个2*3的矩阵

    348 191

    那么我就需要从第一行开始依次查找所有位置,最后在f9的位置找到了这个矩阵,同时f9也是最后一次查找的位置 如果我有个算法,可以计算出矩阵的之间的相似度,那么我把这个值存在每次查找小框的最左上角位置,那么就形成了一个相关性的矩阵 在上面这个例子中矩阵的大小就是a1:f9.

    import cv2 as cv import numpy as np from matplotlib import pyplot as plt # 1.模板匹配 img = cv.imread('lenna.jpg', 0) template = cv.imread('eye.png', 0) res = cv.matchTemplate(img, template, cv.TM_CCOEFF_NORMED) print(type(res)) print(res.shape) # plt.imshow(res) # plt.show()

    输出结果:

    <class 'numpy.ndarray'> (509, 1019)

    看了好多人的代码,会把这个相似矩阵展示成图片,其实我觉得这样做意义不大,因为matchTemplate返回的结果就是一个相似度的矩阵,而不是色彩相关信息,所以展示的意义不大,我们只需要知道矩阵最大值最小值的位置就够了。

    Processed: 0.011, SQL: 9