1、学习目标
如何使用OpenCV Python进行模板匹配。
模板匹配是一种在较大图像中搜索和查找模板图像位置的方法。
2、使用的函数方法
cv.matchTemplate()
np.where()
3、程序
import cv2
import numpy as np
img = cv2.imread("messi5.jpg")
grey_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
template = cv2.imread("messi_face.jpg", 0)
w, h = template.shape[::-1]
res = cv2.matchTemplate(grey_img, template, cv2.TM_CCORR_NORMED )
print(res)
threshold = 0.99;
loc = np.where(res >= threshold) #res>=99%
print(loc)
for pt in zip(*loc[::-1]):
cv2.rectangle(img, pt, (pt[0] + w, pt[1] + h), (0, 0, 255), 2)
cv2.imshow("img", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
程序例子功能:在梅西的照片中搜索梅西的面部。
先准备好一张梅西的脸部照片
我们使用模板匹配函数,
使用matchTemplate在原始图像中查找并匹配图像模板中的内容,并设置阈值,即在另一张梅西的照片上找到梅西的脸,
并用红色的矩形方框标出来
结果如下
程序中的函数讲解:
(1)
返回从x或y中选择的元素,具体取决于条件。
numpy.where(condition[, x, y])
参数:
condition : array_like,bool
如果为真,则产生x,否则产生y。
x,y : array_like
要从中选择的值。x,y和条件需要可以播放到某种形状。
返回:
out : ndarray
包含x中元素的数组,其中condition为True,其他元素来自y。
(2)Python zip() 函数
将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
zip([iterable, ...])
参数说明
iterabl -- 一个或多个迭代器;
(3)
模板匹配函数
工作原理:
(a)先准备两张图片
源图像(I) : 期望找到与模板图像匹配的图像
模板图像(T):将与模板图像进行比较的补丁图像
(b)目标是检测最匹配的区域
(c)要识别匹配区域,我们必须通过滑动来比较模板图像与源图 像:
通过滑动,即一次移动补丁一个像素(从左到右,从上到下)。在每个位置,计算度量,以便它表示在该位置处的匹配的“好”还是“坏”(或者与图像的特定区域相似)。
对于T的每个位置超过I,则存储在该度量结果矩阵 R 。R中的每个位置(x,y)都包含匹配度量
上面的图片是一个度量tm_ccorr_normed滑动补丁结果R。最亮的位置表示最高匹配。如您所见,红色圆圈标记的位置可能是具有最高值的位置,因此这个位置(由点形成的矩形,角度和宽度和高度等于补丁图像)被认为是匹配。
result = cv2.matchTemplate(image, templ, method[, result])
参数
image——原始图片
必须为8-bit or 32-bit
templ——模板图片
size 不能大于image,且格式需一致
method——比对的方法
result——比较的结果
格式为numpy.ndarray (dtype=float32)
image 大小为 W×H ,templ 为 w×h ,
大小为 (W−w+1)×(H−h+1)
在带检测图像上,从左到右,从上向下计算模板图像与重叠子图像的匹配度,匹配程度越大,两者相同的可能性越大。
输入两张影像,分别为image、template
不断滑动template,得到image 上各个位置的比较值,比较值代表相似程度然后将image 左上角位置,作为result 比较值的存放位置
完成后可得到result
https://www.w3cschool.cn/opencv/opencv-pswj2dbc.html