引言
在图像处理和计算机视觉中,模板匹配是一种常用的技术,用于在一幅较大的图像中查找与给定模板图像相似的部分。然而,在实际应用中,目标物体可能会出现在不同的角度,这就需要我们在匹配之前对模板进行旋转处理。本文将介绍如何使用 OpenCV 进行模板匹配,并演示如何处理旋转模板。
模板匹配原理
模板匹配是通过比较模板图像与目标图像中的每一个可能位置来完成的。OpenCV 提供了多种模板匹配的方法,其中 cv2.matchTemplate
是一个常用函数,它可以计算模板与目标图像之间的相似度。常见的匹配方法包括:
cv2.TM_SQDIFF
:平方差匹配。cv2.TM_CCORR
:相关匹配。cv2.TM_CCOEFF
:相关系数匹配。cv2.TM_CCOEFF_NORMED
:归一化相关系数匹配。
在本文中,我们将使用 cv2.TM_CCOEFF_NORMED
方法进行模板匹配。
实验素材
代码讲解
-
读取图像和转换为灰度图
import cv2 import numpy as np img_rgb = cv2.imread('picture_video/image.jpg') img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY) template = cv2.imread('picture_video/res.jpg', 0)
解释:
- 使用
cv2.imread
读取原始图像和模板图像。 - 将原始图像转换为灰度图
img_gray
,因为模板匹配通常在灰度图上进行。
- 使用
-
旋转模板图像
# 旋转 90 度,k=-1 表示顺时针旋转 90 度 rotated_image1 = np.rot90(template, k=-1) # 旋转 90 度,k=1 表示逆时针旋转 90 度 rotated_image2 = np.rot90(template, k=1)
解释:
- 使用
np.rot90
函数旋转模板图像。k=-1
表示顺时针旋转 90 度,k=1
表示逆时针旋转 90 度。
- 使用
-
获取模板图像的尺寸
h, w = template.shape[:2]
解释:
- 获取模板图像的高度
h
和宽度w
。
- 获取模板图像的高度
-
使用模板匹配方法
cv2.matchTemplate
进行模板匹配res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED) res1 = cv2.matchTemplate(img_gray, rotated_image1, cv2.TM_CCOEFF_NORMED) res2 = cv2.matchTemplate(img_gray, rotated_image2, cv2.TM_CCOEFF_NORMED)
解释:
- 使用
cv2.matchTemplate
函数进行模板匹配,cv2.TM_CCOEFF_NORMED
方法用于计算归一化的相关系数。
- 使用
-
设定匹配阈值并获取匹配结果
threshold = 0.9 loc = np.where(res >= threshold) loc1 = np.where(res1 >= threshold) loc2 = np.where(res2 >= threshold)
解释:
- 设定匹配阈值
threshold
,只有匹配分数大于等于这个阈值的区域才会被认为是匹配成功的位置。 - 使用
np.where
函数获取所有匹配分数大于等于阈值的点的坐标。
- 设定匹配阈值
-
在原图上绘制匹配区域的矩形框
for pt in zip(*loc[::-1]): cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0, 0, 255), 1) for pt in zip(*loc1[::-1]): cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0, 0, 255), 1) for pt in zip(*loc2[::-1]): cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0, 0, 255), 1)
解释:
- 使用
cv2.rectangle
函数在原图img_rgb
上绘制矩形框,标出匹配成功的区域。 - 矩形框的颜色为红色
(0, 0, 255)
,线宽为1
。
- 使用
-
显示结果图像
cv2.imshow('res.jpg', img_rgb) cv2.waitKey(0)
解释:
- 使用
cv2.imshow
显示带有匹配区域的图像。 - 使用
cv2.waitKey(0)
等待用户按键关闭窗口。
- 使用
- 输出结果:
总结
通过上述代码演示,我们展示了如何在 OpenCV 中进行模板匹配,并处理旋转模板。模板匹配是一种基本的图像处理技术,广泛应用于目标检测、图像识别等领域。通过旋转模板,我们可以提高匹配的鲁棒性,即使目标物体在图像中处于不同的角度,也能准确地识别出来。这种方法在实际应用中非常有用,特别是在需要检测旋转目标物体的情况下。