【爬虫】滑块缺口识别

滑块示例

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

下载识别库

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 的值来反映)。
相关推荐
钮钴禄·爱因斯晨2 分钟前
Python常见的文件操作
android·数据库·python
AI小云22 分钟前
【数据操作与可视化】Pandas数据处理-Series数据结构
开发语言·数据结构·python·numpy·pandas
Python大数据分析@34 分钟前
如何理解Python中的yield用法?
python
源码之家1 小时前
基于python新闻数据分析可视化系统 Hadoop 新闻平台 爬虫 情感分析 舆情分析 可视化 Django框架 vue框架 机器学习 大数据毕业设计✅
大数据·爬虫·python·数据分析·毕业设计·情感分析·新闻
IT油腻大叔1 小时前
DeepSeek-多层注意力计算机制理解
python·深度学习·机器学习
小呀小萝卜儿2 小时前
2025-11-17 学习记录--Python-机器学习作业:项目1 - PM2.5预测
python·学习·机器学习
闲人编程2 小时前
CPython与PyPy性能对比:不同解释器的优劣分析
python·算法·编译器·jit·cpython·codecapsule
kk哥88992 小时前
PyCharm 2025.1 是什么编程语言,如何安装
python·php
海拥2 小时前
基于 IPIDEA 的 SERP 结构化数据抽取与趋势监控的工程化实践
python
yivifu2 小时前
EPUB文件HTML批量修改避坑
python·epub·zipfile