通过opencv与神经网络对滑动验证码的一次深入学习

2023-11-11

好久没写博客了,人到中年,有点儿犯懒。

从信息安全行业,又去了IT合规领域,与信息安全结合还是两手抓,两手都不硬。

由于工作原因,需要获取一个token来请求接口,奈何没有现成的接口,需要在web端登录才可以获取。既然如此,想要实现这个功能肯定是selenium+识别,如下图

 

 通过对验证码的分析,得到滑块在距离背景图10px的地方开始滑动,也就是说滑动距离是缺口在图片的横坐标 X - 10。纵坐标无需考虑。

一、opencv

参考: python实现过顶象滑块_顶象滑块js_weixin_43419774的博客-CSDN博客

看完这篇文章之后,大量的下载,复原图片的前期工作都已经直接搞定,感谢作者。

按照这篇博客的识别算法

1. 先将背景图与滑块进行灰度处理

2. 将滑块进行reverse

3. 两张图进行高斯模糊,然后以标准相关系数匹配,找到坐标

对我的验证码中只有70%以上的准确率,因为顶象会有一些混淆图片例如

 我们可以看到正确的缺口里面是纯色,而滑块里面是有背景图片内容的,会造成不准确。

改进方法是进行边缘检测,然后进行标准相关系数匹配

方法1: 

def dXImgSlider2(origin, sliderImg, filename='labeled.webp'):
	slider = cv2.imread(sliderImg)
	originImg = cv2.imread(origin, cv2.IMREAD_GRAYSCALE)
	sliderImg = cv2.cvtColor(slider, cv2.COLOR_BGR2GRAY)
	# sliderImg 二值化
	_, th2 = cv2.threshold(sliderImg, 5, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)
	# 梯度处理
	sobelx = cv2.Sobel(th2, cv2.CV_16S, 1, 0, ksize=1)
	sobelx = cv2.convertScaleAbs(sobelx)
	sobely = cv2.Sobel(th2, cv2.CV_16S, 0, 1, ksize=1)
	sobely = cv2.convertScaleAbs(sobely)
	sobelxy = cv2.addWeighted(sobelx, 0.5, sobely, 0.5, 0)
	# 参数微调
	th2 = cv2.Canny(sobelxy, 700, 700)
	# cv2.imwrite('th2.png', th2)

	dstx = cv2.Sobel(originImg, cv2.CV_16S, 1, 0, ksize=1)
	dstxcmp = cv2.convertScaleAbs(dstx)
	dsty = cv2.Sobel(originImg, cv2.CV_16S, 0, 1, ksize=1)
	dstycmp = cv2.convertScaleAbs(dsty)
	dstxy = cv2.addWeighted(dstxcmp, 0.5, dstycmp, 0.5, 0)
	# 参数微调
	dstxy = cv2.Canny(dstxy , 600, 800)
	# cv2.imwrite('th1.png', dstxy)

	w, h = sliderImg.shape[:2]
	new_img = cv2.imread(origin)
	res = cv2.matchTemplate(dstxy, th2, cv2.TM_CCOEFF_NORMED)
	min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
	top_left = max_loc 
	bottom_right = (top_left[0] + w, top_left[1] + h)
	im = cv2.rectangle(new_img, top_left, bottom_right, (0, 0, 255), 2)
	cv2.imwrite(filename, im)
	resObj  = [int(x * 300/400) for x in [top_left[0], top_left[1], bottom_right[0], bottom_right[1]]]
	return resObj

方法2: 

