如何用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 Web开发模板引擎优缺点总结
May 06 Python
asyncio 的 coroutine对象 与 Future对象使用指南
Sep 11 Python
详解Python3中字符串中的数字提取方法
Jan 14 Python
python实现八大排序算法(1)
Sep 14 Python
详解如何用OpenCV + Python 实现人脸识别
Oct 20 Python
flask中主动抛出异常及统一异常处理代码示例
Jan 18 Python
利用Python+Java调用Shell脚本时的死锁陷阱详解
Jan 24 Python
Python实现爬取百度贴吧帖子所有楼层图片的爬虫示例
Apr 26 Python
符合语言习惯的 Python 优雅编程技巧【推荐】
Sep 25 Python
python做接口测试的必要性
Nov 20 Python
django框架forms组件用法实例详解
Dec 10 Python
python DataFrame中stack()方法、unstack()方法和pivot()方法浅析
Apr 06 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
基于PHP遍历数组的方法汇总分析
2013/06/08 PHP
修改ThinkPHP缓存为Memcache的方法
2014/06/25 PHP
PHP PDOStatement::getColumnMeta讲解
2019/02/01 PHP
弹出广告特效代码(一个IP只弹出一次)
2007/05/11 Javascript
模仿JQuery.extend函数扩展自己对象的js代码
2009/12/09 Javascript
js 父窗口控制子窗口的行为-打开,关闭,重定位,回复
2010/04/20 Javascript
跨浏览器的 mouseenter mouseleave 以及 compareDocumentPosition的使用说明
2010/05/04 Javascript
Javascript动态绑定事件的简单实现代码
2010/12/25 Javascript
基于jquery的分页控件(C#)
2011/01/06 Javascript
jquery文字上下滚动的实现方法
2013/03/22 Javascript
JS取request值以及自动执行使用示例
2014/02/24 Javascript
ZeroClipboard插件实现多浏览器复制功能(支持firefox、chrome、ie6)
2014/08/30 Javascript
浅谈jQuery.easyui的datebox格式化时间
2015/06/25 Javascript
Vue.JS入门教程之列表渲染
2016/12/01 Javascript
详解axios 全攻略之基本介绍与使用(GET 与 POST)
2017/09/15 Javascript
nodejs async异步常用函数总结(推荐)
2017/11/17 NodeJs
详解从零搭建 vue2 vue-router2 webpack3 工程
2017/11/22 Javascript
学习使用ExpressJS 4.0中的新Router的用法
2018/11/06 Javascript
node.js处理前端提交的GET请求
2019/08/30 Javascript
Vue页面切换和a链接的本质区别详解
2019/11/12 Javascript
使用Python控制摄像头拍照并发邮件
2019/04/23 Python
python异步编程 使用yield from过程解析
2019/09/25 Python
QML用PathView实现轮播图
2020/06/03 Python
深入了解python列表(LIST)
2020/06/08 Python
python对一个数向上取整的实例方法
2020/06/18 Python
HTML5在canvas中绘制复杂形状附效果截图
2014/06/23 HTML / CSS
Html5 new XMLHttpRequest()监听附件上传进度
2021/01/14 HTML / CSS
美国折扣网站:jClub
2017/08/07 全球购物
口腔医学技术应届生求职信
2013/11/09 职场文书
丑小鸭教学反思
2014/02/03 职场文书
就业协议书怎么填
2014/04/11 职场文书
设计专业毕业生求职信
2014/06/25 职场文书
分公司总经理岗位职责
2014/07/30 职场文书
退休教师欢送会致辞
2015/07/31 职场文书
导游词之上海东方明珠塔
2019/09/25 职场文书