滑块验证码的识别

滑块验证码的识别滑块验证码的识别前言一 滑块验证码的形式二 采用的方法 1 滑块图 背景图切分 2 模板匹配总结前言最近在一个比价的公司实习 公司里面主要使用爬虫来获取一件商品在其他平台的价格 但是在大部分的时候别的平台不愿意把价格数据直接给你 他们会进行一些反爬的手段 例如使用验证码 验证码有很多的类型 今天主要来说说遇到的滑块验证码的识别 一 滑块验证码的形式滑块验证码的形式也很多 大多都类似下面这样的 一般类似这样的验证码已经有很成熟的解决方案了 比如 js 激活成功教程 图像识别激活成功教程等等 但是我在项目中遇到的验证码有一


前言

最近在一个比价的公司实习,公司里面主要使用爬虫来获取一件商品在其他平台的价格。但是在大部分的时候别的平台不愿意把价格数据直接给你,他们会进行一些反爬的手段。例如使用验证码。验证码有很多的类型,今天主要来说说遇到的滑块验证码的识别。


一、滑块验证码的形式

滑块验证码的形式也很多,大多都类似下面这样的。滑块验证码一般类似这样的验证码已经有很成熟的解决方案了。比如js激活成功教程,图像识别激活成功教程等等。但是我在项目中遇到的验证码有一点不同是下面这种验证码(拼夕夕的验证码)可以看到背景更复杂,而且它使用两个缺口,两个缺口的形状不一样,因此对于此类验证码识别更加困难。
在这里插入图片描述

二、采用的方法

对该类新型验证码分析,最开始准备使用深度学习的方法,大力出奇迹,但是有一个现实问题没多少数据。公司目前收集的也只有六七十张,于是只好放弃深度学习,采用传统方法opencv来做。使用opencv做的思路就是,获取滑块图和背景图,进行模板匹配,匹配度最高作为结果输出

1.滑块图、背景图切分

想要拿到干净的滑块图和背景图需要进行js激活成功教程,这个激活成功教程比较耗时一张验证码大概需要30s,30s后验证码都失效了,所以我只能手动切图。下面是切图代码:

def crop(img_name): img = cv2.imread(img_name) # bg = img[130:,0:362] # 裁剪坐标为[y0:y1, x0:x1] part = img[0:362,0:139] bg = img[0:362,139:] # cv2.imwrite("part_crop.png", part) # cv2.imwrite("bg_crop.png", bg) return bg,part 

2.模板匹配

对切好的图片先进行轮廓提取,然后再使用模板匹配,其中轮廓提取使用了Canny算子:

def detect_captcha_gap(bg,tp): ''' bg: 背景图片 tp: 缺口图片 return:空缺距背景图左边的距离 ''' # 读取背景图片和缺口图片 # bg_img = cv2.imread(bg) # 背景图片 # tp_img = cv2.imread(tp) # 缺口图片 bg_img = bg tp_img = 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) # cv2.imwrite("bg_style.png",bg_pic) # 保存背景轮廓提取 # cv2.imwrite("slide_style.png",tp_pic) # 保存滑块背景提取 # 缺口匹配 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 # 左上角点的坐标 # 返回缺口的左上角X坐标 br = (tl[0]+tw,tl[1]+th) # 右下角点的坐标 cv2.rectangle(bg_img, tl, br, (0, 0, 255), 2) # 绘制矩形 cv2.imwrite("result_new.png", bg_img) # 保存在本地 # 返回缺口的左上角X坐标 return tl[0] 

下面是Canny算子提取的轮廓图,可以发现效果还是不错,能够看到两幅图中的相似轮廓。
在这里插入图片描述
在这里插入图片描述
模板匹配的结果在这里插入图片描述
目前已经能够正确匹配出滑块对应缺口的位置了。




总结

做完这个项目发现即使在深度学学习迅猛发展的今天,传统视觉仍然有巨大的作用。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233176.html原文链接:https://javaforall.net

(0)
上一篇 2025年8月9日 下午6:01
下一篇 2025年8月9日 下午6:22


相关推荐

  • 栈(stack) C语言实现 详解

    栈(stack) C语言实现 详解栈是数据结构中较为简单的结构体 是一种操作收到限制的线性表 但简单不代表没用 毕竟数组还贼简单呢 谁敢说数组没用 栈栈的理论栈是一个先进后出的结构 类似于堆盘子 先放到地上的盘子最后被取走 默认只能取走一个盘子 栈其实就是操作受限的线性表 只有一个口 每一次操作时 这个口可以当出口也可以当入口 例如 水桶 注入水时 水桶的头当做入口 倒水时 水桶的头当做出口栈的图解 在图解之前 先举一个例

    2026年3月17日
    1
  • webstorm激活码2021年【注册码】

    webstorm激活码2021年【注册码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月18日
    64
  • mysql的latin1_MySQL编码latin1转utf8

    mysql的latin1_MySQL编码latin1转utf8mysql 移植含有中文的数据时 很容易出现乱码问题 很多是在从 mysql4 x 向 mysql5 x 移植的时候出现 mysql 的缺省字符集是 latin1 在使用 mysql4 x 的时候 很多人都是用的 latin1 字符集 而当使用 mysql5 时往往愿意使用 utf8 那么我们的任务是不是要把数据中的字符从 latin1 转为 utf8 呢 不是的 用一句不大准确 但又比较形象的说法是 在之前的系统中 我们是用

    2026年3月20日
    2
  • NeuralAgent:使用语音和文字操作电脑完成任务的AI智能体

    NeuralAgent:使用语音和文字操作电脑完成任务的AI智能体

    2026年3月15日
    2
  • 机器学习、云计算与智能挖掘国际会议MLCCIM2022

    机器学习、云计算与智能挖掘国际会议MLCCIM2022会议基本信息【会议简称】:MLCCIM2022【会议全称】:InternationalConferenceonMachineLearning,CloudComputingandIntelligentMining【截稿日期】:2022年3月21日【会议时间】:2022年5月27-29日【大会官网】:http://www.mlccim.org/【投稿邮箱】:mlccim@126.com【会议地点】:中国·厦门【收录检索】:EI、Scopus大会主席龙汉,

    2022年7月25日
    36
  • c语言入门教程–-2基本语法

    c语言入门教程–-2基本语法

    2021年3月12日
    252

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号