滑块示例
分为背景图 和 滑块图 主要目的 识别背景图滑块缺口
下载识别库
python
pip install opencv
code
python
import numpy as np
import cv2
def identify_gap(bg, tp):
bg1 = np.asarray(bytearray(bg), dtype=np.uint8)
tp1 = np.asarray(bytearray(tp), dtype=np.uint8)
# 灰度
bg_img = cv2.imdecode(bg1, cv2.IMREAD_GRAYSCALE) # 背景图片
tp_img = cv2.imdecode(tp1, cv2.IMREAD_GRAYSCALE) # 缺口图片
# 识别图片边缘
bg_edge = cv2.Canny(bg_img, 100, 200) # 80 255
tp_edge = cv2.Canny(tp_img, 100, 200)
# 识别图片边界(缺口)
bg_pic = cv2.cvtColor(bg_edge, cv2.COLOR_GRAY2RGB)
tp_pic = cv2.cvtColor(tp_edge, cv2.COLOR_GRAY2RGB)
# 缺口匹配
res = cv2.matchTemplate(bg_pic, tp_pic, cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) # 寻找最优匹配
X = max_loc[0] # 缺口的X轴坐标
return X
bg为背景图 图片二进制格式
tp滑块图 图片二进制格式
实例讲解
背景图
滑块图
灰度
python
cv2.imdecode(bg1, cv2.IMREAD_GRAYSCALE)
执行cv2的imdecode方法 cv2.imdecode(buf, flags[, dtype])
- buf: 图像的字节流数据,必须是一个 NumPy 数组,通常是一个 uint8 类型的数组,其内容为图像的原始字节数据。
- flags: 指定如何读取图像。常用的值有:
- cv2.IMREAD_COLOR: 以彩色模式加载图像。任何图像的透明度都会被忽略(这是默认标志)。
- cv2.IMREAD_GRAYSCALE: 以灰度模式加载图像。
- cv2.IMREAD_UNCHANGED: 包括 alpha 通道的加载图像。
- dtype (可选): 输出的数组类型。如果省略,则根据图像的内容自动确定。
示例代码执行灰度 方便后面边界识别
未灰度的边界识别
执行灰度后的边界识别
边界识别
使用cv2.Canny
函数执行边界识别 如图所示成功识别出滑块的边界
python
edges = cv2.Canny(image, threshold1, threshold2)
- image:待检测的灰度图像。
- threshold1:较低的阈值,用于边缘连接。
- threshold2:较高的阈值,用于检测强边缘。
- edges:检测到的边缘图像,与原图大小相同,但数据类型为 uint8。
示例代码当中的cv2.Canny(bg_img, 100, 200)
bg_img为传入的图片(经过灰度化之后的图片)100低阈值 200高阈值 需要根据不同的图片类型进行调整参数大小提高识别率
主要用来识别像素点的颜色变化范围,根据阈值来识别边界
缺口匹配
python
# 缺口匹配
res = cv2.matchTemplate(bg_edge, tp_edge, cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) # 寻找最优匹配
X = max_loc[0] # 缺口的X轴坐标
cv2.matchTemplate
cv2.matchTemplate 是 OpenCV 库中的一个函数,用于在大图像中查找与小图像(或称为模板)匹配的区域。这个函数通过比较模板图像和源图像中所有可能的位置,计算它们之间的相似度或差异度,从而找到最匹配的区域。
python
result = cv2.matchTemplate(image, templ, method[, result[, mask]])
- image:源图像,即要在其中搜索模板的大图像。它可以是任意维度的灰度图像或彩色图像。
- templ:模板图像,即要在源图像中查找的小图像。它必须与源图像具有相同的数据类型和通道数。
- method:指定比较方法的参数,决定了如何计算源图像和模板图像之间的匹配程度。OpenCV 提供了多种匹配方法,如平方差匹配(cv2.TM_SQDIFF)、归一化平方差匹配(cv2.TM_SQDIFF_NORMED)、相关性匹配(cv2.TM_CCORR)、归一化相关性匹配(cv2.TM_CCORR_NORMED)、相关系数匹配(cv2.TM_CCOEFF)和归一化相关系数匹配(cv2.TM_CCOEFF_NORMED)。
- result(可选):用于存储匹配结果的输出图像。如果未提供,则函数将返回一个新的矩阵作为匹配结果。
- mask(可选):一个与模板图像同样大小的矩阵,用于指定感兴趣区域(ROI),只在该区域内进行匹配。
返回值
cv2.matchTemplate 函数返回一个与源图像大小相同的矩阵(或指定的 result 矩阵),其中每个值表示模板与源图像中相应区域的匹配程度。根据使用的匹配方法,可能需要寻找最小值或最大值来确定最佳匹配位置。
cv2.minMaxLoc
查找最佳匹配位置 使用 cv2.minMaxLoc() 函数在匹配结果矩阵中查找最小值或最大值的位置,这取决于使用的匹配方法。
python
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
# (-0.06119127571582794, 0.5630423426628113, (66, 16), (74, 13))
- min_val:这是结果矩阵(result)中的最小值。根据你所使用的模板匹配方法,这个最小值可能表示最差的匹配(例如,在使用平方差匹配方法时),或者在某些情况下,它可能只是表示矩阵中的最小数值,而不直接对应于最佳或最差的匹配。
- max_val:这是结果矩阵(result)中的最大值。对于大多数模板匹配方法,这个最大值通常表示最佳匹配的位置。例如,在使用相关性匹配(cv2.TM_CCORR)或归一化相关性匹配(cv2.TM_CCORR_NORMED)时,较高的值表示较好的匹配;而在使用平方差匹配(cv2.TM_SQDIFF)或归一化平方差匹配(cv2.TM_SQDIFF_NORMED)时,较低的值(因此是结果矩阵中的较大值,因为它们是差值的负数)表示较好的匹配。但是,由于 cv2.minMaxLoc() 返回的是正值,所以你总是会在使用平方差匹配时查找最大值来找到最佳匹配。
- min_loc:这是一个元组,表示结果矩阵中最小值的位置(即 (x, y) 坐标)。这个位置可能对于某些分析是有用的,但在模板匹配中,它通常不是关注的重点。
- max_loc:这也是一个元组,表示结果矩阵中最大值的位置(即 (x, y) 坐标)。这个位置对应于模板在源图像中的最佳匹配位置。你可以使用这个位置来在原图上绘制一个矩形框,标记出模板匹配的区域。
在模板匹配中,max_val 和 max_loc 是最常用的两个返回值,因为它们直接帮助你找到模板在源图像中的最佳匹配位置和该匹配的相似度度量(通过 max_val 的值来反映)。