本帖最后由 打字的小强 于 2020-6-5 13:11 编辑

识别验证码一直是本人想要做的事情,一直在接触按键精灵,了解到有一个虹鱼图灵识别插件专门做验证码和图像识别,原理就是图片处理和制作字库识别,制作字库我一直觉得很麻烦,工程量太大。不管怎样,它能够达到我的目的,并且比机器学习,opencv是要简单点,那我就讲讲这个虹鱼图灵识别插件。

先亮一下成果勾引,嘿嘿

codes.gif (434.76 KB, 下载次数: 0)

2020-6-5 11:44 上传

一.收集验证码图片。

就找一个最常见的蓝奏云的下载输入的验证码。fiddler抓一下,说一下这个验证码特征,都是数字,1-4个数字,没有旋转,没有在一行,有干扰直线,有干扰点。

QQ截图20200605101518.png (88.69 KB, 下载次数: 0)

2020-6-5 10:16 上传

QQ截图20200605101528.png (19.73 KB, 下载次数: 0)

2020-6-5 10:16 上传

找到链接了,接下来写代码,这个验证码图片接口,没有任何反爬。新建一个save_img.py,新建两个文件夹,一个做字库,一个做验证集。一个100张。先爬两百张图片。

[Python] 纯文本查看 复制代码import requests

urls = "https://vip.d0.baidupan.com/file/imagecode.php"

for i in range(100):

datas = requests.get(urls)

with open('./verify/'+str(i)+'.png', 'wb') as file:

file.write(datas.content)

二.处理图片,制作字库

预先说明,虹鱼图灵识别插件跟大漠一样,只能用32位的python调用,建议用conda新建python3.7 32位的python虚拟环境,cmd进入环境安装相关包,不要在pycharm安装。

虹鱼图灵识别插件需要事先注册到系统,下载图灵2.82(Python公开版),里面有安装教程,本人测试的系统为win10。

[Python] 纯文本查看 复制代码import TURING

import easygui

import cv2

def identi(names):

img_data = "./pic/"+str(names)+".png"

TURING.Pixel_FromPicture(img_data)

im = cv2.imread(img_data)

#切割图片,保留有效的图片

im = im[0:30, 0:99]

TURING.Filter_Tailor(0,0,99,30)

#色调分离,将整个图片的颜色分为几种。下面的函数将图片分成四种颜色分别为:0,85,170,255。将每一个点的rgb平均值放到四个区间对比。这四个区间为:0-64,64-128,128-192,192-255。落在每个区间就会固定一个颜色值,方便后面的图像处理

TURING.Filter_Posterization(4)

#二值化,其中的参数是色阶阈值,色阶阈值:一个点分为rgb三个值,三个值的平均值为阈值。该函数的作用就是遍历图像的每一个点的rgb平均值改变点的颜色,大于阈值为白色。小于阈值为黑色,现在设置阈值为95,处理后就会变成黑白色的图片了。

TURING.Filter_Binaryzation("95")

#去除杂点,现在是白底黑字,每个像素点周围一共8个点。周围大于8个白点是就由白变黑 ,作用就是去除孤立的颜色点

TURING.Filter_Despeckle(8,0,0)

#颜色反转 转前白底黑字 转后黑底白字,只有黑底白字才能进行字符切割。

TURING.Filter_InverseColor()

#范围投影字符切割,最重要的一步,非常难解释。为插件作者独创的算法,简单的说一下大概的内容,如有人想仔细了解可以问作者哈哈。作用就是找到切割验证码的字符,识别有几个字符,字符的范围和位置

#现在是黑底白字的图片,以每一个白点为一个字符范围起始点。字符范围为一个矩形,需要一个终点才能圈成一个矩形,从上往下从左往右遍历找终点,第一步就是识别这个白点的右下角的颜色如果也是白色,终点往下移动,(高度+1),如果是黑色,终点就要往右下角移动(高+1,宽+1),直到遇到图片的边缘或者超过设置的间隙。

#这时候要注意一个字可能会被切成两个部分,就要设置行间隙和列间隙。下面根据实际情况设置最小的行间隙和列间隙就是8,字符之间的间隔最少为8个像素,还可以设置其他的参数,比如矩形框的宽高范围,不在范围的框框抛弃

TURING.Incise_ScopeAisle(8,8)

#获取切割后的数据,返回值是字符串比较长,每个框的数据以竖杠分割,其中一个框的数据有四个,分别是左上角的坐标,宽高,图色数据以逗号分割,拿两个点的数据给大家看看

#8, 13, 8, 10, 00111111000111110110110001000110001000011000100000110011001101100111100000001100 | 30, 11, 8, 10, 00110000000011000110100001001110000100011000000001110010001101011011100001101100

datas = TURING.Incise_GetCharData()

