1. OpenCV多角度模板匹配的核心原理
多角度模板匹配是计算机视觉中常见的任务,比如在工业检测中识别旋转的零件,或者在医疗影像中定位不同角度的器官。传统模板匹配只能处理固定角度的匹配,而多角度匹配需要解决旋转带来的挑战。
OpenCV的matchTemplate函数本身不支持旋转匹配,我们需要自己实现旋转逻辑。核心思路是对模板图像进行多次旋转,每次旋转后都用matchTemplate进行匹配,最后取所有结果中的最佳匹配。这里的关键点在于:
- 旋转处理:每次旋转模板时,需要确保图像内容不会因为旋转而丢失。通常的做法是创建一个足够大的画布(尺寸至少为模板对角线长度),将模板放在中心旋转。
- 匹配方法:常用的匹配方法有
TM_SQDIFF(平方差)、TM_CCORR(相关性)和TM_CCOEFF(相关系数)。对于多角度匹配,TM_CCOEFF_NORMED(归一化相关系数)通常效果最好,因为它对光照变化不敏感。
python复制import cv2
import numpy as np
def multi_angle_template_matching(img, template, angles):
max_val = -1
best_angle = 0
best_loc = (0, 0)
# 创建足够大的画布放置旋转后的模板
diagonal = int(np.sqrt(template.shape[0]**2 + template.shape[1]**2)) + 1
padded_template = np.zeros((diagonal, diagonal), dtype=np.float32)
x_offset = (diagonal - template.shape[1]) // 2
y_offset = (diagonal - template.shape[0]) // 2
padded_template[y_offset:y_offset+template.shape[0], x_offset:x_offset+template.shape[1]] = template
for angle in
