如何用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写入数据到MP3文件中的方法
Jul 10 Python
python实现对求解最长回文子串的动态规划算法
Jun 02 Python
Python实现端口检测的方法
Jul 24 Python
python删除字符串中指定字符的方法
Aug 13 Python
python添加模块搜索路径和包的导入方法
Jan 19 Python
Django网络框架之HelloDjango项目创建教程
Jun 06 Python
python与C、C++混编的四种方式(小结)
Jul 15 Python
python [:3] 实现提取数组中的数
Nov 27 Python
python dataframe NaN处理方式
Dec 26 Python
tensorflow实现测试时读取任意指定的check point的网络参数
Jan 21 Python
Django import export实现数据库导入导出方式
Apr 03 Python
python cv2图像质量压缩的算法示例
Jun 04 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
在字符串中把网址改成超级链接
2006/10/09 PHP
CI(CodeIgniter)框架配置
2014/06/10 PHP
smarty中改进truncate使其支持中文的方法
2016/05/30 PHP
YUI 读码日记之 YAHOO.lang.is*
2008/03/22 Javascript
jQuery 性能优化指南(3)
2009/05/21 Javascript
JavaScript函数模式详解
2014/11/07 Javascript
在JavaScript中处理数组之reverse()方法的使用
2015/06/09 Javascript
Javascript基于AJAX回调函数传递参数实例分析
2015/12/15 Javascript
浅析Javascript中bind()方法的使用与实现
2016/05/30 Javascript
Highcharts+NodeJS搭建数据可视化平台示例
2017/01/01 NodeJs
详解AngularJS中$filter过滤器使用(自定义过滤器)
2017/02/04 Javascript
jQuery实现简单弹窗遮罩效果
2017/02/27 Javascript
利用Vue.js实现求职在线之职位查询功能
2017/07/03 Javascript
js实现日期显示的一些操作(实例讲解)
2017/07/27 Javascript
nodejs 生成和导出 word的实例代码
2018/07/31 NodeJs
快速对接payjq的个人微信支付接口过程解析
2019/08/15 Javascript
js事件机制----捕获与冒泡机制实例分析
2020/05/22 Javascript
[01:06]DOTA2隆重推出2016冬季勇士令状 内含上海特级锦标赛互动指南
2016/02/17 DOTA
python脚本实现xls(xlsx)转成csv
2016/04/10 Python
python使用代理ip访问网站的实例
2018/05/07 Python
Flask入门之上传文件到服务器的方法示例
2018/07/18 Python
python引用(import)某个模块提示没找到对应模块的解决方法
2019/01/19 Python
详解Django定时任务模块设计与实践
2019/07/24 Python
django使用JWT保存用户登录信息
2020/04/22 Python
Python爬虫之Spider类用法简单介绍
2020/08/04 Python
pycharm配置安装autopep8自动规范代码的实现
2021/03/02 Python
HTML5的hidden属性兼容老浏览器的方法
2014/04/23 HTML / CSS
Perfume’s Club美国官网:西班牙第一家在线美容店
2020/06/10 全球购物
青年安全生产示范岗事迹材料
2014/05/04 职场文书
医院竞聘演讲稿
2014/05/16 职场文书
思想作风建设心得体会
2014/10/22 职场文书
辩护意见书
2015/06/04 职场文书
2016幼儿园教师节新闻稿
2015/11/25 职场文书
2016年重阳节慰问信
2015/12/01 职场文书
php随机生成验证码,php随机生成数字,php随机生成数字加字母!
2021/04/01 PHP
使用pycharm运行flask应用程序的详细教程
2021/06/07 Python