蓝奏云数值验证码识别,python调用虹鱼图灵识别插件,超高正确率
识别验证码一直是本人想要做的事情,一直在接触按键精灵,了解到有一个虹鱼图灵识别插件专门做验证码和图像识别,原理就是图片处理和制作字库识别,制作字库我一直觉得很麻烦,工程量太大。不管怎样,它能用能达到我的目的,并且比机器学习,opencv是要简单点,那我就讲讲这个虹鱼图灵识别插件。
很多人学习python,不知道从何学起。
很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
很多已经做案例的人,却不知道如何去学习更加高深的知识。
那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
QQ群:1097524789
先亮一下成果勾引,嘿嘿
一.收集验证码图片。
就找一个最常见的蓝奏云的下载输入的验证码。fiddler抓一下,说一下这个验证码特征,都是数字,1-4个数字,没有旋转,没有在一行,有干扰直线,有干扰点。
找到链接了,接下来写代码,这个验证码图片接口,没有任何反爬。新建一个save_img.py,新建两个文件夹,一个做字库,一个做验证集。一个100张。先爬两百张图片。
import requestsurls = "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。
import TURINGimport easyguiimport cv2def 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, 00110000000011000110100001001110000100011000000001110010001101011011100001101100datas = TURING.Incise_GetCharData()# add_num这是要在opencv画框的边缘扩充参数,下面会用插件的捕获到框框数据绘制大一点的框框来制作字库,好看一点add_num = 3if 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)
三.来验证,算一下正确率
import TURINGimport easyguidef 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_datasuc = 0for i in range(100):res = identifys(i)if res:#统计正确的数量suc =suc+1print(suc)
运行的效果就是本贴第一个图
GitHub链接:https://github.com/koala9527/lanzouyun_Code
最后总结:
弄完了贼有成就感,这种验证码还是有很多地方在用的,PHP框架里面好多项目都用这种验证码,最主要还是要了解图像处理的原理才会融会贯通,要继续学习继续努力,验证码越来越难了。
这还是一个简单的测试版本,验证了100个图片正确了91个,有的人眼分的不是很清楚,已经很可以了如果还想提高准确度,可以再加一些字库,或者更换图片处理方式,或者修改人眼识别库的错误等等。感谢大家的欣赏,多多关注评论点击在看,才是我继续下去的动力,哈哈
蓝奏云数值验证码识别,python调用虹鱼图灵识别插件,超高正确率的更多相关文章
- stars-one原创工具——蓝奏云批量下载工具
一款可以批量下载蓝奏云分享的文件夹下的所有文件 基于HtmlUnit和okhttp开源库,所以打包后的jar包文件有点大 蓝奏云下载地址 github地址 需求 之前找电子书资源的时候,网友分享的蓝奏 ...
- 自然语言处理工具python调用hanlp中文实体识别
Hanlp作为一款重要的中文分词工具,在GitHub的用户量已经非常之高,应该可以看得出来大家对于hanlp这款分词工具还是很认可的.本篇继续分享一篇关于hanlp的使用实例即Python调用hanl ...
- 人脸识别 python调用face++ 功能测试
使用python调用face++的API,调用detect功能,识别人脸 首先进入face++官网注册,获得API Key和API Secret.使用官网提供的免费python api调用功能,提供了 ...
- 百度人脸识别python调用例子
# 首先pip install baidu-aip # SDK文档链接http://ai.baidu.com/docs#/Face-Python-SDK/top import base64 from ...
- Python调用WIN10语音交互+识别+控制+自定义对话
1 安装库文件 2修改两个地方 最简单的 # 将输入文字转化为语音信号输出 import speech while True: speech.say("请输入:") str = i ...
- 蓝奏网盘API
蓝奏云网盘API 2.0 基于Python3实现,最强的蓝奏云API~ 蓝奏云注册 更新说明 修复了登录时 formhash 错误的问题 解决了多次上传大文件被限制的问题 #3 细化 API 接口的功 ...
- 蓝奏网盘CMD控制台
LanZouCloud-CMD 2.0 基于蓝奏云API开发的CMD版蓝奏云控制台 Github : https://github.com/zaxtyson/LanZouCloud-CMD 更新说明 ...
- 利用百度云接口实现车牌识别·python
一个小需求---实现车牌识别. 目前有两个想法 1. 调云在线的接口或者使用SDK做开发(配置环境和变异第三方库麻烦,当然使用python可以避免这些问题) 2. 自己实现车牌识别算法(复杂) 一开始 ...
- python调用腾讯云短信接口
目录 python调用腾讯云短信接口 账号注册 python中封装腾讯云短信接口 python调用腾讯云短信接口 账号注册 去腾讯云官网注册一个腾讯云账号,通过实名认证 然后开通短信服务,创建短信应用 ...
随机推荐
- golang | Go语言入门教程——结构体初始化与继承
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是golang专题第10篇文章,我们继续来看golang当中的面向对象部分. 在上一篇文章当中我们一起学习了怎么创建一个结构体,以及怎么 ...
- Makefile中自动生成头文件依赖
为什么需要自动生成头文件依赖? 编译单个源文件时,需要获取文件中包含的头文件的信息,但是一般的Makefile不会在规则中明确写明文件依赖的头文件,所以单独修改头文件后,不会导致包含头文件的源文件重新 ...
- C++语法小记---同名覆盖
同名覆盖 子类中的同名成员会覆盖父类中的同名成员,但是在内存中仍然存在,只是无法直接访问,需要加上域名才能访问 子类中的同名函数会覆盖父类中的函数,复写是同名覆盖的一种特殊情况,只要不是多态场景,复写 ...
- 题解 洛谷 P3734 【[HAOI2017]方案数】
可以先考虑没有障碍物的情况,设计状态\(f_{i,j,k}\),表示到达坐标 \((x,y,z)\)二进制下,\(x\)有\(i\)位,\(y\)有\(j\)位,\(z\)有\(k\)位的方案数. 得 ...
- 火狐浏览器如何使用二次验证码/虚拟MFA/两步验证/谷歌验证器?
一般点账户名——设置——安全设置中开通虚拟MFA两步验证 具体步骤见链接 火狐浏览器如何使用二次验证码/虚拟MFA/两步验证/谷歌验证器? 二次验证码小程序于谷歌身份验证器APP的优势 1.无需下载 ...
- JS常用知识点(一)
1.js数据类型 基本类型:String.Number.boolean.null.undefined.Symbol 引用类型:Object null和undefined的区别:undefined表示定 ...
- Java程序斗地主发牌代码,List、Map集合的应用
Java集合存储的灵活运用List集合存储 54个编号 Map <key,value> key 对应的是编号 , value 是 牌的花色(红方梅黑)+ 具体的一张牌 ,比如 黑桃2 用2 ...
- APP自动化 -- 坐标获取和点击
一.获取元素坐标 二.点击坐标 1.driver的点击(这个可以实现多点同时点击) 1)执行 这个coordinate变量必须是一个list coordinate_list = [(0, 0), (1 ...
- 一文了解JDK12 13 14 GC调优秘籍-附PDF下载
目录 简介 那些好用的VM参数 G1的变化 配置FlightRecorder RAM参数 JDK13中的ZGC RTM支持 总结 简介 想了解JDK12,13,14中的GC调优秘籍吗?想知道这三个版本 ...
- SPRING 阅读--JdkDynamicAopProxy
一.简介 JdkDynamicAopProxy 代理类是spring 默认的JDK动态的代理类实现.它实现了Java 动态代理接口InvocationHandler接口和Spring定义的AopPro ...