在 Python 中实现“小图缩放后匹配大图”,核心是用 OpenCV 库,先对小图(模板图)进行多尺度缩放,再用模板匹配算法在大图中寻找最佳匹配位置。

核心步骤(附代码)

1. 读取图像:加载大图(目标图)和小图(模板图),并转为灰度图(减少计算量,提升匹配效率)。

2. 多尺度缩放模板:循环缩小/放大模板图(模拟不同尺寸匹配场景),计算每次缩放后的模板尺寸。

3. 模板匹配:对每个缩放后的模板,用  cv2.matchTemplate()  计算与大图的匹配度,记录最佳匹配的位置和相似度。

4. 绘制匹配结果:在大图上用矩形框标出最佳匹配区域。

完整代码示例

python

import cv2
import numpy as np

# 1. 读取图像(替换为你的图片路径)

big_img = cv2.imread("big_image.jpg") # 大图(目标图)
small_img = cv2.imread("small_image.jpg") # 小图(模板图)

# 转为灰度图(模板匹配需单通道图像)

big_gray = cv2.cvtColor(big_img, cv2.COLOR_BGR2GRAY)
small_gray = cv2.cvtColor(small_img, cv2.COLOR_BGR2GRAY)

# 获取模板图原始尺寸

small_h, small_w = small_gray.shape
best_score = 0 # 最佳匹配相似度(0~1,越高越匹配)
best_loc = (0, 0) # 最佳匹配位置(左上角坐标)
best_scale = 1.0 # 最佳匹配时的模板缩放比例

# 2. 多尺度缩放模板(这里设置缩放范围:0.5~2倍,步长0.1,可根据需求调整)

for scale in np.arange(0.5, 2.1, 0.1):

# 缩放模板图(INTER_LINEAR 适合缩小,INTER_CUBIC 适合放大)
scaled_small = cv2.resize(
    small_gray,
    dsize=(int(small_w * scale), int(small_h * scale)),
    interpolation=cv2.INTER_CUBIC
)
scaled_h, scaled_w = scaled_small.shape

# 跳过比大图还大的缩放模板(避免报错)
if scaled_h > big_gray.shape[0] or scaled_w > big_gray.shape[1]:
    continue

# 3. 模板匹配(TM_CCOEFF_NORMED 输出归一化相关系数,范围[-1,1],1表示完全匹配)
result = cv2.matchTemplate(big_gray, scaled_small, cv2.TM_CCOEFF_NORMED)
# 找到当前缩放模板的最大匹配值和对应位置
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)

# 更新最佳匹配(只保留相似度更高的结果)
if max_val > best_score:
    best_score = max_val
    best_loc = max_loc
    best_scale = scale

# 4. 计算最佳匹配区域的右下角坐标

best_h = int(small_h * best_scale)
best_w = int(small_w * best_scale)
top_left = best_loc
bottom_right = (top_left[0] + best_w, top_left[1] + best_h)

# 5. 在大图上绘制匹配框(绿色框,线宽2)

cv2.rectangle(big_img, top_left, bottom_right, (0, 255, 0), 2)

# 添加匹配相似度文字(左上角显示)

cv2.putText(

big_img, f"Score: {best_score:.2f}",
(top_left[0], top_left[1] - 10),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 1

)

# 显示结果(按任意键关闭窗口)

