如何用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 相关文章推荐
改进Django中的表单的简单方法
Jul 17 Python
Python实现的括号匹配判断功能示例
Aug 25 Python
对python字典过滤条件的实例详解
Jan 22 Python
python实现贪吃蛇游戏
Mar 21 Python
django的ORM操作 删除和编辑实现详解
Jul 24 Python
Pytorch 抽取vgg各层并进行定制化处理的方法
Aug 20 Python
详解Python time库的使用
Oct 10 Python
python程序文件扩展名知识点详解
Feb 27 Python
sklearn和keras的数据切分与交叉验证的实例详解
Jun 19 Python
基于python实现计算两组数据P值
Jul 10 Python
Python实现自动签到脚本功能
Aug 20 Python
Django-silk性能测试工具安装及使用解析
Nov 28 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中通过加号合并数组的一个简单方法分享
2011/01/27 PHP
PHP 防注入函数(格式化数据)
2011/08/08 PHP
PHP中判断变量为空的几种方法小结
2013/11/12 PHP
php查找字符串出现次数的方法
2014/12/01 PHP
php构造函数的继承方法
2015/02/09 PHP
php字符串操作常见问题小结
2016/10/11 PHP
Redis使用Eval多个键值自增的操作实例
2016/11/04 PHP
PHP实现电商订单自动确认收货redis队列
2017/05/17 PHP
PHP判断json格式是否正确的实现代码
2017/09/20 PHP
PHP实现websocket通信的方法示例
2018/08/28 PHP
jquery 定位input元素的几种方法小结
2013/07/28 Javascript
如何根据百度地图计算出两地之间的驾驶距离(两种语言js和C#)
2015/10/29 Javascript
jQuery ajax方法传递中文时出现中文乱码的解决方法
2016/07/25 Javascript
用js实现before和after伪类的样式修改的示例代码
2017/09/07 Javascript
简易Vue评论框架的实现(父组件的实现)
2018/01/08 Javascript
vue iview的菜单组件Mune 点击不高亮的解决方案
2019/11/01 Javascript
Vue简单封装axios之解决post请求后端接收不到参数问题
2020/02/16 Javascript
js实现拖拽元素选择和删除
2020/08/25 Javascript
python使用xlrd实现检索excel中某列含有指定字符串记录的方法
2015/05/09 Python
Python编写一个闹钟功能
2017/07/11 Python
python爬取网页内容转换为PDF文件
2020/07/28 Python
Python创建一个空的dataframe,并循环赋值的方法
2018/11/08 Python
如何使用pyinstaller打包32位的exe程序
2019/05/26 Python
linux环境中没有网络怎么下载python
2019/07/07 Python
PowerBI和Python关于数据分析的对比
2019/07/11 Python
PyTorch中Tensor的数据统计示例
2020/02/17 Python
Django form表单与请求的生命周期步骤详解
2020/06/07 Python
美国优质马术服装购买网站:Breeches.com
2019/12/16 全球购物
如果NULL定义成#define NULL((char *)0)难道不就可以向函数传入不加转换的NULL了吗
2012/02/15 面试题
C#如何调用Word并打开一个Word文档
2013/05/08 面试题
综合实践活动总结
2014/05/05 职场文书
入党推优材料
2014/06/02 职场文书
消防安全宣传口号
2014/06/10 职场文书
民主评议党员个人自我评价
2015/03/03 职场文书
单身证明格式样本
2015/06/15 职场文书
学长教您写论文:经验总结
2019/07/09 职场文书