opencv初学(图像11)

图像匹配

图像匹配原理

将face与lena对应的位置相匹配。

对比:计算"face"与"lena"中的差别程度,并存放于一个矩阵中,矩阵大小为(w1-w2+1 , h1-h2+1)。(计算方法见API)

API
res=cv2.matchTemplate(img,template,cv2.TM_CCOEFF_NORMED)

返回值res:存放差别程度的矩阵。

参数1:img:"lena"图像

参数2:template:"face"图像

参数3:计算方法(如下图)

尽量采用归一化的方法,更准确

图片摘自模板匹配方法

算法详情参考长命百岁的博客

min_val,max_val,min_loc,max_loc=cv2.minMaxLoc(res)

参数:min_val,max_val,min_loc, max_loc 分别表示最小值,最大值,以及最小值和最大值对应的图像中的位置。res即cv2.matchlemplate的返回值 。

代码
"""
    图像匹配
"""
import cv2
import matplotlib.pyplot as plt
import numpy as np

def cv_show(name,image):
    cv2.imshow(name,image)
    cv2.waitKey()
    cv2.destroyAllWindows()

img=cv2.imread('D:/BaiduNetdiskDownload/opencv/lena.png',0)
template=cv2.imread('D:/BaiduNetdiskDownload/opencv/lena_face.png',0)

#匹配
res=cv2.matchTemplate(img,template,cv2.TM_CCOEFF_NORMED)
min_val,max_val,min_loc,max_loc=cv2.minMaxLoc(res)
cv_show('1',res)
# print(max_val,min_val)
#绘制矩形
img2=img.copy()
top_left=max_loc
h,w=template.shape[0:2]
bottom_right=(top_left[0]+w,top_left[1]+h)
cv2.rectangle(img2,top_left,bottom_right,(0,0,255),2)
cv_show('2',img2)

多个图像匹配

多个图像与单个差不多,区别在于:单个图像取得是最值,而多个图像超过某个阈值即可判定为匹配。

代码
#匹配多个对象
img_rgb=cv2.imread('D:/BaiduNetdiskDownload/opencv/mario.png')
img_gray=cv2.cvtColor(img_rgb,cv2.COLOR_RGB2GRAY)
trick=cv2.imread('D:/BaiduNetdiskDownload/opencv/mario_trick.png',0)
h,w=trick.shape[:2]

res2=cv2.matchTemplate(img_gray,trick,cv2.TM_CCOEFF_NORMED)
cv_show('9',res2)
threshold=0.7#阈值
img_copy=img_rgb.copy()
#取匹配度大于0.9的
loc=np.where(res2>=threshold)
for pt in zip(*loc[::-1]):#*表示可选对象
    bottom_right=(pt[0]+w,pt[1]+h)
    cv2.rectangle(img_copy,pt,bottom_right,(0,0,255),2)
    
cv_show('111',img_copy)

这个for循环for pt in zip(*loc[::-1]):没看懂,请各位大佬来解答[哭]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值