基于cv2识别图像实现jd滑动块验证

news2024/11/16 2:49:22

这里写目录标题

    • 出现条件:
    • 解决方案:
    • 获取滑动的距离
    • 滑动验证

本教程无任何意向,纯纯的技术娱乐

虽然小概率出现问题,加入重试机制后,基本没出现过问题
注意:这里获取的距离与实际的距离不相同,本人是1920*1020的,但是与web中的比例为0.78
实际的值为(x - 13) * 281 / 360 这里的 - 13 是为了做矩形的补偿在10-13之间

出现条件:

  1. 短时间内多次失败
  2. 异常环境情况
  3. 未知

解决方案:

通过保存滑动图片,将图片进行灰度化,然后进行二值化,将图片变成黑白,获取所有矩形,并进行过滤,然后进行补偿机制

在这里插入图片描述
在这里插入图片描述

获取滑动的距离

def getXYByImage(filename: str) -> tuple[int, int]:
    """
    从滑动验证码中获取xy坐标
    """
    # 读取显示原图  
    image = cv2.imread(filename)
    cv2.imshow("Original Image", image)
    # cv2.waitKey(0)

    # V通道 灰度图  
    hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
    _, _, v_channel = cv2.split(hsv_image)
    cv2.imshow('V Channel', v_channel)
    # cv2.waitKey(0)
    avg_hsv = get_avg(hsv_image)
    logger.info(f"平均灰度值为 {avg_hsv}")

    # 二值化 取灰度范围
    ret1, thres = cv2.threshold(v_channel, avg_hsv, 255, cv2.THRESH_BINARY_INV)
    cv2.imshow('Thresh', thres)
    # cv2.waitKey(0)

    # 闭运算  
    kernel = np.ones((25, 25), np.uint8)
    thres = cv2.morphologyEx(thres, cv2.MORPH_OPEN, kernel)
    cv2.imshow('MORPH_OPEN', thres)
    # cv2.waitKey(0)

    # 找到所有的矩形  
    contours, _ = cv2.findContours(thres, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    xys = []
    # 遍历所有的矩形并计算其坐标和面积,并在原图上绘制绿色边框  
    for i, contour in enumerate(contours):
        # 获取矩形的边界矩形(可能不是严格意义上的矩形,但是边界矩形)  
        x, y, w, h = cv2.boundingRect(contour)
        # 计算面积  
        area = w * h
        # 在原图上绘制绿色边框(注意:需要将图像转换为BGR格式以便正确显示颜色)  
        cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 1)
        # print(f"Rectangle {i + 1}: Coordinates: ({x}, {y}), Area: {area}")
        xys.append((x, y, area))

    cv2.imshow("Image with Rectangles", image)
    # cv2.imwrite(filename + "_Rectangles_.png", image)
    
    # 筛选最适合的矩形
    for x, y, a in xys:
        if 1000 <= a <= 1100:
            return x, y


def get_avg(img: cv2.typing.MatLike):
    """获取平均灰度值"""
    # 获取图像高度和宽度
    height = img.shape[0]
    width = img.shape[1]

    h_images = []
    # 图像平均灰度处理方法
    for i in range(height):
        for j in range(width):
            # 灰度值为RGB三个分量的平均值
            var = (int(img[i, j][0]) + int(img[i, j][1]) + int(img[i, j][2])) / 3
            h_images.append(var)

    max_prot = h_images[int(len(h_images) / 2):]
    max_prot.remove(min(max_prot))
    return sum(max_prot) / len(max_prot)
    

def save_base64_image(code, name=None):
    """ 保存base64 编码"""
    imagedata = base64.b64decode(code)
    file_name = os.path.join(os.path.dirname(__file__), str(time.time()) if name is None else name) + ".png"
    with open(file_name, "wb") as f:
        f.write(imagedata)
        f.close()
    return file_name

在这里插入图片描述

滑动验证


def _login_un_lock(self, locator: Locator):
    src = locator.locator(".JDJRV-bigimg > img").get_attribute("src")
    image_base64 = src[src.index(",") + 1 :]
    file_name = save_base64_image(image_base64)
    xy = getXYByImage(file_name)
    logger.info(f"x ,y 坐标为{xy}")
    if xy is None:
        self.page.reload()
        os.remove(file_name)
        return
    x, y = xy
    self.un_login_lock(int((x - 13) * 281 / 360), locator.locator(".JDJRV-slide-btn"))
    os.remove(file_name)
    
