2024免费推广网站,教育app开发,wordpress按照视频,网站建设模块一项目三文章目录 前言1.导入库2.图片预处理3.输出模板图片的宽和高4.模板匹配5.获取匹配结果中所有符合阈值的点的坐标5.1 threshold 0.9#xff1a;5.2 loc np.where(res threshold)#xff1a; 6.遍历所有匹配点6.1 loc 的结构回顾6.2 loc[::-1] 的作用6.2.1 为什么需要反转… 文章目录 前言1.导入库2.图片预处理3.输出模板图片的宽和高4.模板匹配5.获取匹配结果中所有符合阈值的点的坐标5.1 threshold 0.95.2 loc np.where(res threshold) 6.遍历所有匹配点6.1 loc 的结构回顾6.2 loc[::-1] 的作用6.2.1 为什么需要反转 6.3 zip(*loc[::-1]) 的作用 7.画出模板匹配矩形框7.1 功能7.2 参数详解7.3 关键细节7.4 常见问题 8.运行结果9. 总结 前言
上文《OpenCV 模板匹配方法详解》我们详细介绍了模板匹配这一方法本文我们来介绍一下模板与多个对象匹配的方法。
其中有很多的函数需要我们来详细介绍接下来我们直接看代码讲解
1.导入库
import cv2
import numpy as np导入opencv库和numpy库 2.图片预处理
img_rgb cv2.imread(image.jpg)
img_gray cv2.cvtColor(img_rgb,cv2.COLOR_BGR2GRAY)
template cv2.imread(tem.jpg,0)导入图片并转化为灰度图导入的图片如下图所示左图为匹配图片右图为模板图片 3.输出模板图片的宽和高
h,w template.shape[:2]template.shape假设 template 是一个 NumPy 数组通常是图像数据.shape 属性会返回数组的维度信息。对于图像通常返回 (高度, 宽度, 通道数)如果是灰度图则只有 (高度, 宽度)[:2]切片操作取前两个元素例如对于彩色图像 (480, 640, 3)取前两个值得到 (480, 640)h, w …元组解包将前两个值分别赋值给变量 h (height/高度) 和 w (width/宽度)
所以这行代码的作用是获取模板图像的高度和宽度分别存入变量 h 和 w 中。 4.模板匹配
# 使用模板匹配方法 cv2.matchTemplate 进行模板匹配
res cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED)功能
模板匹配在 img_gray灰度图像中滑动 template模板图像计算每个位置的 相似度并返回一个 相似度矩阵 res。匹配方法cv2.TM_CCOEFF_NORMED 是 归一化相关系数匹配取值范围 [-1, 1]越接近 1 表示匹配度越高。
返回值 res
res 是一个 二维浮点型数组大小 (img_h - template_h 1, img_w - template_w 1)因为模板不能超出原图边界每个 res[y, x] 表示模板在 (x, y) 处的匹配得分。 5.获取匹配结果中所有符合阈值的点的坐标
# 设定匹配阈值
threshold 0.9
# 获取匹配结果中所有符合阈值的点的坐标
loc np.where(res threshold) #(符合条件的行符合条件的列)5.1 threshold 0.9
功能
设定一个 匹配阈值只有 res 中 ≥ 0.9 的点才被认为是有效匹配。
调整建议
阈值越高如 0.95匹配越严格漏检率可能增加。阈值越低如 0.8匹配越宽松但可能误检。
5.2 loc np.where(res threshold)
功能
查找所有匹配度 ≥ threshold 的坐标返回它们的 行列索引。loc 是一个 元组包含两个数组 loc[0]所有匹配点的 Y 坐标行索引loc[1]所有匹配点的 X 坐标列索引示例 假设 res 如下
res [[0.1, 0.3, 0.7],[0.8, 0.95, 0.6], # (1,1) 0.95 ≥ 0.9[0.4, 0.9, 0.2] # (2,1) 0.9 ≥ 0.9
]执行 loc np.where(res 0.9) 后
loc (array([1, 2]), array([1, 1])) # 匹配点(Y1,X1), (Y2,X1)注意loc 是一个元组格式为 (y_coords, x_coords)所以先返回的是Y值再返回的是X值 6.遍历所有匹配点
for pt in zip(*loc[::-1]):这段代码 for pt in zip(*loc[::-1]): 是 模板匹配后处理 的关键部分用于遍历所有匹配到的目标位置并调整坐标顺序以适应 OpenCV 的绘图要求。下面详细解析它的作用
6.1 loc 的结构回顾
在之前的代码中
loc np.where(res threshold)loc 是一个元组格式为 (y_coords, x_coords)所以先返回的是Y值再返回的是X值
6.2 loc[::-1] 的作用
loc[::-1] 的作用loc[::-1] 对元组进行 反向切片将 (y_coords, x_coords) 变成 (x_coords, y_coords)。 例如
loc (array([1, 2]), array([3, 4]))
loc[::-1] (array([3, 4]), array([1, 2]))
# 现在顺序是 (x, y)6.2.1 为什么需要反转
OpenCV 的坐标系统使用 (x, y)列在前行在后而 np.where() 返回的是 (y, x)因此需要交换顺序。
6.3 zip(*loc[::-1]) 的作用
*loc[::-1] 解包 元组相当于
zip(array([3, 4]), array([1, 2]))zip() 将两个数组按元素配对生成可迭代的 (x, y) 坐标对
for pt in zip(*loc[::-1]):print(pt) # 输出(3, 1), (4, 2)最终效果 遍历所有匹配点每次循环的 pt 是一个 (x, y) 坐标元组可以直接用于 OpenCV 绘图函数如 cv2.rectangle()。 7.画出模板匹配矩形框
cv2.rectangle(img_rgb,pt,(pt[0] w,pt[1] h),(0,0,255),1)这段代码 cv2.rectangle(img_rgb, pt, (pt[0] w, pt[1] h), (0, 0, 255), 1) 是 OpenCV 中用于在图像上绘制矩形的函数具体含义如下 7.1 功能
在图像 img_rgb 上以 pt 为左上角起点绘制一个 宽度为 w、高度为 h 的红色矩形框边框粗细为 1 像素。 7.2 参数详解
参数含义示例img_rgb要绘制矩形的目标图像RGB 格式从 cv2.imread()读取的图像pt矩形的 左上角坐标 (x, y)(50, 100) 表示从图像的第 50 列、第 100 行开始(pt[0] w, pt[1] h)矩形的 右下角坐标如果 pt(50,100)w30h20则右下角是 (80, 120)(0, 0, 255)矩形颜色BGR 格式(0,0,255)表示纯红色1矩形边框的粗细像素1 表示 1 像素宽-1表示填充矩形 7.3 关键细节 坐标顺序 OpenCV 使用 (x, y) 坐标其中 x 是水平方向列索引从左到右递增y 是垂直方向行索引从上到下递增 颜色格式 (0, 0, 255) 是 BGR 格式不是 RGB所以这里表示红色。常见颜色示例 红色(0, 0, 255)绿色(0, 255, 0)蓝色(255, 0, 0) 矩形尺寸 w 和 h通常是模板图像的宽度和高度通过 template.shape[:2] 获取。如果 w 或 h 超出图像边界OpenCV 会报错。 7.4 常见问题 为什么矩形颜色不对 检查颜色是否是 BGR 格式例如红色应为 (0, 0, 255)而非 RGB 的 (255, 0, 0)。 如何调整矩形样式 修改参数 边框粗细2 表示更粗的边框-1 表示填充矩形。颜色(255, 0, 0) 是蓝色(0, 255, 0) 是绿色。 8.运行结果 9. 总结
到这里本篇博客就结束啦感谢大家的阅读最近一直在坚持每天写博客当作是一个叙说心得的地方在这个过程中自己通过不断的回顾之前所学习的内容发现很多细节地方之前都没有注意到通过再一次的回顾增添了很多收获这真的就是“温故而知新”这句话现实化了。最后希望大家能一直朝着自己理想的方向努力。越努力越幸运