《OpenCV计算机视觉》—— 通过旋转模板图像匹配多个目标区域
文章目录
- 一、匹配的整体思路
- 二、代码实现
一、匹配的整体思路
- 下面是一张需要进行模板匹配的图片
- 模板图片如下
- 通过观察可以发现,需要进行匹配的图片中,有与模板图片不同方向的目标区域,有逆时针90度的目标区域,还有顺时针90度的目标区域
- 因此只通过模板图片来进行模板匹配的话,并不能将所有的目标区域都匹配成功
- 所以我们需要将模板图片进行不同方向的旋转,旋转至能够满足所有目标区域的匹配
- 将每个方向的模板图片都在需要匹配的图片中进行模板匹配,直至匹配完所有的目标区域
二、代码实现
-
步骤如下:
- 1.读取需要进行模板匹配的图片和模板图片
- 2.将模板图片进行不同方向上的旋转
- 3.用所有方向的模板图片进行模板匹配
- 4.在原图片中画出所有匹配成功后布标区域的矩形框
- 5.显示最后的结果
-
图片的旋转方法可以通过以下链接内容进行理解:
- https://blog.csdn.net/weixin_73504499/article/details/142070536?spm=1001.2014.3001.5501
-
模板匹配的方法可以通过以下链接内容进行理解:
- https://blog.csdn.net/weixin_73504499/article/details/141905861?spm=1001.2014.3001.5501
-
代码如下:
import cv2 import numpy as np# 读取需要进行模板匹配的原图 img_rgb = cv2.imread('image.jpg') # 将原图转换为灰度图,为了减少后续操作的复杂程度(可选) img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGRA2RGB) # 读取模板图片 template = cv2.imread('tem.jpg') # 获取模板图片的宽高 h, w = template.shape[:2]# 将模板图片进行旋转 rotated_image = cv2.rotate(template, cv2.ROTATE_90_CLOCKWISE) # 顺时针旋转90度 rotated_image1 = cv2.rotate(template, cv2.ROTATE_90_COUNTERCLOCKWISE) # 逆时针旋转90度# 将模板图片和旋转后的模板图片都存放在一个列表中 list_pic = [template, rotated_image, rotated_image1]# 循环 list_pic 列表中各个方向的模板,使用模板匹配方法 cv2.matchTemplate 进行模板匹配 for i in list_pic:res = cv2.matchTemplate(img_gray, i, cv2.TM_CCOEFF_NORMED)# 设定匹配阈值threshold = 0.9# 获取匹配结果中所有的符合阈值的点的坐标loc = np.where(res >= threshold)# 遍历所有匹配点# loc 是一个元组类型,loc[::-1] 将 [(y y...y),(x x...x)] --> [(x x...x),(y y...y)]# zip(*) 函数将 [(x x...x),(y y...y)] --> [(x,y), (x,y)...(x,y)]# 利用 * 操作符,可以将可迭代对象解压为独立参数for pt in zip(*loc[::-1]):# 在原图上绘制匹配区域的矩形框cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0, 0, 255), 1)# 显示最后的结果 cv2.imshow('res_png', img_rgb) cv2.waitKey(0)
-
结果如下: