目录
单模板匹配
匹配过程中只用到一个模板场景叫做单模板匹配.
原始图像中可能只有一个和模板相似的图像,也可能有多个,如果只获取匹配程度最高的哪一个结果,这种操作叫做单目标匹配。
如果需要同时获取所有匹配程度较高的结果,这种操作叫做多目标匹配单目标匹配只获取一个结果即可,就是匹配程度最高的结果。
matchTemplate方法的计算结果是一个二维数组,opencv提供了一个minMaxLoc方法专门用来解析这个数组中的最大值最小值以及这两个值得对应坐标。平方差匹配的计算结果越小,匹配程度越高。
minMaxLoc方法返回得minValue 值就是模板匹配的最优结果,minloc就是最优结果区域左上角得点坐标,区域大小与模板大小一致。
模板匹配方法
result = cv2.matchTemplate(img,templ,method,mask)
img:原始图像
templ:模板图像
method:匹配方法
mask:掩模
result:匹配的结果
匹配方法:
参数值 | 值 | 含义 |
---|---|---|
cv2.TM_sQDIFF | 0 | 差值平方和匹配,也叫平方差匹配。可以理解为差异程度。匹配程度越高,计算结果越小。完全匹配的结果为O。 |
cv2.TM_sQDIFF_NORMED | 1 | 标准差值平方和匹配,也叫标准平方差匹配,规则同上。 |
cv2.TM_CCORR | 2 | 相关匹配。可以理解为相似程度,匹配程度越高,计算结果越大。 |
cv2.TM_CCORR_NORMED | 3 | 标准相关匹配,规则同上。 |
cv2.TM_cCOEFF | - | 相关系数匹配,也属于相似程度,计算结果为-1~1的浮点数,1表示完全匹配,0表示毫无关系,-1表示2张图片亮度刚好相反。 |
cv2.TM_CCOEFF_NORMED | - | 标准相关系数匹配,规则同上。 |
单目标匹配
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(ret)
ret :是cv2.matchTemplate()返回的矩阵;
min_val :最小值
max_val:最大值
min_loc:最小值对应的图像中的位置
max_loc:最大值对应的图像中的位置
实例:站台数量统计
import cv2
img = cv2.imread(r"D:\Program Files (x86)\PyCharmProject\pythonProject\video-face\image1\105\image.png")
templ = cv2.imread(r"D:\Program Files (x86)\PyCharmProject\pythonProject\video-face\image1\105\templ.png")
h,w,c =templ.shape
results = cv2.matchTemplate(img,templ,cv2.TM_CCOEFF_NORMED)
station_Num = 0
for y in range(len(results)):
for x in range(len(results[y])):
if results[y][x]>0.99:
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
station_Num+=1
cv2.putText(img,"The stations number is "+str(station_Num),(0,30),cv2.FONT_HERSHEY_COMPLEX_SMALL,1,(0,0,255),1)
cv2.imshow("result",img)
cv2.waitKey()
cv2.destroyAllWindows()
总结:
今天学习了单模板和多模板匹配的方法,利用单模板可以实现单个目标和多目标的匹配。多模板匹配实际上就是进行了n次都但模板多目标匹配的操作。
可以模板匹配,匹配合照照片查找某人员。或者进行物品识别等。