# add_num这是要在opencv画框的边缘扩充参数,下面会用插件的捕获到框框数据绘制大一点的框框来制作字库,好看一点

add_num = 3

if len(datas)>0:

datas_list = datas.split("|")

for j in datas_list:

data_lists = j.split(",")

x1 =int(data_lists[0])-add_num #左上角的x坐标

y1 = int(data_lists[1])-add_num #左上角y坐标

x2 = int(data_lists[0]) +int(data_lists[2])+add_num #框的宽

y2 = int(data_lists[1])+int(data_lists[3])+add_num #框的高

cv2.rectangle(im,(int(x1),int(y1)),(int(x2),int(y2)),(255,0,255),1) #绘制框框

im = cv2.resize(im, None, fx=2.5, fy=2.5, interpolation=cv2.INTER_CUBIC) # 图太小了,需要宽高各乘以2.5来看下这个图以便人工识别这个图的数字是多少

cv2.imshow("draw_0", im)

cv2.moveWindow("draw_0", 800, 300) # 移动显示图片的窗口,因为默认的位置遮挡了下面的输入弹窗

#统计识别的字符个数

data_len = len(datas_list)

#弹窗显示原始验证码,显示验证码的个数,输入框人工输入数字

input_data = easygui.enterbox(msg="请输入" + str(data_len) + "个字符添加进入字库:", title=' ', default=' ', strip=True,

image=img_data, root=None)

for k in range(data_len):

# 组装字库的内容

data_lists = datas_list[k].split(",")

#制作字库

insert_data = input_data[k] + "|" + data_lists[2] + "," + data_lists[3] + "|" + data_lists[4]

#添加字库数据进入字库文件

print("插入数据:"+input_data[k] + "|" + data_lists[2] + "," + data_lists[3] + "|" + data_lists[4] )

with open("识别库1.lib", 'a+') as f:

f.write(insert_data + "\n")

#关闭所有opencv创建的窗口

cv2.destroyAllWindows()

else:

return

#遍历所有的验证码

for i in range(100):

identi(i)

code.gif (690.31 KB, 下载次数: 0)

2020-6-5 11:44 上传

三.来验证,算一下正确率

运行的效果就是本贴第一个图

[Python] 纯文本查看 复制代码import TURING

import easygui

def identifys(names):

#打开图片,同样的处理图片

TURING.Pixel_FromPicture("./verify/" + str(names) + ".png")

TURING.Filter_Tailor(0, 0, 99, 30)

TURING.Filter_Posterization(4)

TURING.Filter_Binaryzation("95")

TURING.Filter_Despeckle(8, 0, 0)

# 颜色反转 ()转后黑底白字,转前白底黑字

TURING.Filter_InverseColor()

TURING.Incise_ScopeAisle(8, 8)

TURING.Lib_Load("识别库1.lib") #加载识别字库

识别结果 =TURING.OCR(0, 1) #获取识别结果,可以设置结果格式,可以显示相似度,和x,y坐标等等。是一个字符串,以|分割,

result =识别结果.split("|")[0]

#来个弹框来肉眼证明结果的准确性

choices_data = easygui.ccbox(msg='识别结果是'+result, title=' ', choices=('True', 'false'), image="./verify/" + str(names) + ".png")

return choices_data

suc = 0

for i in range(100):

res = identifys(i)

if res:

#统计正确的数量

suc =suc+1

print(suc)

GitHub链接:https://github.com/koala9527/lanzouyun_Code

最后总结:

弄完了贼有成就感,这种验证码还是有很多地方在用的,PHP框架里面好多项目都用这种验证码,最主要还是要了解图像处理的原理才会融会贯通,要继续学习继续努力,验证码越来越难了。

这还是一个简单的测试版本,验证了100个图片正确了91个,有的人眼分的不是很清楚,已经很可以了如果还想提高准确度,可以再加一些字库,或者更换图片处理方式,或者修改人眼识别库的错误等等。感谢大家的欣赏,有帮助给个免费评分哦,或者多多关注我,才是我继续下去的动力,哈哈

