本次识别过程中,由于模板的大小识别的物体不精确,导致识别误差较大。
为了避免由于模板导致的误差,本次读取的模板后对模板进行一定比例的缩放,在去匹配模板,大大提高了识别的准确率。
模板匹配实现过程:
1.准备模板图片以及所要匹配的图片:
2.缩放模板。
3.模板匹配。
4.设置阈值(六种模板匹配算法的阈值有所偏差,其中'cv2.TM_SQDIFF', 'cv2.TM_SQDIFF_NORMED'的阈值越小代表月相似,而'cv2.TM_CCOEFF_NORMED', 'cv2.TM_CCORR','cv2.TM_CCORR_NORMED','cv2.TM_CCOEFF'的阈值越大代表越相似)
5.若阈值符合设置标准,绘制匹配物体的图片。
6.显示绘制好的图片。
7.若阈值未达到要求,改变模板大小重新匹配,重复以上2-7步,知道绘制出完成的图片。
import cv2
import numpy as np
# 读取图片,彩色模式
img_color = cv2.imread('523.jpg',cv2.IMREAD_COLOR)
# 读取图片,灰度模式
img_gray = cv2.imread('523.jpg',cv2.IMREAD_GRAYSCALE)
# 读取人脸模板图片,灰度模式
template = cv2.imread('555.png',cv2.IMREAD_GRAYSCALE)
print(template.shape)
mylist = np.random.uniform(0.1,2,50)
for i in mylist:
w, h = template.shape[::-1]
print(w,h,"666666666")
ww = int(w*i)
hh = int(h*i)
template1 = cv2.resize(template,(ww,hh))
w, h = template1.shape[::-1]
print(w,h,"7777")
methods = ['cv2.TM_CCOEFF_NORMED']
# 遍历匹配方法
for meth in methods:
# 拷贝图片
img_color2 = img_color.copy()
img_gray2 = img_gray.copy()
# 把字符串转换成代码
method = eval(meth)
# 模板匹配
res = cv2.matchTemplate(img_gray2,template1,method)
# 获取匹配结果的最大、最小值,及其位置
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
print(min_val )
print(max_val)
print(min_loc)
print(max_loc)
if max_val > 0.9:
print("ok")
# TM_SQDIFF 和 TM_SQDIFF_NORMED匹配方法:值越小,越相似
if method in [cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED]:
# 取最小值位置,作为矩形框左上角位置
top_left = min_loc
print("******")
else:
# 取最大值位置,作为矩形框左上角位置
top_left = max_loc
print("-------")
# 根据模板尺寸计算出:矩形框右下角位置
bottom_right = (top_left[0] + w, top_left[1] + h)
# 画矩形框
cv2.rectangle(img_color2,top_left, bottom_right, 255, 2)
# 显示画好矩形框的图片
cv2.namedWindow(meth, cv2.WINDOW_AUTOSIZE)
cv2.imshow(meth,img_color2)
# 等待退出键
cv2.waitKey(0)
else:
print(i)
pass
# 销毁显示窗口
cv2.destroyAllWindows()