OpenCV搞定腾讯滑块验证码的实现代码


Posted in Python onMay 18, 2019

前言

废话

滑块验证码破解是一直都想搞的项目,毕竟多数网站都会采用滑块验证码,于是最近在修改论文的闲暇之余把这事儿给解决了。要搞现在的滑块验证码绕不开图像处理,图像处理当然是首推OpenCV-Python啦!当然我的OpenCV非常菜(P.S.两天速成不敢保证代码质量),发现问题就直接指出嘛,不用走流程啦!

环境

首先需要一个python,然后安装opencv的python库,如下:

pip install opencv-python

然后测试一下是否可用,如下:

import cv2 as cv
import numpy as np

if __name__ == '__main__':
 img = np.ones((200, 200, 3), np.uint8) * 255
 cv.rectangle(img, (50, 50), (150, 150), (0, 0, 255), 2)
 cv.imshow('test', img)
 cv.waitKey(0)
 cv.destroyAllWindows()

正常的话就会如下显示:

OpenCV搞定腾讯滑块验证码的实现代码

OpenCV的使用

相关的API我也是边用边查的,用得也是相当生疏!具体的常用方法大家只好自行百度了,我就不献丑了!

实现原理及方法

腾讯滑块验证

这次搞得目标就是腾讯滑块验证码,调用腾讯滑块这个接口的网站还是挺多的,比如非常好用的在线画图网站ProcessOn,其中滑块验证部分类似这样子的:

OpenCV搞定腾讯滑块验证码的实现代码

抓个包发现只有滑块图和带缺口的图,如下:

OpenCV搞定腾讯滑块验证码的实现代码

破解滑块验证码最为关键的地方在于找到滑块缺口的位置,找到缺口位置后就可以利用Selenium模拟拖动滑块到指定位置实现破解,之前的老办法就是将完整图的像素点和带缺口图的像素点进行比较从而得到缺口位置,但是现在一般不会将完整图暴露给我们,所以只有在带有缺口的图上进行处理。我这里一共有两种方案进行缺口位置识别,一种是基于模板匹配的,另一种是基于轮廓检测的,下面会细讲两种方案的实现方法。

模板匹配识别缺口

具体是实现过程如下:

1.处理滑块的图片

  • 灰度化滑块图片
  • 处理一下滑块图中滑块的外圈
  • 使用inRange二值化滑块图
  • 使用开运算去除白色噪点

运行结果如下所示(左侧为原始滑块,右侧为处理后的滑块):

OpenCV搞定腾讯滑块验证码的实现代码

2.处理带缺口的图片

  • 先来个高斯滤波去噪
  • 灰度化带缺口图
  • 使用阈值二值化该图

运行结果如下所示(左侧为原始图,右侧为处理后的图):

OpenCV搞定腾讯滑块验证码的实现代码

3.进行模板匹配

调用模板匹配API并圈出匹配上的区域,结果如下所示:

OpenCV搞定腾讯滑块验证码的实现代码

警告警告警告

这种方法的缺口识别率在50%左右,很大一部分原因是滑块图的背景为纯白色,这在匹配时会产生很大的干扰,要是能将滑块图的背景变为透明,正确的匹配率可以达到90%以上

如果大家有任何将滑块图的背景变为透明的办法,可以留言到评论区,我真的万分感谢!!!下面是现阶段的实现代码:

# encoding:utf-8
import cv2 as cv
import numpy as np


# 对滑块进行二值化处理
def handle_img1(image):
  kernel = np.ones((8, 8), np.uint8) # 去滑块的前景噪声内核
  gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
  width, heigth = gray.shape
  for h in range(heigth):
    for w in range(width):
      if gray[w, h] == 0:
        gray[w, h] = 96
  # cv.imshow('gray', gray)
  binary = cv.inRange(gray, 96, 96)
  res = cv.morphologyEx(binary, cv.MORPH_OPEN, kernel) # 开运算去除白色噪点
  # cv.imshow('res', res)
  return res


# 模板匹配(用于寻找缺口有点误差)
def template_match(img_target, img_template):
  tpl = handle_img1(img_template) # 误差来源就在于滑块的背景图为白色
  blurred = cv.GaussianBlur(img_target, (3, 3), 0) # 目标图高斯滤波
  gray = cv.cvtColor(blurred, cv.COLOR_BGR2GRAY)
  ret, target = cv.threshold(gray, 127, 255, cv.THRESH_BINARY) # 目标图二值化
  # cv.imshow("template", tpl)
  # cv.imshow("target", target)
  method = cv.TM_CCOEFF_NORMED
  width, height = tpl.shape[:2]
  result = cv.matchTemplate(target, tpl, method)
  min_val, max_val, min_loc, max_loc = cv.minMaxLoc(result)
  left_up = max_loc
  right_down = (left_up[0] + height, left_up[1] + width)
  cv.rectangle(img_target, left_up, right_down, (0, 0, 255), 2)
  cv.imshow('res', img_target)


if __name__ == '__main__':
  img0 = cv.imread('./demo/3/hycdn_3.jpg')
  img1 = cv.imread('./demo/3/hycdn_3_2.png')
  template_match(img0, img1)
  cv.waitKey(0)
  cv.destroyAllWindows()

轮廓检测识别缺口

基于轮廓检测缺口的思路简单很多,加上合理的条件识别率在95%以上,实现过程如下:

带缺口图高斯模糊去噪用(200,400)的阈值做Canny边缘检测寻找轮廓对已有的轮廓做约束,比如轮廓的面积范围,轮廓的周长范围

多个匹配结果如下:

OpenCV搞定腾讯滑块验证码的实现代码

