一、多模板匹配
在实际生活中,要搜索的模板图像很有可能在图像中出现多次,这个时候就需要多次匹配结果,上文提到的函数cv2.minMaxLoc()只能找到最值及位置,无法匹配多个信息,因此设计过程进行多次匹配。
二、匹配过程
(1)获取匹配位置
利用np.where函数可以找出满足条件索引值
import numpy as np
#给定任意矩阵
a=np.array([3,6,8,1,2,88])
#选择出矩阵中大于5的数值的索引
b=np.where(a>5)
print(b)
结果
(array([1, 2, 5], dtype=int64),)
(2)循环
因为要处理多个数据,需要用到循环关系,常见的循环用到的for或者while,在博主的其他文章中也有所涉及,如果存在不会请移步去学习。
python初级:基础知识学习-循环、列表、元组、集合、字典https://blog.csdn.net/wp215501547/article/details/117361476?spm=1001.2014.3001.5501
这次主要涉及到一个新函数zip()
**zip()**将对象中对应的元素打包成一个个元组,然后返回这些元组组成的列表
x=[1,2,3]
y=[4,5,6]
z=[7,8,9]
t=(x,y,z)
print(t)
for i in zip(*t):
print(i)
结果
([1, 2, 3], [4, 5, 6], [7, 8, 9])
(1, 4, 7)
(2, 5, 8)
(3, 6, 9)
import numpy as np
am=np.array([[3,6,8,77,66],[1,2,88,3,98],[11,2,67,5,2]])
print(am)
b=np.where(am>5)
for i in zip(*b):
print(i)
结果:
[[ 3 6 8 77 66]
[ 1 2 88 3 98]
[11 2 67 5 2]]
(0, 1)
(0, 2)
(0, 3)
(0, 4)
(1, 2)
(1, 4)
(2, 0)
(2, 2)
(3)调整坐标
进行坐标的行列互换
loc=([1,2,3,4],[11,12,13,14])
print(loc)
print(loc[::-1])
结果
([1, 2, 3, 4], [11, 12, 13, 14])
([11, 12, 13, 14], [1, 2, 3, 4])
(4)标记匹配图像位置
利用cv2.rectangle()标记图像具体位置
cv2.rectangle(img ,x,y,colour,line)
img: 图像
x:起始点
y:终点(起始点的对角点)
colour:颜色
line:线条粗细
三、代码演示
import cv2
import numpy as np
from matplotlib import pyplot as plt
img=cv2.imread('E:/Literature/material/6_11.jpg',0)
template=cv2.imread('E:/Literature/material/6_11_1.jpg',0)
w,h=template.shape[::-1]
res=cv2.matchTemplate(img,template,cv2.TM_CCOEFF_NORMED)
print(res)
threshold=0.9
loc=np.where(res>=threshold)
print(loc)
for pt in zip(*loc[::-1]):
cv2.rectangle(img,pt,(pt[0]+w,pt[1]+h),255,3)
plt.imshow(img,cmap='gray')
plt.xticks([]),plt.yticks([])
plt.show()
[[ 0.12059908 0.09813836 0.09739019 ... 0.03928253 0.03882339
0.03929812]
[ 0.1135476 0.08880164 0.08768394 ... 0.03025172 0.02909074
0.03022301]
[ 0.10448074 0.07675777 0.07575679 ... 0.02096571 0.01981555
0.02131838]
...
[-0.0055013 -0.02686769 -0.02247263 ... 0.29248947 0.29297742
0.29329336]
[-0.01761664 -0.03848638 -0.03440642 ... 0.26776022 0.26913023
0.27004105]
[-0.03042962 -0.05165558 -0.04673047 ... 0.24571162 0.24762924
0.2489468 ]]
(array([238, 242], dtype=int64), array([ 464, 1127], dtype=int64))
四、参考文献
Opencv轻松入门,面向python,电子工业出版社,李立宗著