赞
踩
图像匹配原理
将face与lena对应的位置相匹配。
对比:计算"face"与"lena"中的差别程度,并存放于一个矩阵中,矩阵大小为(w1-w2+1 , h1-h2+1)。(计算方法见API)
返回值res:存放差别程度的矩阵。
参数1:img:"lena"图像
参数2:template:"face"图像
参数3:计算方法(如下图)
尽量采用归一化的方法,更准确
图片摘自模板匹配方法
算法详情参考长命百岁的博客
参数: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)
|
|
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。