gpt4 book ai didi

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

转载 作者:qq735679552 更新时间:2022-09-28 22:32:09 37 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章OpenCV搞定腾讯滑块验证码的实现代码由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

前言 。

废话 。

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

环境 。

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

pip install opencv-python 。

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

?
1
2
3
4
5
6
7
8
9
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%以上 。

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# 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搞定腾讯滑块验证码的实现代码

实现代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 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搞定腾讯滑块验证码的实现代码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.

原文链接:https://segmentfault.com/a/1190000019218588 。

最后此篇关于OpenCV搞定腾讯滑块验证码的实现代码的文章就讲到这里了,如果你想了解更多关于OpenCV搞定腾讯滑块验证码的实现代码的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com