如何用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脚本实现下载合并SAE日志
Feb 10 Python
Python线程指南详细介绍
Jan 05 Python
Python算术运算符实例详解
May 31 Python
python 中split 和 strip的实例详解
Jul 12 Python
python numpy 按行归一化的实例
Jan 21 Python
Python面向对象程序设计之类的定义与继承简单示例
Mar 18 Python
Python下简易的单例模式详解
Apr 08 Python
Pyqt5实现英文学习词典
Jun 24 Python
python opencv捕获摄像头并显示内容的实现
Jul 11 Python
windows中安装Python3.8.0的实现方法
Nov 19 Python
详解用Python爬虫获取百度企业信用中企业基本信息
Jul 02 Python
详解pytorch创建tensor函数
Mar 22 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 图像函数大举例(非原创)
2009/06/20 PHP
PHP使用strstr()函数获取指定字符串后所有字符的方法
2016/01/07 PHP
PHP实现微信小程序用户授权的工具类示例
2019/03/05 PHP
javascript 无提示关闭窗口脚本
2009/08/17 Javascript
Colortip基于jquery的信息提示框插件在IE6下面的显示问题修正方法
2010/12/06 Javascript
JavaScript面向对象程序设计三 原型模式(上)
2011/12/21 Javascript
ajax上传时参数提交不更新等相关问题
2012/12/11 Javascript
jquery实现可拖动DIV自定义保存到数据的实例
2013/11/20 Javascript
Jquery.Form 异步提交表单的简单实例
2014/03/03 Javascript
js判断是否按下了Shift键的方法
2015/01/27 Javascript
NodeJs模拟登陆正方教务
2017/04/28 NodeJs
Javascript中的作用域及块级作用域
2017/12/08 Javascript
Vue不能观察到数组length的变化
2018/06/08 Javascript
微信公众号H5支付接口调用方法
2019/01/10 Javascript
JS数组splice操作实例分析
2019/10/12 Javascript
适合前端Vue开发童鞋的跨平台Weex的使用详解
2019/10/16 Javascript
[54:19]完美世界DOTA2联赛PWL S2 Magma vs PXG 第二场 11.28
2020/12/01 DOTA
重命名批处理python脚本
2013/04/05 Python
使用requests库制作Python爬虫
2018/03/25 Python
对python插入数据库和生成插入sql的示例讲解
2018/11/14 Python
Python零基础入门学习之输入与输出
2019/04/03 Python
详解如何管理多个Python版本和虚拟环境
2019/05/10 Python
Python环境下安装PyGame和PyOpenGL的方法
2020/03/25 Python
使用npy转image图像并保存的实例
2020/07/01 Python
详解python os.path.exists判断文件或文件夹是否存在
2020/11/16 Python
解决python3输入的坑——input()
2020/12/05 Python
Biblibili视频投稿接口分析并以Python实现自动投稿功能
2021/02/05 Python
开发人员所需要知道的HTML5性能分析面面观
2012/07/05 HTML / CSS
请问如下代码执行后a和b的值分别是什么
2016/05/05 面试题
教育学专业毕业生的自我鉴定
2013/11/26 职场文书
安全生产承诺书
2014/03/26 职场文书
啤酒节策划方案
2014/05/28 职场文书
群众对十八届四中全会的期盼
2014/10/17 职场文书
证劵公司反洗钱宣传活动总结
2015/05/08 职场文书
Nginx实现负载均衡的项目实践
2022/03/18 Servers
SQL Server使用PIVOT与unPIVOT实现行列转换
2022/05/25 SQL Server