【爬虫】滑块缺口识别

滑块示例

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

下载识别库

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·低代码·pyqt
唐小旭2 小时前
服务器建立-错误:pyenv环境建立后python版本不对
运维·服务器·python
007php0072 小时前
Go语言zero项目部署后启动失败问题分析与解决
java·服务器·网络·python·golang·php·ai编程
Chinese Red Guest3 小时前
python
开发语言·python·pygame
骑个小蜗牛3 小时前
Python 标准库:string——字符串操作
python
黄公子学安全5 小时前
Java的基础概念(一)
java·开发语言·python
程序员一诺6 小时前
【Python使用】嘿马python高级进阶全体系教程第10篇:静态Web服务器-返回固定页面数据,1. 开发自己的静态Web服务器【附代码文档】
后端·python
数据小小爬虫6 小时前
利用Java爬虫获取苏宁易购商品详情
java·开发语言·爬虫
小木_.6 小时前
【Python 图片下载器】一款专门为爬虫制作的图片下载器,多线程下载,速度快,支持续传/图片缩放/图片压缩/图片转换
爬虫·python·学习·分享·批量下载·图片下载器