OpenCV笔记24:在Python中使用OpenCV进行模板匹配

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值