def un_login_lock(self, distance: int, locator: Locator) -> None:
    locator.blur()
    box = locator.bounding_box()
    tracks = get_track(distance)
    x = int(box["x"] + box["width"] / 2)
    y = int(box["y"] + box["height"] / 2)
    locator.hover()
    self.page.mouse.down()
    self.page.mouse.move(x, y + random.randint(10, 20), steps=12)
    for track in tracks:
        self.page.mouse.move(track + x, y + random.randint(10, 20), steps=9)
        x = x + track
        self.page.wait_for_timeout(random.randint(10, 100))
    self.page.mouse.up()
    self.page.wait_for_timeout(random.randint(2200, 3200))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1047929.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mysql面试题1:MySQL有哪些常见存储引擎?MySQL默认是哪个存储引擎?

该文章专注于面试&#xff0c;面试只要回答关键点即可&#xff0c;不需要对框架有非常深入的回答&#xff0c;如果你想应付面试&#xff0c;是足够了&#xff0c;抓住关键点 面试官&#xff1a;MySQL有哪些常见存储引擎&#xff1f; MySQL有以下几种常见的存储引擎&#xff1…

智慧公厕自动化保洁系统,让公共厕所实现7*24 持续整洁

随着科技的不断进步&#xff0c;越来越多的创新方案应用于各个领域&#xff0c;公共厕所的智慧化也不例外。本文重点介绍智慧公厕源头厂家广州中期科技有限公司&#xff0c;大量案例项目中所使用的智慧公厕自动化保洁系统&#xff0c;能有效地节省人力&#xff0c;并保持公共厕…

抽象轻松的java——简单的购物车系统

