百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

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

bigegpt 2024-08-22 10:29 2 浏览


作者:打字的小强

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

私信小编001即可获取大量python学习资料!

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

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

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。

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)


三.来验证,算一下正确率
运行的效果就是本贴第一个图

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)

最后总结:
弄完了贼有成就感,这种验证码还是有很多地方在用的,PHP框架里面好多项目都用这种验证码,最主要还是要了解图像处理的原理才会融会贯通,要继续学习继续努力,验证码越来越难了。
这还是一个简单的测试版本,验证了100个图片正确了91个,有的人眼分的不是很清楚,已经很可以了如果还想提高准确度,可以再加一些字库,或者更换图片处理方式,或者修改人眼识别库的错误等等。感谢大家的欣赏,有帮助给个免费转发哦,或者多多关注我,才是我继续下去的动力,哈哈

相关推荐

悠悠万事,吃饭为大(悠悠万事吃饭为大,什么意思)

新媒体编辑:杜岷赵蕾初审:程秀娟审核:汤小俊审签:周星...

高铁扒门事件升级版!婚宴上‘冲喜’老人团:我们抢的是社会资源

凌晨两点改方案时,突然收到婚庆团队发来的视频——胶东某酒店宴会厅,三个穿大红棉袄的中年妇女跟敢死队似的往前冲,眼瞅着就要扑到新娘的高额钻石项链上。要不是门口小伙及时阻拦,这婚礼造型团队熬了三个月的方案...

微服务架构实战:商家管理后台与sso设计,SSO客户端设计

SSO客户端设计下面通过模块merchant-security对SSO客户端安全认证部分的实现进行封装,以便各个接入SSO的客户端应用进行引用。安全认证的项目管理配置SSO客户端安全认证的项目管理使...

还在为 Spring Boot 配置类加载机制困惑?一文为你彻底解惑

在当今微服务架构盛行、项目复杂度不断攀升的开发环境下,SpringBoot作为Java后端开发的主流框架,无疑是我们手中的得力武器。然而,当我们在享受其自动配置带来的便捷时,是否曾被配置类加载...

Seata源码—6.Seata AT模式的数据源代理二

大纲1.Seata的Resource资源接口源码2.Seata数据源连接池代理的实现源码3.Client向Server发起注册RM的源码4.Client向Server注册RM时的交互源码5.数据源连接...

30分钟了解K8S(30分钟了解微积分)

微服务演进方向o面向分布式设计(Distribution):容器、微服务、API驱动的开发;o面向配置设计(Configuration):一个镜像,多个环境配置;o面向韧性设计(Resista...

SpringBoot条件化配置(@Conditional)全面解析与实战指南

一、条件化配置基础概念1.1什么是条件化配置条件化配置是Spring框架提供的一种基于特定条件来决定是否注册Bean或加载配置的机制。在SpringBoot中,这一机制通过@Conditional...

一招解决所有依赖冲突(克服依赖)

背景介绍最近遇到了这样一个问题,我们有一个jar包common-tool,作为基础工具包,被各个项目在引用。突然某一天发现日志很多报错。一看是NoSuchMethodError,意思是Dis...

你读过Mybatis的源码?说说它用到了几种设计模式

学习设计模式时,很多人都有类似的困扰——明明概念背得滚瓜烂熟,一到写代码就完全想不起来怎么用。就像学了一堆游泳技巧,却从没下过水实践,很难真正掌握。其实理解一个知识点,就像看立体模型,单角度观察总...

golang对接阿里云私有Bucket上传图片、授权访问图片

1、为什么要设置私有bucket公共读写:互联网上任何用户都可以对该Bucket内的文件进行访问,并且向该Bucket写入数据。这有可能造成您数据的外泄以及费用激增,若被人恶意写入违法信息还可...

spring中的资源的加载(spring加载原理)

最近在网上看到有人问@ContextConfiguration("classpath:/bean.xml")中除了classpath这种还有其他的写法么,看他的意思是想从本地文件...

Android资源使用(android资源文件)

Android资源管理机制在Android的开发中,需要使用到各式各样的资源,这些资源往往是一些静态资源,比如位图,颜色,布局定义,用户界面使用到的字符串,动画等。这些资源统统放在项目的res/独立子...

如何深度理解mybatis?(如何深度理解康乐服务质量管理的5个维度)

深度自定义mybatis回顾mybatis的操作的核心步骤编写核心类SqlSessionFacotryBuild进行解析配置文件深度分析解析SqlSessionFacotryBuild干的核心工作编写...

@Autowired与@Resource原理知识点详解

springIOCAOP的不多做赘述了,说下IOC:SpringIOC解决的是对象管理和对象依赖的问题,IOC容器可以理解为一个对象工厂,我们都把该对象交给工厂,工厂管理这些对象的创建以及依赖关系...

java的redis连接工具篇(java redis client)

在Java里,有不少用于连接Redis的工具,下面为你介绍一些主流的工具及其特点:JedisJedis是Redis官方推荐的Java连接工具,它提供了全面的Redis命令支持,且...