尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
使用OpenCV识别滑块验证码(极验、数美)
前言该文章为学习使用严禁用于商业用途和非法用途否则由此产生的一切后果均与作者无关如有侵权请私信联系作者删除~正文极验这个滑块分别是由带缺口的背景图和滑块图两张图组成。如何识别出缺口的位置思路边缘检测模板匹配用滑块的图在背景图上从左到右、从上到下去遍历。每一次遍历去算一下子区域的相似度importcv2# 读取背景图片和滑块图片# 参数说明:# bg.png - 背景图片路径(包含滑块缺口)# slide.png - 滑块图片路径# 返回值:# bg - 背景图片的NumPy数组# slide - 滑块图片的NumPy数组bgcv2.imread(bg.png)slidecv2.imread(slide.png)# 使用Canny算法进行边缘检测# 参数说明:# 第一个参数 - 输入图像# 70 - 低阈值用于边缘连接# 200 - 高阈值用于强边缘检测# 返回值:# canny_bg - 背景图的边缘检测结果# canny_slide - 滑块的边缘检测结果canny_bgcv2.Canny(bg,70,200)canny_slidecv2.Canny(slide,70,200)# 执行模板匹配# 参数说明:# canny_bg - 被搜索图像(背景图边缘)# canny_slide - 搜索模板(滑块边缘)# cv2.TM_CCOEFF_NORMED - 使用归一化相关系数匹配方法# 返回值:# res - 匹配结果矩阵rescv2.matchTemplate(canny_bg,canny_slide,cv2.TM_CCOEFF_NORMED)# 获取匹配结果中的极值信息# 参数说明:# res - 模板匹配结果矩阵# 返回值:# min_val - 最小匹配值# max_val - 最大匹配值(最佳匹配位置)# min_loc - 最小匹配值的位置坐标(行,列)# max_loc - 最大匹配值的位置坐标(缺口左上角坐标)min_val,max_val,min_loc,max_loccv2.minMaxLoc(res)# 计算滑块在背景图中的位置# 获取缺口左上角坐标x1,y1max_loc# 计算缺口右下角坐标# slide.shape[1] - 滑块宽度# slide.shape[0] - 滑块高度x2,y2x1slide.shape[1],y1slide.shape[0]# 在背景图上绘制矩形框标记匹配结果# 参数说明:# bg - 目标图像# (x1, y1) - 矩形左上角坐标# (x2, y2) - 矩形右下角坐标# (0,0,255) - 颜色(BGR格式红色)# 2 - 线宽cv2.rectangle(bg,(x1,y1),(x2,y2),(0,0,255),2)# 显示处理结果# 显示带标记的背景图cv2.imshow(bg,bg)# 显示原始滑块图cv2.imshow(slide,slide)# 等待用户按键# 参数0表示无限等待cv2.waitKey(0)效果数美可以看到这个数美的滑块和极验的会有些不一样数美返回的是一个长条我们在模板匹配的时候可以对图片进行裁剪再去识别如上图以此提高精度。defextract_slide(img): 从滑块图片中提取有效滑块区域去除上下空白部分 参数: img: 输入的滑块图片(numpy数组格式BGR三通道) 返回值: img[start_r:end_r 1, :, :]: 裁剪后的有效滑块区域 start_r: 滑块起始行号(上边界) end_r: 滑块结束行号(下边界) start_r0# 初始化滑块起始行end_r0# 初始化滑块结束行# 从上到下逐行扫描寻找滑块的上边界forrinrange(img.shape[0]):# img.shape[0]是图片高度(行数)# 计算当前行所有像素值的和(判断是否有非零像素)ifnp.sum(img[r,:,:])0:# 如果当前行有非零像素start_rr# 记录滑块起始行# 从起始行继续向下扫描寻找滑块的下边界forrrinrange(r1,img.shape[0]):ifnp.sum(img[rr,:,:])0:# 遇到全零行(空白行)end_rrr# 记录滑块结束行break# 找到下边界后退出循环break# 找到上下边界后退出外层循环# 返回裁剪后的滑块区域和边界坐标returnimg[start_r:end_r1,:,:],start_r,end_r# 读取背景图片和滑块图片# bg.jpg - 包含滑块缺口的背景图片# slide.png - 滑块图片bgcv2.imread(bg.jpg)# 读取背景图(BGR格式)slidecv2.imread(slide.png)# 读取滑块图(BGR格式)# 提取滑块有效区域(去除上下空白部分)# real_slide - 裁剪后的有效滑块区域# start_r - 滑块在原始图片中的起始行# end_r - 滑块在原始图片中的结束行real_slide,start_r,end_rextract_slide(slide)# 裁剪背景图使其高度与滑块匹配(只处理滑块可能出现的区域)# 这样可以减少计算量并提高匹配精度real_bgbg[start_r:end_r1,:,:]# 边缘检测(使用Canny算法)# 参数说明:# 70 - 低阈值用于边缘连接# 200 - 高阈值用于强边缘检测canny_bgcv2.Canny(real_bg,70,200)# 背景图边缘检测canny_slidecv2.Canny(real_slide,70,200)# 滑块边缘检测# 模板匹配(在背景中寻找滑块位置)# cv2.TM_CCOEFF_NORMED - 使用归一化相关系数匹配方法rescv2.matchTemplate(canny_bg,canny_slide,cv2.TM_CCOEFF_NORMED)# 获取匹配结果中的最佳匹配位置# min_val - 最小匹配值# max_val - 最大匹配值(最佳匹配分数)# min_loc - 最小匹配位置# max_loc - 最大匹配位置(最佳匹配位置)min_val,max_val,min_loc,max_loccv2.minMaxLoc(res)# 计算滑块在背景图中的位置x1,y1max_loc# 最佳匹配位置的左上角坐标# 计算右下角坐标(加上滑块的宽度和高度)x2,y2x1real_slide.shape[1],y1real_slide.shape[0]# 在背景图上绘制红色矩形框标记匹配到的滑块位置# (0, 0, 255) - BGR颜色格式(红色)# 2 - 线宽(像素)cv2.rectangle(real_bg,(x1,y1),(x2,y2),(0,0,255),2)# 显示处理结果cv2.imshow(bg,real_bg)# 显示带标记的背景图cv2.imshow(slide,real_slide)# 显示裁剪后的滑块图# 等待用户按键(0表示无限等待)cv2.waitKey(0)extract_slide()函数通过扫描图像行来去除滑块图片的上下空白部分提高匹配精度背景图也做了相同高度的裁剪减少不必要的计算边缘检测后使用模板匹配技术找到滑块在背景中的位置整个过程优化了计算区域提高了效率最终结果用红色矩形框标出匹配位置效果图最后欢迎联系作者交流更多
RELATED