验证码识别的原理python_蓝奏云数值验证码识别,python调用虹鱼图灵识别插件,超高正确率...相关推荐

  1. 蓝奏云数值验证码识别,python调用虹鱼图灵识别插件,超高正确率

    识别验证码一直是本人想要做的事情,一直在接触按键精灵,了解到有一个虹鱼图灵识别插件专门做验证码和图像识别,原理就是图片处理和制作字库识别,制作字库我一直觉得很麻烦,工程量太大.不管怎样,它能用能达到我 ...

  2. 附源码,90%验证码识别成功率,Python调用虹鱼图灵识别插件

    识别验证码一直是本人想要做的事情,一直在接触按键精灵,了解到有一个虹鱼图灵识别插件专门做验证码和图像识别,原理就是图片处理和制作字库识别,制作字库我一直觉得很麻烦,工程量太大.不管怎样,它能够达到我的 ...

  3. 【油猴脚本】鼠标选中跳转蓝奏云有效链接及自动填写提取码

    简述 鼠标选中蓝奏云链接时会将链接转化为有效链接并显示跳转按钮,如果选中内容包括提取码则会在对应的网页自动填充. 地址:鼠标选中跳转蓝奏云有效链接及自动填写提取码 功能 在鼠标选中的文字是蓝奏云链接时 ...

  4. ShareList 列表程序-挂载GD/OD/蓝奏云/天翼云/和彩云......

    标题是不是很牛皮,确实,作者的思路非常符合我的心意,把网盘集合起来,还能省域名,对不对i( •̀ ω •́ )✧ 搭建sharelist 简介 序 功能说明 准备 手动宝塔安装 docker安装 部署 ...

  5. 利用腾讯云函数做蓝奏云解析API

    利用腾讯云函数做蓝奏云解析API 前言 忽然在网上看到网友说tenapi的蓝奏云解析不能用了,恰巧又在B站上看到某up主的相关文章,一时起意就用up主的代码稍加更改,改造了个能在腾讯云函数跑起来的版本 ...

  6. Linux下载蓝奏云文件,蓝奏云CMD控制台

    蓝奏云CMD控制台是一个蓝奏云的第三方API客户端,封装了对蓝奏云的基本操作: 登录.列出文件.下载文件.上传文件.删除文件(夹). 清空回收站.恢复文件.创建文件夹.设置文件(夹)访问密码.此外,还 ...

  7. 吴恩达深度学习相关资源下载地址(蓝奏云)

    蓝奏云 dropout instr.zip [吴恩达课后编程作业]第二周 - PA1 - 具有神经网络思维的Logistic回归.zip Week 3 - PA 2 - Planar data cla ...

  8. 通过蓝奏云与云端检测来实现软件自动更新

    目录 一.自动更新原理: 1.通过Python对蓝奏云api的获取分析检测用以下载 2.在通过本文的内容检测达到更新检测的目的 3.通过对版本号的对比进行自动更新检测​​​​​​​ 二.更新检测区块: ...

  9. 蓝奏云密码破解软件v1.0

    昨天花了几个小时写出来的蓝奏云密码破解软件,效率还行, 基本上2个小时肯定能跑出来. 原理就是很简单粗暴, 尝试从0000到zzzz的所有组合.爆破出来之后 会自动保存密码到文档里 后面可能会更新出多 ...

最新文章

  1. WordPress Editorial Calendar插件权限安全绕过漏洞
  2. CentOS7编译安装MySQL5.7之后安装mysql-devel出错解决方案
  3. PHP笔记 ---关于web应用的安全性问题
  4. 【测评】用这款神器2小时就撸完了1天工作量的代码!爽
  5. Nginx:Nginx limit_req limit_conn限速
  6. java mvc返回js_技术趋势:是什么让MVC悄然消失的?
  7. FPI(Fixed-point Iteration)不动点迭代法——迭代求方程的方法
  8. Zener二极管(稳压二极管)型号对照表--1N52xx系列
  9. 【MOS】Redundant Interconnect ora.cluster_interconnect.haip (文档 ID 1210883.1)
  10. AR Camera开发记录(三) -- 替换人脸贴图
  11. 金蝶K3采购价格管控杂谈
  12. 平板电脑用来C语言编程可以吗,什么平板电脑能够用来编程?
  13. GRP-U8怎么增加项目
  14. 日语假名小写怎么打出来?
  15. 逆序字符串 和 字符串的逆序输出 的区别~
  16. 在C语言中为什么c1出现错误,我在用C语言编程时,编译后总出现Error:spawning C1.exe的错误,看不懂,是什么意思啊??快快快,谢谢!...
  17. HTTP中常见的状态码代表的意思比如202、303、404、505、访问网络时有时经常见的状态,也是面试题中关于HTTP经常出现的
  18. C++primer学习(13.拷贝控制)
  19. jQuery仿QQ音乐播放器
  20. Pytorch CNN 手写数字识别 0-9

热门文章

  1. 台式电脑CPU散热器怎么选?
  2. java jms 消息服务_Java消息服务JMS详解
  3. Niushop分销系统佣金算法设计思路
  4. 日本半导体的隐形冠军
  5. CocosCreator之Button按钮
  6. python期中考试试卷分析_最新期中考试试卷分析与反思
  7. 什么是反向代理服务器
  8. 什么是元组以及元组的作用
  9. 【爬虫】网页抓包工具--Charles的使用教程
  10. 听说火狐要换Logo,网友们掀起了一场“战争”