OpenCV搞定腾讯滑块验证码的实现代码

OpenCV搞定腾讯滑块验证码的实现代码

OpenCV搞定腾讯滑块验证码的实现代码

实现代码如下:

# encoding:utf-8
import cv2 as cv


def get_pos(image):
  blurred = cv.GaussianBlur(image, (5, 5), 0)
  canny = cv.Canny(blurred, 200, 400)
  contours, hierarchy = cv.findContours(canny, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
  for i, contour in enumerate(contours):
    M = cv.moments(contour)
    if M['m00'] == 0:
      cx = cy = 0
    else:
      cx, cy = M['m10'] / M['m00'], M['m01'] / M['m00']
    if 6000 < cv.contourArea(contour) < 8000 and 370 < cv.arcLength(contour, True) < 390:
      if cx < 400:
        continue
      x, y, w, h = cv.boundingRect(contour) # 外接矩形
      cv.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2)
      cv.imshow('image', image)
      return x
  return 0


if __name__ == '__main__':
  img0 = cv.imread('./demo/4/hycdn_4.jpg')
  get_pos(img0)
  cv.waitKey(0)
  cv.destroyAllWindows()

遗留问题

问题1

如何将滑块图的纯白背景变为透明背景?

问题2

使用Selenium和轨迹算法拖动滑块时将滑块拖出左侧的范围之外,轨迹算法是先加速后减速整体是向前移动的,按道理来说不可能往回走,但是模拟拖动的时候会出现滑块向后拖动且拖出范围的现象,这问题如何解决?

OpenCV搞定腾讯滑块验证码的实现代码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
简单了解Python下用于监视文件系统的pyinotify包
Nov 13 Python
举例讲解Python中的迭代器、生成器与列表解析用法
Mar 20 Python
python版微信跳一跳游戏辅助
Jan 11 Python
使用Numpy读取CSV文件,并进行行列删除的操作方法
Jul 04 Python
python查看模块安装位置的方法
Oct 16 Python
Python使用sklearn实现的各种回归算法示例
Jul 04 Python
Python求离散序列导数的示例
Jul 10 Python
python项目对接钉钉SDK的实现
Jul 15 Python
Python pandas RFM模型应用实例详解
Nov 20 Python
Django在Model保存前记录日志实例
May 14 Python
Python3+PyCharm+Django+Django REST framework配置与简单开发教程
Feb 16 Python
如何判断pytorch是否支持GPU加速
Jun 01 Python
Python3匿名函数lambda介绍与使用示例
May 18 #Python
python中数组和矩阵乘法及使用总结(推荐)
May 18 #Python
Python实现二叉树前序、中序、后序及层次遍历示例代码
May 18 #Python
python的内存管理和垃圾回收机制详解
May 18 #Python
Django处理多用户类型的方法介绍
May 18 #Python
Django 配置多站点多域名的实现步骤
May 17 #Python
将Python字符串生成PDF的实例代码详解
May 17 #Python
You might like
php 从数据库提取二进制图片的处理代码
2009/09/09 PHP
PHP提取数据库内容中的图片地址并循环输出
2010/03/21 PHP
PHP5.3与5.5废弃与过期函数整理汇总
2014/07/10 PHP
php目录拷贝实现方法
2015/07/10 PHP
PHP PDO和消息队列的个人理解与应用实例分析
2019/11/25 PHP
php查看一个变量的占用内存的实例代码
2020/03/29 PHP
使用JavaScript实现Java的List功能(实例讲解)
2013/11/07 Javascript
jquery showModelDialog的使用方法示例详解
2013/11/19 Javascript
JS和JQUERY获取页面大小,滚动条位置,元素位置(示例代码)
2013/12/14 Javascript
探索angularjs+requirejs全面实现按需加载的套路
2016/02/26 Javascript
实例浅析js的this
2016/12/11 Javascript
bootstrap laydate日期组件使用详解
2017/01/04 Javascript
JavaScript用JSONP跨域请求数据实例详解
2017/01/06 Javascript
gulp解决跨域的配置文件问题
2017/06/08 Javascript
基于JavaScript实现无缝滚动效果
2017/07/21 Javascript
jQuery dateRangePicker插件使用方法详解
2017/07/28 jQuery
Mui使用jquery并且使用点击跳转新窗口的实例
2017/08/19 jQuery
总结js中的一些兼容性易错的问题
2017/12/18 Javascript
微信小程序页面渲染实现方法
2019/11/06 Javascript
vue el-upload上传文件的示例代码
2020/12/21 Vue.js
基于vuex实现购物车功能
2021/01/10 Vue.js
Python计算回文数的方法
2015/03/11 Python
怎么使用pipenv管理你的python项目
2018/03/12 Python
Python3实现从排序数组中删除重复项算法分析
2019/04/03 Python
Python+OpenCV 实现图片无损旋转90°且无黑边
2019/12/12 Python
PyTorch中model.zero_grad()和optimizer.zero_grad()用法
2020/06/24 Python
详解CSS3阴影 box-shadow的使用和技巧总结
2016/12/03 HTML / CSS
简述Linux文件系统通过i节点把文件的逻辑结构和物理结构转换的工作过程
2012/04/17 面试题
应届大学生自荐信
2013/12/05 职场文书
廉洁使者实施方案
2014/03/29 职场文书
合作合同协议书范本
2015/01/27 职场文书
学校党员干部承诺书
2015/05/04 职场文书
病假条格式范文
2015/08/17 职场文书
2019学校运动会开幕词
2019/05/13 职场文书
MyBatis 动态SQL全面详解
2021/10/05 MySQL
前端canvas中物体边框和控制点的实现示例
2022/08/05 Javascript