使用python,利用模板匹配,找到摄像头所获取图像中的模板,在此过程中,要求模板具有旋转和尺度适应性,最后在图中标记出模板位置,输出范围和坐标,写出完整代码
时间: 2024-02-20 15:00:27 浏览: 81
Python开发之基于模板匹配的信用卡数字识别功能
好的,针对您的问题,我可以为您提供以下完整的 Python 代码,用于在摄像头所获取图像中找到模板并输出位置和范围:
```python
import cv2
import numpy as np
# 定义模板图像路径和待匹配图像路径
template_path = "template.jpg"
image_path = 0 # 0 表示默认摄像头
# 定义模板匹配函数
def match_template(template, image):
# 定义尺度空间范围
scale_range = np.linspace(0.2, 1.0, 20)[::-1]
# 定义旋转角度范围
rotation_range = np.arange(-30, 30, 5)
# 定义最大匹配值和对应的位置
max_val = 0
max_loc = None
# 遍历所有尺度和旋转角度
for scale in scale_range:
for angle in rotation_range:
# 构造旋转矩阵
M = cv2.getRotationMatrix2D((template.shape[1] / 2, template.shape[0] / 2), angle, scale)
# 进行仿射变换
template_scaled = cv2.warpAffine(template, M, (template.shape[1], template.shape[0]))
# 计算匹配值
result = cv2.matchTemplate(image, template_scaled, cv2.TM_CCOEFF_NORMED)
min_val, local_max_val, min_loc, max_loc = cv2.minMaxLoc(result)
# 更新最大匹配值和对应位置
if local_max_val > max_val:
max_val = local_max_val
max_loc = max_loc
# 返回最大匹配值和对应位置
return max_val, max_loc
# 加载模板图像
template = cv2.imread(template_path, 0)
# 打开默认摄像头
cap = cv2.VideoCapture(image_path)
# 循环读取摄像头图像
while(True):
# 读取摄像头图像
ret, frame = cap.read()
# 将摄像头图像转为灰度图
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 执行模板匹配操作
max_val, max_loc = match_template(template, gray)
# 在图中标记模板位置
cv2.rectangle(frame, max_loc, (max_loc[0] + template.shape[1], max_loc[1] + template.shape[0]), (0, 0, 255), 2)
# 输出范围和坐标
print("Template found with maximum value of %.3f at (%d, %d) - (%d, %d)" % (max_val, max_loc[0], max_loc[1], max_loc[0] + template.shape[1], max_loc[1] + template.shape[0]))
# 显示结果图像
cv2.imshow('frame', frame)
# 等待键盘输入,按下 q 键退出循环
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放摄像头并关闭所有窗口
cap.release()
cv2.destroyAllWindows()
```
以上代码会打开默认摄像头并循环读取摄像头图像,在每一帧图像中执行模板匹配操作,找到模板并在图中标记出来,同时输出模板范围和坐标。当按下 q 键后,程序会退出循环并释放摄像头,关闭所有窗口。
阅读全文