如何用python识别滑块验证码中的缺口


Posted in Python onApril 01, 2021

验证码往往是爬虫路上的一只拦路虎,而其花样也是层出不穷:图片验证、滑块验证、交互式验证、行为验证等。随着OCR技术的成熟,图片验证已经渐渐淡出主流,而滑块验证越来越多地出现在大众视野。
“这么厉害,这小子长啥样呢?”没错,它就长这损sai:

如何用python识别滑块验证码中的缺口

解决它的方法也很直观,首先找到缺口的位置(通常只需要X轴的位置),然后拖动滑块即可。
今天kimol君将带领大家用python识别出滑块验证中的缺口位置。

一、缺口识别

识别图片中的缺口,主要是利用python中的图像处理库cv2,其安装方法如下:

pip install opencv-python

注:这里并不是“pip install cv2”哦~

1.读取图片

滑块验证的图片分为两部分,一个是背景图片:

如何用python识别滑块验证码中的缺口

另一个是缺口图片:

如何用python识别滑块验证码中的缺口

利用imread函数将其读取:

# 读取背景图片和缺口图片
bg_img = cv2.imread('bg.jpg') # 背景图片
tp_img = cv2.imread('tp.png') # 缺口图片

2.识别图片边缘

为了更好地将缺口与背景匹配,我们首先得识别出图片的边缘:

# 识别图片边缘
bg_edge = cv2.Canny(bg_img, 100, 200)
tp_edge = cv2.Canny(tp_img, 100, 200)

这一步很关键!否则缺口匹配将不准确。

这里得到了图片边缘的灰度图,进一步将其图片格式转为RGB格式:

# 转换图片格式
bg_pic = cv2.cvtColor(bg_edge, cv2.COLOR_GRAY2RGB)
tp_pic = cv2.cvtColor(tp_edge, cv2.COLOR_GRAY2RGB)

转换后的背景图为:

如何用python识别滑块验证码中的缺口

转换后的缺口图为:

如何用python识别滑块验证码中的缺口

3.缺口匹配

利用cv2中的matchTemplate函数,可以在背景图片中搜索对应的缺口,具体代码如下:

# 缺口匹配
res = cv2.matchTemplate(bg_pic, tp_pic, cv2.TM_CCOEFF_NORMED)

res为每个位置的匹配结果,代表了匹配的概率,选出其中概率最高的点,即为缺口匹配的位置:

min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res) # 寻找最优匹配

min_val,max_val,min_loc,max_loc分别为匹配的最小值、匹配的最大值、最小值的位置、最大值的位置。
ps.当然,这里完全可以自己写一个循环来实现,但是有现成的函数为什么不用呢?

至此,我们已经有了缺口的位置,其X轴坐标为:

X = max_loc[0]

为了更直观地展示缺口的位置,我们将缺口用矩形框标注出来:

# 绘制方框
th, tw = tp_pic.shape[:2] 
tl = max_loc # 左上角点的坐标
br = (tl[0]+tw,tl[1]+th) # 右下角点的坐标
cv2.rectangle(bg_img, tl, br, (0, 0, 255), 2) # 绘制矩形
cv2.imwrite('out.jpg', bg_img) # 保存在本地

结果如下:

如何用python识别滑块验证码中的缺口

完美~ 收工!!!

二、完整代码

为了在实际应用中更方便的使用,我们将代码封装为一个函数:

def identify_gap(bg,tp,out):
 '''
 bg: 背景图片
 tp: 缺口图片
 out:输出图片
 '''
 # 读取背景图片和缺口图片
 bg_img = cv2.imread(bg) # 背景图片
 tp_img = cv2.imread(tp) # 缺口图片
 
 # 识别图片边缘
 bg_edge = cv2.Canny(bg_img, 100, 200)
 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) # 寻找最优匹配
 
 # 绘制方框
 th, tw = tp_pic.shape[:2] 
 tl = max_loc # 左上角点的坐标
 br = (tl[0]+tw,tl[1]+th) # 右下角点的坐标
 cv2.rectangle(bg_img, tl, br, (0, 0, 255), 2) # 绘制矩形
 cv2.imwrite(out, bg_img) # 保存在本地
 
 # 返回缺口的X坐标
 return tl[0]