public class GoodsShop {public static void main(String[] args) {System.out.println("欢迎来到购物车管理系统");obj [] arr new obj[50];//obj[50]为购物车的数量上限obj obj new obj();//调用objScanner scanner new Scanner(System.in);//输入while (true)…

【C++14保姆级教程】数位分割符、函数返回值推导

文章目录 前言一、数位分割符&#xff08;Digit Separators&#xff09;1.1 数位分割符是什么&#xff1f;1.2 作用1.3 示例代码11.4 示例代码21.5 数位分隔符的优势 二、函数返回值推导&#xff08;Function Return Type Deduction&#xff09;2.1 函数返回值推导是什么&#…

[NOIP2011 提高组] 铺地毯

[NOIP2011 提高组] 铺地毯 题目描述 为了准备一个独特的颁奖典礼&#xff0c;组织者在会场的一片矩形区域&#xff08;可看做是平面直角坐标系的第一象限&#xff09;铺上一些矩形地毯。一共有 n n n 张地毯&#xff0c;编号从 1 1 1 到 n n n。现在将这些地毯按照编号从小…

【LeetCode热题100】--142.环形链表II

142.环形链表II 使用哈希表&#xff1a; 遍历链表中的每个节点&#xff0c;并将它记录下来&#xff0c;一旦遇到了此前遍历过的节点&#xff0c;就可以判定链表中存在环 /*** Definition for singly-linked list.* class ListNode {* int val;* ListNode next;* …

Unity Urp无线延申的网格效果

无线延申的网格 该项目必须是再Urp项目 shader代码实现 Shader "Unlit/infTutorial1" {Properties{_Alpha ("Alpha", Range(0, 0.5)) 0.5}SubShader{Tags{"RenderPipeline""UniversalRenderPipeline""RenderType""…

操作系统监控工具

在当今复杂、动态的网络环境中&#xff0c;服务器管理员根据其要求在各种操作系统上工作&#xff0c;操作系统是管理硬件和软件资源的基本系统软件&#xff0c;它是硬件与您运行的不同应用程序之间的接口&#xff0c;保持操作系统更新至关重要&#xff0c;最重要的是&#xff0…

SDI-12协议与STM32 进行uart通信

场景是用stm32与一款温湿度传感器通信&#xff0c;不过是基于SDI-12协议&#xff0c;SDI-12时序和UART类似&#xff0c;故采用UART传输&#xff0c;原理图如下 其中DIR_OUT_SDI是一个IO引脚&#xff0c;控制UART_TX_SDI是否使能&#xff0c;U10是三态门IC&#xff0c;即拉低DIR…

测试网页调用本地可执行程序(续1:解析参数中的中文编码)

学习测试网页调用本地可执行程序还遗留一个问题&#xff0c;即网页中调用带中文参数的命令时&#xff0c;本地可执行程序接收到的参数字符串里的中文都转换成了编码模式&#xff0c;看起来如下所示&#xff1a; <a href TestPageCall:-a你好>启动测试程序</a><…

destoon根据查询标题小于5个字符的数据进行删除

最近客户有个需求&#xff0c;就是他采集的时候&#xff0c;标题有些小于5字符的短标题的垃圾数据&#xff0c;进行清空处理&#xff0c;让我进行批量删除。废话不多说&#xff0c;接着干。 首先在dt根目录新建delmysql.php文件&#xff0c;代码如下&#xff1a; <?php r…

机器学习——KNN算法流程详解(以iris为例)

目 录 前情说明 问题陈述 数据说明 KNN算法流程概述 代码实现 前情说明 本书基于《特征工程入门与入门与实践》庄家盛 译版P53也K最近邻&#xff08;KNN&#xff09;算法进行讲解 问题陈述 Iris 鸢尾花数据集内包含 3 类分别为山鸢尾&#xff08;Iris-setosa&#xff09…

99%的亚马逊运营都不知道爆单小技巧——社媒促销代码

社交媒体促销代码是促进产品在亚马逊上销售的最有效推广方式之一&#xff0c;有了这个营销工具&#xff0c;卖家可以在社交媒体上宣传您的产品&#xff0c;并通过社交媒体和网红营销内容将促销代码分享给买家&#xff0c;进行更具针对性的促销。 一、什么是社交媒体促销代码 社…

BoxUVMap处理参考

该Shader的目标是让物体的位置作为UV&#xff0c;在物体自身UV没有正确展开的情况下保证物体各个面能够避免贴图拉伸&#xff0c;比较适合Box型的物体。本来Position节点和Normal Vector节点应该选择Object选项&#xff0c;但是当时选择了World选项&#xff0c;主要是应对项目的…

在亚马逊云科技Amazon SageMaker上部署构建聊天机器人的开源大语言模型

开源大型语言模型&#xff08;LLM&#xff09;已经变得流行起来&#xff0c;研究人员、开发人员和组织都可以使用这些模型来促进创新和实验。这促进了开源社区开展合作&#xff0c;从而为LLM的开发和改进做出贡献。开源LLM提供了模型架构、训练过程和训练数据的透明度&#xff…

超大表格组件滚动渲染优化

引用自 摸鱼wiki 背景 业务中需要渲染一个最多有100列的表格&#xff0c;由于表格使用原生dom实现&#xff0c;因此会出现同屏有近1000个单元格同时绘制&#xff0c;在快速滑动时页面会产生卡顿&#xff0c;影响用户体验。 方案 如下图所示&#xff0c;由于用户显示屏区域有…

LeetCode算法二叉树—222. 完全二叉树的节点个数

目录 222. 完全二叉树的节点个数 - 力扣&#xff08;LeetCode&#xff09; 代码&#xff1a; 运行结果&#xff1a; 给你一棵 完全二叉树 的根节点 root &#xff0c;求出该树的节点个数。 完全二叉树 的定义如下&#xff1a;在完全二叉树中&#xff0c;除了最底层节点可能…

opencv开发环境配置

一、下载安装 打开opencv官方网站&#xff0c;opencv管网地址&#xff0c;选择下载的版本 双击安装包&#xff0c;选择安装路径&#xff0c;进行安装 安装完毕后&#xff0c;打开 注意&#xff1a;环境变量配置的bin路径不是build/bin&#xff0c;而是build/x64/vc16/bin …

chrome扩展程序开发请求接口报错

解决HTTPS站点请求HTTP接口服务后报错&#xff1a;the content must be served over HTTPS Mixed Content: The page at <URL> was loaded over HTTPS, but requested an insecure XMLHttpRequest endpoint <URL>. This content should also be served over HTTPS…

网络知识:内网、外网、宽带、带宽、流量、网速之间的联系?

相信很多人都不知道内网、外网、宽带、带宽、流量、网速之间的区别与联系&#xff0c;今天小编给大家介绍一下&#xff0c;希望对大家能有所帮助&#xff01; 一.带宽与宽带的区别是什么&#xff1f; 带宽是量词&#xff0c;指的是网速的大小&#xff0c;比如1Mbps的意思是一兆…