# 滑块识别方法3
def dXImgSlider3(origin, sliderImg, filename='labeled.webp'):
	slider = cv2.imread(sliderImg)
	originImg = cv2.imread(origin)
	bgImg = cv2.cvtColor(originImg, cv2.COLOR_BGR2GRAY)
	sliderImg = cv2.cvtColor(slider, cv2.COLOR_BGR2GRAY)
	# add canny
	bg_edges = cv2.Canny(bgImg, 600, 800)
	slider_edges = cv2.Canny(sliderImg, 700, 700)
	# _, thresh = cv2.threshold(bgImg, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
	contours, hierarchy = cv2.findContours(bg_edges, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
	res = cv2.matchTemplate(bg_edges, slider_edges, cv2.TM_CCOEFF_NORMED)
	# epsilon = 0.1 * cv2.arcLength(contours[0], True)
	min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
	tl = min_loc
	br = (tl[0] + slider_edges.shape[0], tl[1] + slider_edges.shape[1])
    return tl[0], tl[1], br[0], br[1]

 方法2比方法1代码少了梯度处理,梯度处理能够更好地可视化图像中的边缘信息。但以我自己的case中准确度相差不大。

二、目标检测

 完成这个事情首先观察验证码的背景图片特点,背景图存在2个缺口,一个是正确的,一个是混淆缺口,通过对大量背景图的下载,发现正确缺口比混淆的缺口更清晰。因此,可提前论证神经网络找到缺口位置无需滑块图片。

深度学习技术方案有三种:

1. 使用2个神经网络,第1个神经网络将滑块图片输入进行识别,然后输出形状权重,作为第2个神经网络的输入,然后输出缺口位置坐标。

2. 单分类目标检测,对背景图片进行标注,然后进行训练,并输出正确缺口坐标;

3. 多分类目标检测,对背景图片进行正确缺口的标注,作为correct类别,错误缺口进行标注,作为wrong类别,然后进行训练,并输出正确缺口坐标;

选择第2种方案更简单,也更有效。

训练使用:PyTorch-YOLOv3

权重文件: darknet53.conv.74

类别: 1

标注工具: labelImg

训练集: 160张

验证集: 40张

epoch: 23

Total loss: 1.88

由于训练在M1芯片的机器上,不知道为何出现一些crash的问题。不过还好第23次的结果测试效果已经非常好了,置信度99.9%

现在的训练已经非常无脑了,饭都喂到嘴边了,没有不吃的道理。去B站或者Youtube看一看视频就完全掌握了。接下来我的目标是对一些大佬开源的训练方法进行改进。

最后,测试2种方法返回的滑动距离,结合seleium进行实现,搞定。

最后部署的时候由于云主机安装不上opencv,一直报错,还好有模型backup。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过opencv与神经网络对滑动验证码的一次深入学习 的相关文章

  • 相机姿态估计(OpenCV PnP)

    我正在尝试使用网络摄像头从具有已知全球位置的四个基准点的图像中获取全局姿态估计 我检查了许多 stackexchange 问题和一些论文 但似乎无法得到正确的解决方案 我得到的位置数字是可重复的 但与相机移动绝不成线性比例 仅供参考 我正在
  • 编译使用Basler相机的程序

    我正在尝试使用 Basler 相机捕获图像的 C 程序来工作 我拿到 来自制造商的代码 它应该 非常容易使用 但是 链接它有 成为一场噩梦 我的 C 时代已经过去了 最近只使用 Matlab 所以我可能会犯一些愚蠢的错误 但请赐教 代码如下
  • opencv 视频上的颜色阈值

    I am thresholding for a color range in an opencv video The goal is to seperate the B mode black and white information on
  • 收据褪色部分可以恢复吗?

    我有一些包含一些扫描收据的文件 我需要使用 OCR 从中提取文本 由于收据上打印的文字在一段时间后会褪色 导致收据上的某些文字不清晰 影响OCR结果 褪色单词的一些示例 有什么方法可以恢复褪色的部分 以便提高 OCR 结果吗 我在OpenC
  • 在 Python 3.5 64 位上通过 pip 安装 OpenCV

    我尝试安装 OpenCV 但找不到任何合适的 pip 软件包 我决定上网查找有关如何安装它的官方文档 并发现this https opencv python tutroals readthedocs io en latest py tuto
  • 如何在Python中使用tcp套接字发送和接收网络摄像头流?

    我正在尝试重新创建这个项目 https github com hamuchiwa AutoRCCar 我拥有的是服务器 我的电脑 和客户端 我的树莓派 我所做的与原始项目不同的是我尝试使用一个简单的网络摄像头而不是树莓派摄像头将图像从我的
  • 相机标定(OpenCV 2.3)-如何使用畸变参数?

    我有一组带有一些附加标记的刚体图像 我在这些标记之一中定义了一个原点坐标系 我想获得该坐标系与在相机原点定义的坐标系之间的旋转和平移 我尝试了一段时间 POSIT 以下this http goo gl cUYYt 但从未获得可接受的结果 直
  • 如何在给定目标大小的情况下在 python 中调整图像大小,同时保留纵横比?

    首先 我觉得这是一个愚蠢的问题 对此感到抱歉 目前 我发现计算最佳缩放因子 目标像素数的最佳宽度和高度 同时保留纵横比 的最准确方法是迭代并选择最佳缩放因子 但是必须有更好的方法来做到这一点 一个例子 import cv2 numpy as
  • OpenCV的拼接模块可以拼接平行运动相机拍摄的图像吗?

    我想知道是否缝合 http docs opencv org modules stitching doc stitching html http docs opencv org modules stitching doc stitching
  • 我可以使用 openCV 比较两张不同图像上的两张脸吗?

    我对 openCV 很陌生 我看到它可以计算出脸部并返回一个矩形来指示脸部 我想知道 openCV 是否可以访问两张包含一张脸的图像 并且我希望 openCV 返回这两个人是否相同的可能性 Thanks OpenCV 不提供完整的人脸识别引
  • 如何将 mat 转换为 array2d

    我为dlib http dlib net face landmark detection ex cpp html那里的面部地标代码使用 array2d 来获取图像 但我喜欢使用 Mat 读取图像并转换为 array2d 因为 dlib 仅支
  • 多视图几何

    我从相距一定距离的两台相同品牌的相机捕获了两张图像 捕获了相同的场景 我想计算两个相机之间的现实世界旋转和平移 为了实现这一点 我首先提取了两张图像的 SIFT 特征并进行匹配 我现在有基本矩阵也单应性矩阵 然而无法进一步进行 有很多混乱
  • BASH 脚本编译多个 C++ 文件 - OpenCV

    请参见在C 和OpenCV中调用其他文件中的函数 https stackoverflow com questions 24442836 call functions in other files in c and opencv 对于最初的问
  • OpenCV 2.3 与 VS 2008 - 鼠标事件

    强制性 我是新手 有一份涉及编程的工作 并且我一边工作一边自学 不用说 作为一名老师 我经常犯彻底的错误 我现在所处的位置 我创建了 Graph 类 它 令人惊讶的是 制作了图表 但现在我想通过单击鼠标来修改图形 但我似乎无法让鼠标处理程序
  • minAreaRect OpenCV 返回的裁剪矩形 [Python]

    minAreaRectOpenCV 中返回一个旋转的矩形 如何裁剪矩形内图像的这部分 boxPoints返回旋转矩形的角点的坐标 以便可以通过循环框内的点来访问像素 但是在 Python 中是否有更快的裁剪方法 EDIT See code在
  • 如何去除给定图像中的噪声,使 ocr 输出完美?

    我已经对这个孟加拉文本图像进行了大津阈值处理 并使用 tesseract 进行 OCR 但输出非常糟糕 我应该应用什么预处理来消除噪音 我也想校正图像 因为它有轻微的倾斜 我的代码如下 import tesserocr from PIL i
  • 使用 OpenCV 和/或 Numpy 对两个图像进行 Alpha 混合 [重复]

    这个问题在这里已经有答案了 我想将一个填充纯色的半透明矩形添加到已加载的半透明 PNG 中 这是我正在使用的输入图像示例 该图像加载了标准cv2 IMREAD UNCHANGED标志 以便完美保留 alpha 通道 该输入图像存储在imag
  • 使用 OpenCV 改进特征点匹配

    我想匹配立体图像中的特征点 我已经用不同的算法找到并提取了特征点 现在我需要一个良好的匹配 在本例中 我使用 FAST 算法进行检测和提取 BruteForceMatcher用于匹配特征点 匹配代码 vector lt vector
  • 2d 图像点和 3d 网格之间的交点

    Given 网格 源相机 我有内在和外在参数 图像坐标 2d Output 3D 点 是从相机中心发出的光线穿过图像平面上的 2d 点与网格的交点 我试图找到网格上的 3d 点 This is the process From Multip
  • 如何将 Mat (opencv) 转换为 INDArray (DL4J)?

    我希望任何人都可以帮助我解决这个任务 我正在处理一些图像分类并尝试将 OpenCv 3 2 0 和 DL4J 结合起来 我知道DL4J也包含Opencv 但我认为它没什么用 谁能帮我 如何转换成 INDArray 我尝试阅读一些问题here

随机推荐

  • ruoyi cloud 用官方自带的工具更换包名出现的问题与解决办法

    使用ruoyi cloud官方的包生成后 有2点的修改很重要 1是所有带META INF spinrg文件夹的org springframework boot autoconfigure AutoConfiguration imports文
  • oracle10g异常日志查看

    oracle10g异常日志查看 警告日志 oracle product 10 2 0 db 1 admin orcl bdump alert orcl log 监听日志 oracle product 10 2 0 db 1 NETWORK
  • SpringMVC:从入门到精通,7篇系列篇带你全面掌握--三.使用SpringMVC完成增删改查

    Welcome Huihui s Code World 接下来看看由辉辉所写的关于SpringMVC的相关操作吧 目录 Welcome Huihui s Code World 效果演示 一 导入项目的相关依赖 二 添加框架的配置文件 gen
  • 高效的公式提取神器Mathpix snipping Tool+ Mathtype

    推荐一个有用高效的公式提取神器Mathpix snipping Tool Mathtype Mathpix snip是一款功能强大 很有用的公式识别及复制软件 能够将已有的PDF或CAJ等文中的公式 纸上打印的公式 甚至在纸上手写的公式统统
  • 共享计算机后防火墙能开启,Windows XP中防火墙后如何实现共享

    通过开启Windows XP系统中内置的 Internet 连接防火墙 可以让我们安心的上网冲浪 但是在开启了 Internet 连接防火墙 之后 我们就会发现不能正常的使用 网络共享 功能了 Internet 连接防火墙 在阻挡恶意程序的
  • C语言将int类型存入char型

    最近在做算法题的时候遇到了一个问题 就是怎么将int类型的值变成当成字符串 字符数组 类型 例如 有个 int 1024 如何将整形的1024转为字符串类型 String 的1024或者字符数组 char 类型的1024呢 其实可以用ito
  • Vscode快速入门、 插件安装、插件位置、修改vscode默认引用插件的路径、在命令行总配置code、快捷键

    Vscode快速入门 这里写目录标题 安装 插件安装 Ctrl Shift X 插件商店 插件位置 默认位置 修改默认路径 修改vscode默认引用插件的路径 在命令行总配置code 基本操作 安装 Visual Studio Code 官
  • RxJava2+Retrofit2+RxLifecycle3+OkHttp3网络请求封装(动态演示)

    入职公司后 公司要求组件化开发 经过讨论后我将网络请求框架单独进行了封装 不过当时框架里将常用的 util 和 ui 均放入到了共同的 Common 包下 导致里面部分代码耦合 后来为了降低耦合性又将 Common 拆分为了lib comm
  • Python 解决百钱买百鸡问题

    我国古代数学家张丘建在 算经 一书中曾提出过著名的 百钱买百鸡 问题 该问题叙述如下 鸡翁一 值钱五 鸡母一 值钱三 鸡雏三 值钱一 百钱买百鸡 则翁 母 雏各几何 翻译过来 意思是公鸡一个五块钱 母鸡一个三块钱 小鸡三个一块钱 现在要用一
  • Django开发员工管理系统(Part I)

    文章目录 1 准备工作 1 1 创建django项目 1 2 创建app 1 3 配置settings py文件 完成app注册 2 设计数据库表结构 3 在MySQL中生成表 3 1 创建数据库 3 2 修改配置文件 连接MySQL数据库
  • Nature:为啥室温超导支棱不起来

    克雷西 发自 凹非寺量子位 公众号 QbitAI 引发全球热议的LK 99风波告一段落后 Nature的一篇资讯头条再次提及了 室温超导 尽管对超导的热情一直不减 但随着一次又一次被证伪 人们很难不对 室温超导 慎之又慎 Nature的这篇
  • GitHub开源:狗屁不通文章生成器

    万字申请 废话报告 魔幻形式主义大作怎么写 GitHub开源狗屁不通文章生成器了解一下 只要输入一句话 系统就会给你一篇万字长文 查看源代码编写风格清新脱俗 并且毫无算法 简单暴力 直接在关键语句前后加上废话 名人名言 GitHub Git
  • 关系数据库中连接池的机制是什么?

    前提 为数据库连接建立一个缓冲池 1 从连接池获取或创建可用连接 2 使用完毕之后 把连接返回给连接池 3 在系统关闭前 断开所有连接并释放连接占用的系统资源 4 能够处理无效连接 限制连接池中的连接总数不低于或者不超过某个限定值 其中有几
  • 模式识别之分类器

    常见分类器介绍 1 SVM分类器 监督学习分类器 答 训练样本必须先标识不同类别 然后进行训练 SVM算法就是找一个超平面 对于已经被标记的训练样本 SVM训练得到一个超平面 使得两个类别训练集中距离超平面最近的样本之间的垂直距离要最大 也
  • Java--Map和HashMap基础

    一 Map常用方法 1 Map集合在 java util Map 包下 Map集合以键值对 key和value 的方式存储数据 key和value都是引用数据类型 都是存储对象的内存地址 2 Map接口中常用方法 V put K key V
  • W3C?什么是W3C相关标准?

    什么是W3C标准 什是W3C标准 不是一个标准 而是万维网联盟制定的一系列标准 网页主要由三部分组成 结构 Structure 表现 Presentation 和行为 Behavior 对应的标准也分三方面 结构化标准语言主要包括XHTML
  • 数据采集+数据可视化练习(2022-1-6)

    任务书3 赛题说明 竞赛内容分布 竞赛时长 任务一 Spark 组件部署管理 Standalone 模式 15 任务二 数据采集 20 任务三 数据清洗与分析 30 任务四 数据可视化 20 任务五 综合分析 10 团队分工明确合理 操作规
  • Python-Django毕业设计信息安全风险评估系统设计与实现(程序+Lw)

    项目运行 环境配置 Jdk1 8 Tomcat7 0 Mysql HBuilderX Webstorm也行 Eclispe IntelliJ IDEA Eclispe MyEclispe Sts都支持 项目技术 SSM mybatis Ma
  • CentOs yum源配置

    yum 的理念是使用一个中心仓库 repository 管理一部分甚至一个distribution 的应用程序相互关系 根据计算出来的软件依赖关系进行相关的升级 安装 删除等等操作 减少了Linux 用户一直头痛的dependencies
  • 通过opencv与神经网络对滑动验证码的一次深入学习

    好久没写博客了 人到中年 有点儿犯懒 从信息安全行业 又去了IT合规领域 与信息安全结合还是两手抓 两手都不硬 由于工作原因 需要获取一个token来请求接口 奈何没有现成的接口 需要在web端登录才可以获取 既然如此 想要实现这个功能肯定