参考书目:《OpenCV计算机视觉基础教程》–夏帮贵。
代码编写:Jupyter Notebook。
# 模板匹配:在当前图像中查找与目标图像最相近的部分;
# 图像分割:将前景对象从图像中分割或提取出来;
# 模板匹配:让模板图像在输入图像中滑动,逐像素遍历整个图像进行比较,查找与模板图像最匹配的部分;
# 1.单目标匹配:输入图像中只存在一个可能匹配结果;
# 语法格式:result = cv2.matchTemplate(image, templ, method)
# 参数说明:
# a.image:输入图像,必须为8位或32位浮点类型;
# b.temp1:模板图像,不能大于image,且数据类型要和image相同;
# c.method:匹配方法
# c.1:cv2.TM_SQDIFF:以方差结果为依据进行匹配;完全匹配时结果为0,否则为一个很大的值;
# c.2:cv2.TM_SQDIFF_NORMED:标准(归一化)方差匹配;
# c.3:cv2.TM_CCORR:相关匹配,将输入图像与模板图像相乘,乘积越大匹配度越高,乘积为0时匹配度最低;
# c.4:cv2.TM_CCORR_NORMED:标准(归一化)相关匹配;
# c.5:cv2.TM_CCOEFF:相关系数匹配,将输入图像与其均值的相关值和模板图像与其均值的相关值进行匹配;
# 结果为1时,表示完美匹配;结果为-1时,表示糟糕匹配;结果为0时,表示没有任何相关性;
# c.6:cv2.TM_CCOEFF_NORMED:标准(归一化)相关系数匹配;
# d.result:返回结果;若输入图像大小为:W×H,模板图像大小为:w×h,则result大小为:(W - w + 1) × (H - h + 1);
# 其中的每个值都表示对应位置的匹配结果;
# cv2.minMaxLoc()函数处理匹配结果
# 语法格式:minVal,maxVal,minLoc,maxLoc = cv2.minMaxLoc(src)
# 参数说明:
# a.src:cv2.matchTemplate()函数返回的结果;
# b.minVal:src中的最小值,不存在时可以为NULL;
# c.maxVal:src中的最大值,不存在时可以为NULL;
# d.minLoc:src中最小值的位置,不存在时可以为NULL;
# e.maxLoc:src中最大值的位置,不存在时可以为NULL;
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
img1 = cv.imread("fuxi_qrcode.jpg")
temp = cv.imread("qrcode.JPG") # 模板图像
cv.imshow("Original", img1)
cv.imshow("Template", temp)
img1gray = cv.cvtColor(img1, cv.COLOR_BGR2GRAY, dstCn = 1)
tempgray = cv.cvtColor(temp, cv.COLOR_BGR2GRAY, dstCn = 1)
h, w = tempgray.shape # 获取模板图像的高度和宽度
res = cv.matchTemplate(img1gray, tempgray, cv.TM_SQDIFF) # 执行模板匹配
plt.imshow(res, cmap = "gray")
plt.title("matching result")
plt.axis("off")
plt.show()
min_val, max_val, min_loc, max_loc = cv.minMaxLoc(res) # 返回最值和位置
top_left = min_loc
bottom_right = (top_left[0] + w, top_left[1] + h)
cv.rectangle(img1, top_left, bottom_right, (255, 0, 0), 2)
cv.imshow("Detected Range", img1)
cv.waitKey(0)
# 2.多目标匹配
# 多目标匹配:输入图像中存在多个可能的匹配结果;
import cv2 as np
import numpy as np
import matplotlib.pyplot as plt
img1 = cv.imread("fuxi_qrcode1.jpg")
temp = cv.imread("qrcode.JPG")
cv.imshow("Original", img1)
cv.imshow("qrcode", temp)
img1gray = cv.cvtColor(img1, cv.COLOR_BGR2GRAY, dstCn = 1)
tempgray = cv.cvtColor(temp, cv.COLOR_BGR2GRAY, dstCn = 1)
img1h, img1w = img1gray.shape
th, tw = tempgray.shape
res = cv.matchTemplate(img1gray, tempgray, cv.TM_SQDIFF_NORMED)
mloc = []
threshold = 0.24
for i in range(img1h - th):
for j in range(img1w - tw):
if res[i][j] <= threshold:
mloc.append((j, i))
for pt in mloc:
cv.rectangle(img1, pt, (pt[0] + tw, pt[1] + th), (255, 0, 0), 2)
cv.imshow("result", img1)
cv.waitKey(0)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)