如何用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中的默认参数实例分析
Jan 29 Python
Python cookbook(数据结构与算法)实现优先级队列的方法示例
Feb 18 Python
python在文本开头插入一行的实例
May 02 Python
python 实现得到当前时间偏移day天后的日期方法
Dec 31 Python
python3实现逐字输出的方法
Jan 23 Python
在python tkinter界面中添加按钮的实例
Mar 04 Python
Python figure参数及subplot子图绘制代码
Apr 18 Python
python3实现名片管理系统(控制台版)
Nov 29 Python
Django框架实现在线考试系统的示例代码
Nov 30 Python
Python爬虫进阶之爬取某视频并下载的实现
Dec 08 Python
Pycharm 如何设置HTML文件自动补全代码或标签
May 21 Python
Django实现翻页的示例代码
May 24 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
海河写的 Discuz论坛帖子调用js的php代码
2007/08/23 PHP
php正则校验用户名介绍
2008/07/19 PHP
深入PHP中的HashTable结构详解
2013/06/13 PHP
thinkPHP实现表单自动验证
2014/12/24 PHP
PHP获取MySQL执行sql语句的查询时间方法
2018/08/21 PHP
利用PHP内置SERVER开启web服务(本地开发使用)
2021/03/09 PHP
js 刷新页面的代码小结 推荐
2010/04/02 Javascript
JS执行删除前的判断代码
2014/02/18 Javascript
javascript事件冒泡详解和捕获、阻止方法
2014/04/12 Javascript
php和js对数据库图片进行等比缩放示例
2014/04/28 Javascript
Jquery节点遍历next与nextAll方法使用示例
2014/07/22 Javascript
javascript转换静态图片,增加粒子动画效果
2015/05/28 Javascript
jquery中的工具使用方法$.isFunction, $.isArray(), $.isWindow()
2015/08/09 Javascript
JavaScript+html5 canvas制作色彩斑斓的正方形效果
2016/01/27 Javascript
AngularJS中实现用户访问的身份认证和表单验证功能
2016/04/21 Javascript
vue.js学习笔记之绑定style样式和class列表
2016/10/31 Javascript
nodejs中express入门和基础知识点学习
2018/09/13 NodeJs
Nodejs实现用户注册功能
2019/04/14 NodeJs
js实现中文实时时钟
2020/01/15 Javascript
[01:17]炒鸡美酒第四天TA暴走
2018/06/05 DOTA
Python 详解基本语法_函数_返回值
2017/01/22 Python
mysql 之通过配置文件链接数据库
2017/08/12 Python
浅析python中的迭代与迭代对象
2018/10/08 Python
python实现小世界网络生成
2019/11/21 Python
Pytorch中Tensor与各种图像格式的相互转化详解
2019/12/26 Python
Pytorch使用MNIST数据集实现基础GAN和DCGAN详解
2020/01/10 Python
python实现实时视频流播放代码实例
2020/01/11 Python
Python实现FLV视频拼接功能
2020/01/21 Python
完美解决pycharm 不显示代码提示问题
2020/06/02 Python
澳大利亚宠物商店:Petbarn
2017/11/18 全球购物
Java程序员面试题
2016/09/27 面试题
干部竞争上岗演讲稿
2014/09/11 职场文书
公安交警中队队长个人对照检查材料思想汇报
2014/10/05 职场文书
优秀党员推荐材料
2014/12/18 职场文书
pytorch model.cuda()花费时间很长的解决
2021/06/01 Python
Windows11 Insider Preview Build 25206今日发布 更新内容汇总
2022/09/23 数码科技