相关推荐

Pillow识别极验消消乐验证码

Pillow识别极验消消乐验证码

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/11/6 1:17:58
CAPWAP隧道基本概念:集中转发和本地转发

CAPWAP隧道基本概念:集中转发和本地转发

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/11/6 1:17:58
Verilog基础:disable语句

Verilog基础:disable语句

相关文章 Verilog基础专栏https://blog.csdn.net/weixin_45791458/category_12263729.html 1.disable语句 Verilog中的disable语句提供了提前终止任务或命名块执行的能力,它本质上属于过程控制语句,作用类似于“强制跳出某个正在执行的过程范围”。和普…

📅 2026/11/6 1:12:58
MORE NEWS

更多资讯

📰

小程序抓包抓不到明文:SSL校验分层与绕过验证

简介:该资源聚焦于支付宝小程序 SSL 验证机制的研究与调试场景,面向从事移动端抓包分析、接口调试及安全测试的开发者与进阶学习者,提供借助 Frida 动态注入与代理工具绕过证书校验、恢复小程序网络流量可见性的实践素材。压缩包共 3 个文件&…

📰

Windows Server 2012/2016 RAID驱动加载与DISM注入

简介:面向在 Windows Server 2012 R2 和 2016 64 位环境中部署、维护 530 与 930 系列 RAID 阵列卡的服务器管理员和运维人员,这份驱动集合用于解决系统无法正确识别阵列卡、RAID 功能不可用以及存储性能难以正常发挥等问题,适合物理服务器、…

📰

530/930 RAID阵列卡驱动:Windows Server装机与DISM注入排错

简介:面向在 Windows Server 2012 R2 与 2016 环境中维护 530、930 系列阵列卡的管理员和运维人员,这套驱动集合用于解决系统无法正确识别阵列卡、RAID 功能不可用及安装部署阶段的兼容性问题,也可作为服务器重装或磁盘阵列排障时的驱动备份。…

📰

Java Swing森林冰火人单人版小游戏源码:瓦片地图与AABB碰撞解析

简介:这份Java小游戏项目以森林冰火人单人版为主题,面向Java初学者、课程设计学生及游戏开发入门者,帮助读者通过一个可运行的案例理解图形界面、事件处理与基础游戏逻辑。压缩包共78个文件,约2.98MB,包含6个java源码、…

📰

CNN人脸识别全流程:MTCNN对齐、ArcFace训练与部署

简介:面向深度学习与人脸识别入门学习者的CNN实战代码包,围绕Olivetti人脸数据集,提供从模型训练到识别调用的完整可运行示例,适合已具备Python基础、希望理解卷积神经网络在人脸分类任务中落地方式的学生与开发者参考。压缩包共4…

📰

交通银行江苏省分行试水词元贷:不押厂房给两家工厂批了6200万

交通银行江苏省分行试水词元贷:不押厂房给两家工厂批了6200万 去银行申请几千万元贷款,企业通常要带上什么?房产证、土地证、厂房设备发票,或者厚厚一叠抵押担保合同。但在2026年11月初的江苏,两家实体企业走进交通银行…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