【爬虫】滑块缺口识别

滑块示例

分为背景图 和 滑块图 主要目的 识别背景图滑块缺口

下载识别库

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 的值来反映)。
相关推荐
蒙娜丽宁10 分钟前
《Python OpenCV从菜鸟到高手》——零基础进阶,开启图像处理与计算机视觉的大门!
python·opencv·计算机视觉
光芒再现dev12 分钟前
已解决,部署GPTSoVITS报错‘AsyncRequest‘ object has no attribute ‘_json_response_data‘
运维·python·gpt·语言模型·自然语言处理
好喜欢吃红柚子25 分钟前
万字长文解读空间、通道注意力机制机制和超详细代码逐行分析(SE,CBAM,SGE,CA,ECA,TA)
人工智能·pytorch·python·计算机视觉·cnn
小馒头学python30 分钟前
机器学习是什么?AIGC又是什么?机器学习与AIGC未来科技的双引擎
人工智能·python·机器学习
神奇夜光杯39 分钟前
Python酷库之旅-第三方库Pandas(202)
开发语言·人工智能·python·excel·pandas·标准库及第三方库·学习与成长
千天夜1 小时前
使用UDP协议传输视频流!(分片、缓存)
python·网络协议·udp·视频流
测试界的酸菜鱼1 小时前
Python 大数据展示屏实例
大数据·开发语言·python
羊小猪~~1 小时前
神经网络基础--什么是正向传播??什么是方向传播??
人工智能·pytorch·python·深度学习·神经网络·算法·机器学习
放飞自我的Coder1 小时前
【python ROUGE BLEU jiaba.cut NLP常用的指标计算】
python·自然语言处理·bleu·rouge·jieba分词
正义的彬彬侠2 小时前
【scikit-learn 1.2版本后】sklearn.datasets中load_boston报错 使用 fetch_openml 函数来加载波士顿房价
python·机器学习·sklearn