cv2.imshow("Matching Result", big_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

# (可选)保存结果图

cv2.imwrite("matching_result.jpg", big_img)
 

关键说明

  • 匹配算法选择:代码中用  TM_CCOEFF_NORMED (归一化相关系数),适合大多数场景;若小图和大图亮度差异大,可尝试  TM_SQDIFF_NORMED (归一化平方差,值越小越匹配)。
  • 缩放范围:需根据实际场景调整  np.arange(0.5, 2.1, 0.1) ,步长越小匹配越精准,但计算时间越长。
  • 相似度阈值:若需过滤低相似度匹配(如避免误检),可在最后添加判断(例: if best_score > 0.7: 才绘制匹配框 ),阈值需根据图像特点调试。

在思科交换机上,可以使用命令行或图形化界面来查看某个端口的模式,具体方法如下:

  • 命令行方式[__LINK_ICON]:进入特权模式后,使用 show interfaces <接口类型及编号> switchport 命令查看。例如,要查看端口GigabitEthernet0/1的模式,输入 show interfaces GigabitEthernet0/1 switchport ,命令执行后会显示端口的模式信息,如“Administrative Mode: static access”表示端口为Access模式,若为“Administrative Mode: trunk”则表示为Trunk模式。
  • 图形化界面方式[__LINK_ICON]:若交换机支持相关管理软件,如Cisco FindIT Network Management,可以登录其管理界面,选择“Port Management(端口管理)”,点击要查看的端口,在显示的端口信息中即可查看端口模式等相关配置。

将思科交换机的端口从Access端口转换为Trunk端口,可参照以下步骤[__LINK_ICON]:

1. 进入特权模式:登录交换机后,输入 enable 命令,进入特权模式,此时命令行提示符会从 Switch> 变为 Switch# 。
2. 进入全局配置模式:在特权模式下,输入 configure terminal 命令,进入全局配置模式,命令行提示符变为 Switch(config)# 。
3. 选择目标接口:使用 interface <接口类型及编号> 命令,进入要转换模式的接口配置模式。例如,要配置GigabitEthernet0/1接口,输入 interface GigabitEthernet0/1 ,命令行提示符变为 Switch(config - if)# 。
4. 设置端口模式为Trunk:输入 switchport mode trunk 命令,将接口模式设置为Trunk。
5. (可选)指定允许通过的VLAN:默认情况下,Trunk端口允许所有VLAN的数据通过。若想限制允许通过的VLAN,可使用 switchport trunk allowed vlan {add | all | except | remove}  命令。例如,只允许VLAN 10和VLAN 20通过,可输入 switchport trunk allowed vlan 10,20 。
6. (可选)禁用DTP协商:若要禁用动态中继协议(DTP)协商,可输入 switchport nonegotiate 命令,增强端口模式的稳定性。
7. 保存配置:确认配置无误后,使用 end 命令返回特权模式,再输入 copy running - config startup - config 命令保存配置。

将思科交换机的端口设置为Trunk端口,可通过以下步骤进行[__LINK_ICON]:

1. 进入特权模式:登录交换机后,输入 enable 命令,进入特权模式。

2. 进入全局配置模式:在特权模式下,输入 configure terminal 命令。

3. 选择接口:使用 interface <接口名称> 命令,进入要设置为Trunk的接口配置模式。例如,要配置GigabitEthernet0/1接口,输入 interface GigabitEthernet0/1 。

4. 设置接口为Trunk模式:输入 switchport mode trunk 命令,将接口强制设置为Trunk模式。

5. (可选)配置封装类型:默认情况下,思科交换机通常使用IEEE 802.1Q封装。如果需要更改,可使用 switchport trunk encapsulation <封装类型> 命令,常见的封装类型有 isl (思科专有)和 dot1q (IEEE标准)等。如设置为802.1Q封装,命令为 switchport trunk encapsulation dot1q 。

6. (可选)配置允许通过的VLAN:默认情况下,Trunk端口允许所有VLAN的数据通过。若要限制允许通过的VLAN,可使用 switchport trunk allowed vlan {add | all | except | remove}  命令。例如,只允许VLAN 10和VLAN 20通过,命令为 switchport trunk allowed vlan 10,20 。

7. 保存配置:确认配置无误后,使用 end 命令返回特权模式,再输入 copy running - config startup - config 命令保存配置。

将思科交换机的端口设置为Trunk端口,可通过以下步骤进行[__LINK_ICON]:

1. 进入特权模式:登录交换机后,输入 enable 命令,进入特权模式。

2. 进入全局配置模式:在特权模式下,输入 configure terminal 命令。

3. 选择接口:使用 interface <接口名称> 命令,进入要设置为Trunk的接口配置模式。例如,要配置GigabitEthernet0/1接口,输入 interface GigabitEthernet0/1 。

4. 设置接口为Trunk模式:输入 switchport mode trunk 命令,将接口强制设置为Trunk模式。

5. (可选)配置封装类型:默认情况下,思科交换机通常使用IEEE 802.1Q封装。如果需要更改,可使用 switchport trunk encapsulation <封装类型> 命令,常见的封装类型有 isl (思科专有)和 dot1q (IEEE标准)等。如设置为802.1Q封装,命令为 switchport trunk encapsulation dot1q 。

6. (可选)配置允许通过的VLAN:默认情况下,Trunk端口允许所有VLAN的数据通过。若要限制允许通过的VLAN,可使用 switchport trunk allowed vlan {add | all | except | remove}  命令。例如,只允许VLAN 10和VLAN 20通过,命令为 switchport trunk allowed vlan 10,20 。

7. 保存配置:确认配置无误后,使用 end 命令返回特权模式,再输入 copy running - config startup - config 命令保存配置。