这里选择了读取本地图片文件,在爬虫过程中其实不是特别方便。如果有感兴趣的小伙伴,可以自己改动一下,将输入改为图片流即可。

以上就是如何用python识别滑块中的缺口的详细内容,更多关于python识别滑块中的缺口的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
9种python web 程序的部署方式小结
Jun 30 Python
python开发之字符串string操作方法实例详解
Nov 12 Python
Python复制Word内容并使用格式设字体与大小实例代码
Jan 22 Python
简单的python协同过滤程序实例代码
Jan 31 Python
Python正则表达式匹配数字和小数的方法
Jul 03 Python
Python爬虫爬取煎蛋网图片代码实例
Dec 16 Python
python主线程与子线程的结束顺序实例解析
Dec 17 Python
Django3中的自定义用户模型实例详解
Aug 23 Python
Django创建一个后台的基本步骤记录
Oct 02 Python
python regex库实例用法总结
Jan 03 Python
基于Python-turtle库绘制路飞的草帽骷髅旗、美国队长的盾牌、高达的源码
Feb 18 Python
numpy数据类型dtype转换实现
Apr 24 Python
python 实现定时任务的四种方式
Apr 01 #Python
python读取pdf格式文档的实现代码
Python中使用Lambda函数的5种用法
Apr 01 #Python
python 实现mysql自动增删分区的方法
Apr 01 #Python
pygame面向对象的飞行小鸟实现(Flappy bird)
如何用python插入独创性声明
python OpenCV学习笔记
You might like
php Memcache 中实现消息队列
2009/11/24 PHP
php后台如何避免用户直接进入方法实例
2013/10/15 PHP
laravel框架创建授权策略实例分析
2019/11/22 PHP
Aster vs KG BO3 第三场2.18
2021/03/10 DOTA
javascript html 静态页面传参数
2009/04/10 Javascript
JS随即打乱数组实现代码
2012/12/03 Javascript
JS连接SQL数据库与ACCESS数据库的方法实例
2013/11/21 Javascript
JS短路原理的应用示例 精简代码的途径
2013/12/13 Javascript
NodeJS Express框架中处理404页面一个方式
2014/05/28 NodeJs
JSON.stringify转换JSON时日期时间不准确的解决方法
2014/08/08 Javascript
编程语言JavaScript简介
2014/10/16 Javascript
Javascript前端UI框架Kit使用指南之kitjs的对话框组件
2014/11/28 Javascript
浅谈被jQuery抛弃的函数及替代函数
2015/05/03 Javascript
浅谈JavaScript的innerWidth与innerHeight
2017/10/12 Javascript
JavaScript之创意时钟项目(实例讲解)
2017/10/23 Javascript
使用Angular CLI进行单元测试和E2E测试的方法
2018/03/24 Javascript
Nodejs 和 Electron ubuntu下快速安装过程
2018/05/04 NodeJs
React styled-components设置组件属性的方法
2018/08/07 Javascript
mpvue全局引入sass文件的方法步骤
2019/03/06 Javascript
关于微信小程序获取小程序码并接受buffer流保存为图片的方法
2019/06/07 Javascript
如何使用CSS3和JQuery easing 插件制作绚丽菜单
2019/06/18 jQuery
如何在微信小程序中实现Mixins方案
2019/06/20 Javascript
electron 如何将任意资源打包的方法步骤
2020/04/16 Javascript
Python使用turtule画五角星的方法
2015/07/09 Python
python中pytest收集用例规则与运行指定用例详解
2019/06/27 Python
python 并发编程 阻塞IO模型原理解析
2019/08/20 Python
python+mysql实现个人论文管理系统
2019/10/25 Python
python将数组n等分的实例
2019/12/02 Python
python是怎么被发明的
2020/06/15 Python
Selenium获取登录Cookies并添加Cookies自动登录的方法
2020/12/04 Python
行政助理岗位职责范文
2013/12/03 职场文书
上市公司财务总监岗位职责
2015/04/03 职场文书
2016年世界艾滋病日宣传活动总结
2016/04/01 职场文书
农村房屋租赁合同(范本)
2019/07/23 职场文书
利用Nginx代理如何解决前端跨域问题详析
2021/04/02 Servers
教你使用Jenkins集成Harbor自动发布镜像
2022/04/03 Servers