Python识别滑块验证码缺口:从边缘检测到模板匹配实战

沈亦白
沈亦白
发布时间:2026-10-14| 5人浏览过
原创

本文详解如何利用Python和OpenCV库识别滑块验证码中的缺口位置。通过读取背景与缺口图片,使用Canny算子提取边缘并转换为RGB格式,再借助matchTemplate函数进行模板匹配,最终定位最大相关系数点以获取缺口X轴坐标。文章提供完整代码封装,适用于爬虫开发中的验证码破解场景。

验证码常被视为网络爬虫的主要障碍,其形式日益多样化,包括图片验证、滑块验证、交互式验证及行为验证等。随着OCR技术的成熟,传统图片验证逐渐退出主流,而滑块验证的应用场景愈发广泛。

解决滑块验证的核心思路直观且明确:首先确定缺口的位置(通常仅需获取X轴坐标),随后控制滑块拖动至该位置即可完成验证。本文将演示如何使用Python程序自动识别滑块验证中的缺口坐标。

一、缺口识别原理

识别图片中的缺口主要依赖Python中的图像处理库cv2(OpenCV)。安装该库的方法如下:


pip install opencv-python

注意:正确的安装命令并非“pip install cv2”,而是使用opencv-python。

1. 读取图片数据

滑块验证通常包含两张图片:背景图片。

以及带有缺口的滑块图片。

使用cv2.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)

转换后的背景边缘图效果如下。

转换后的缺口边缘图效果如下。

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分别对应匹配结果中的最小值、最大值、最小值坐标及最大值坐标。虽然可以通过自定义循环实现遍历,但直接使用OpenCV内置函数更为高效。

至此,我们已获取缺口的位置信息,其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) # 保存在本地

最终输出结果如下。

效果完美,流程结束。

二、完整代码封装

为便于在实际应用中复用,将上述逻辑封装为一个独立函数:


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] 

当前示例中读取的是本地图片文件,这在爬虫实际运行中可能不够便捷。感兴趣的用户可自行修改代码,将输入参数改为图片数据流(BytesIO等)以适配网络请求场景。

以上即为使用Python识别滑块验证码缺口的完整教程,更多相关技术细节可参考本站其他文章。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。