如何用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 相关文章推荐
Tornado服务器中绑定域名、虚拟主机的方法
Aug 22 Python
Python中input和raw_input的一点区别
Oct 21 Python
python编写的最短路径算法
Mar 25 Python
python执行等待程序直到第二天零点的方法
Apr 23 Python
Python 逐行分割大txt文件的方法
Oct 10 Python
python利用微信公众号实现报警功能
Jun 10 Python
numpy中三维数组中加入元素后的位置详解
Nov 28 Python
python matplotlib中的subplot函数使用详解
Jan 19 Python
python GUI框架pyqt5 对图片进行流式布局的方法(瀑布流flowlayout)
Mar 12 Python
python实现飞船大战
Apr 24 Python
PyCharm MySQL可视化Database配置过程图解
Jun 09 Python
Python 删除List元素的三种方法remove、pop、del
Nov 16 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 年龄计算函数(精确到天)
2012/06/07 PHP
php实现短信发送代码
2015/07/05 PHP
破除一些网站复制、右键限制
2006/11/04 Javascript
Ajax+Json 级联菜单实现代码
2009/10/27 Javascript
jQuery 获取对象 基本选择与层级
2010/05/31 Javascript
extjs grid设置某列背景颜色和字体颜色的实现方法
2010/09/06 Javascript
IE8提示Invalid procedure call or argument 异常的解决方法
2012/09/30 Javascript
javascript控制swfObject应用介绍
2012/11/29 Javascript
让复选框只能选择一项的方法
2013/10/08 Javascript
JS实现程序暂停与继续功能代码解读
2013/10/10 Javascript
JavaScript知识点总结(十)之this关键字
2016/05/31 Javascript
jQuery代码性能优化的10种方法
2016/06/21 Javascript
IntersectionObserver API 详解篇
2016/12/11 Javascript
javascript history对象详解
2017/02/09 Javascript
Vue 表单控件绑定的实现示例
2017/08/11 Javascript
微信小程序实现星星评价效果
2018/11/02 Javascript
小程序Request的另类用法详解
2019/08/09 Javascript
基于Vue+Webpack拆分路由文件实现管理
2020/11/16 Javascript
[19:14]DOTA2 HEROS教学视频教你分分钟做大人-维萨吉
2014/06/24 DOTA
python运行其他程序的实现方法
2017/07/14 Python
Python实现的摇骰子猜大小功能小游戏示例
2017/12/18 Python
浅谈Python爬虫基本套路
2019/03/25 Python
pycharm 批量修改变量名称的方法
2019/08/01 Python
wxPython多个窗口的基本结构
2019/11/19 Python
python 列表、字典和集合的添加和删除操作
2019/12/16 Python
美国时尚配饰品牌:Dooney & Bourke
2017/11/14 全球购物
澳大利亚二手奢侈品网站:Modsie
2019/09/23 全球购物
什么是SQL Server的确定性函数和不确定性函数
2016/08/04 面试题
幼儿教师寄语集锦
2014/04/03 职场文书
大学生党员个人剖析材料
2014/10/08 职场文书
新闻人物通讯稿
2014/10/09 职场文书
2015年小学一年级班主任工作总结
2015/05/21 职场文书
我在伊朗长大观后感
2015/06/16 职场文书
JUnit5常用注解的使用
2021/07/02 Java/Android
【海涛解说】史上最给力比赛,挑战DOTA极限
2022/04/01 DOTA
MySQL池化框架学习接池自定义
2022/07/23 MySQL