目录
引言一、匹配方法二、匹配单个对象三、匹配多个对象引言
什么是模板匹配呢?
(资料图片仅供参考)
看到这里大家是否会觉得很熟悉的感觉涌上心头!在人脸识别是不是也会看见等等。
模板匹配可以看作是对象检测的一种非常基本的形式。使用模板匹配,我们可以使用包含要检测对象的“模板”来检测输入图像中的对象。
一、匹配方法
cv2.matchTemplate(img, templ, method)
参数:(img: 原始图像、temple: 模板图像、method: 匹配度计算方法)
方法如下:
cv2.TM_SQDIFF: 计算平方差,计算结果越小,越相关
公式:
cv2.TM_CCORR: 计算相关性,计算出来的值越大,越相关
公式:
cv2.TM_CCOEFF: 计算相关系数,计算出的值越大,越相关
公式:
cv2.TM_SQDIFF_NORMED: 计算归一化平方差,计算结果越接近0,越相关
公式:
cv2.TM_CCORR_NORMED: 计算归一化相关性,计算结果越接近1,越相关
公式:
cv2.TM_CCOEFF_NORMED: 计算归一化相关系数,计算结果越接近1,越相关
公式:
二、匹配单个对象
img代表原始图像,template代表模板窗口,1默认为cv2.TM_SQDIFF方法
res = cv2.matchTemplate(img, template, 1)
获取结果的最值和最值位置(最值位置是左上角的坐标位置,通过模板的宽和高可以在原图上把模板位置画出来)
min_val,max_val,min_loc,max_loc = cv2.minMaxLoc(res)
完整的代码:
import cv2 import numpy as np import matplotlib.pyplot as plt def cv_show(name,img): cv2.imshow(name,img) cv2.waitKey(0) cv2.destroyAllWindows() img=cv2.imread("C:/Users/bwy/Desktop/7.png",0) template=cv2.imread("C:/Users/bwy/Desktop/8.png",0) methods=["cv2.TM_CCOEFF","cv2.TM_CCOEFF_NORMED","cv2.TM_CCORR","cv2.TM_CCORR_NORMED" ,"cv2.TM_SQDIFF","cv2.TM_SQDIFF_NORMED"] for meth in methods: img3=img.copy() method=eval(meth) print(meth) res1=cv2.matchTemplate(img,template,method) min_val,max_val,min_loc,max_loc = cv2.minMaxLoc(res1) if method in [cv2.TM_SQDIFF,cv2.TM_SQDIFF_NORMED]: top_left=min_loc else: top_left=max_loc bottom_right=(top_left[0]+w,top_left[1]+h) #俩矩形 cv2.rectangle(img3,top_left,bottom_right,255,2) plt.subplot(121),plt.imshow(res1,cmap="gray") plt.xticks([]),plt.yticks([])#隐藏坐标轴 plt.subplot(122),plt.imshow(img3,cmap="gray") plt.xticks([]),plt.yticks([])#隐藏坐标轴 plt.suptitle(meth) plt.show()
结果如图所示:
多次实验你会发现归一的方法更准确。
三、匹配多个对象
1.导包构建函数
import cv2 import numpy as np import matplotlib.pyplot as plt def cv_show(name,img): cv2.imshow(name,img) cv2.waitKey(0) cv2.destroyAllWindows()
2.读入图像转灰度图,改大小。
im=cv2.imread("C:/Users/bwy/Desktop/9.png") TE=cv2.imread("C:/Users/bwy/Desktop/10.png",cv2.IMREAD_GRAYSCALE) im1=cv2.resize(im,(600,337)) cv_show("im",im1) img_=cv2.cvtColor(im1,cv2.COLOR_BGR2GRAY) TE=cv2.resize(TE,(60,60)) TE.shape
3.图像匹配
h,w=TE.shape[:2] r=cv2.matchTemplate(img_,TE,cv2.TM_CCOEFF_NORMED) cv_show("r",r)
结果如图所示:
4.取匹配程度大于75%的坐标,画在原图上
其中:zip(*) 可理解为解压,返回二维矩阵式。loc中loc[0]是高,loc[1]是宽,[::-1]表示倒序。p[0]代表宽,p[1]代表高
threshold=0.75 loc=np.where(r>=threshold) for pt in zip(*loc[::-1]):#*代表可选参数 bottom_right=(pt[0]+w,pt[1]+h) cv2.rectangle(im1,pt,bottom_right,(0,0,255),1) cv_show("im1",im1)
结果如图所示:
到此这篇关于Python+Opencv实现图像模板匹配详解的文章就介绍到这了,更多相关Python Opencv图像模板匹配内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
X 关闭
X 关闭
- 15G资费不大降!三大运营商谁提供的5G网速最快?中国信通院给出答案
- 2联想拯救者Y70发布最新预告:售价2970元起 迄今最便宜的骁龙8+旗舰
- 3亚马逊开始大规模推广掌纹支付技术 顾客可使用“挥手付”结账
- 4现代和起亚上半年出口20万辆新能源汽车同比增长30.6%
- 5如何让居民5分钟使用到各种设施?沙特“线性城市”来了
- 6AMD实现连续8个季度的增长 季度营收首次突破60亿美元利润更是翻倍
- 7转转集团发布2022年二季度手机行情报告:二手市场“飘香”
- 8充电宝100Wh等于多少毫安?铁路旅客禁止、限制携带和托运物品目录
- 9好消息!京东与腾讯续签三年战略合作协议 加强技术创新与供应链服务
- 10名创优品拟通过香港IPO全球发售4100万股 全球发售所得款项有什么用处?