如何用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 相关文章推荐
python文件与目录操作实例详解
Feb 22 Python
详解Python中for循环是如何工作的
Jun 30 Python
解决tensorflow1.x版本加载saver.restore目录报错的问题
Jul 26 Python
python版本单链表实现代码
Sep 28 Python
Python爬虫实战之12306抢票开源
Jan 24 Python
不归路系列:Python入门之旅-一定要注意缩进!!!(推荐)
Apr 16 Python
python3+PyQt5 创建多线程网络应用-TCP客户端和TCP服务器实例
Jun 17 Python
Python 画出来六维图
Jul 26 Python
pytorch GAN生成对抗网络实例
Jan 10 Python
django rest framework serializer返回时间自动格式化方法
Mar 31 Python
Python pexpect模块及shell脚本except原理解析
Aug 03 Python
python使用scapy模块实现ping扫描的过程详解
Jan 21 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中遍历stdclass object的实现代码
2011/06/09 PHP
PHP模板引擎Smarty的缓存使用总结
2014/04/24 PHP
php两种无限分类方法实例
2015/04/21 PHP
php使用array_search函数实现数组查找的方法
2015/06/12 PHP
PHP封装的MSSql操作类完整实例
2016/05/26 PHP
JavaScript高级程序设计 阅读笔记(十四) js继承机制的实现
2012/08/14 Javascript
jquery的live使用注意事项
2014/02/18 Javascript
ECMAScript 5严格模式(Strict Mode)介绍
2015/03/02 Javascript
js实现透明度渐变效果的方法
2015/04/10 Javascript
js 判断附件后缀的简单实现方法
2016/10/11 Javascript
浅谈React 属性和状态的一些总结
2016/11/21 Javascript
优雅的elementUI table单元格可编辑实现方法详解
2018/12/23 Javascript
30分钟精通React今年最劲爆的新特性——React Hooks
2019/03/11 Javascript
jQuery实现条件搜索查询、实时取值及升降序排序的方法分析
2019/05/04 jQuery
JavaScript页面加载事件实例讲解
2019/09/01 Javascript
node.js实现简单的压缩/解压缩功能示例
2019/11/05 Javascript
解决vue net :ERR_CONNECTION_REFUSED报错问题
2020/08/13 Javascript
[44:01]2018DOTA2亚洲邀请赛3月30日 小组赛B组 EG VS paiN
2018/03/31 DOTA
python单链表实现代码实例
2013/11/21 Python
整理Python中的赋值运算符
2015/05/13 Python
在Python的Django框架下使用django-tagging的教程
2015/05/30 Python
pyqt5简介及安装方法介绍
2018/01/31 Python
python os.listdir按文件存取时间顺序列出目录的实例
2018/10/21 Python
python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例
2020/04/02 Python
python判断变量是否为列表的方法
2020/09/17 Python
animation和transition的区别
2020/10/12 HTML / CSS
Blancsom美国/加拿大:服装和生活用品供应商
2018/07/27 全球购物
UDP协议功能
2013/01/06 面试题
给交警的表扬信
2014/01/12 职场文书
茶叶店创业计划书范文
2014/01/19 职场文书
大学生个人求职信例文
2014/07/07 职场文书
幼儿园法制宣传日活动总结
2014/11/01 职场文书
城管年度个人总结
2015/02/28 职场文书
2015年前台个人工作总结
2015/04/03 职场文书
小学中队活动总结
2015/05/11 职场文书
2016年班主任新年寄语
2015/08/18 职场文书