啥都不懂也能识别验证码

C# .NET6 TesseractOCR 图片文字识别 在你的项目中的tessdata-main文件夹找到这几个文件,并右键->属性设置为【如果较新则复制】有几个需要用到的模型,需要生成的时候复制到输出目录中,在项目中设置即可。TesseractOCR兼容 x86 与 x64。附 :ImageUtils.RegionCropping()源码。Visual Studio 2022 社区版。下载完成后解压在你的项目中,如图所示。从官方项目中获取模型数据, 网址为。 阅读详情

来自:http://blog.youkuaiyun.com/cownew/article/details/8850353

相信大家在开发一些程序会有识别图片上文字(即所谓的OCR)的需求,比如识别车牌、识别图片格式的商品价格、识别图片格式的邮箱地址等等,当然需求最多的还是识别验证码。如果要完成这些OCR的工作,需要你掌握图像处理、图像识别的知识,需要用到图形形态学、傅里叶变换、矩阵变换、贝叶斯决策等很多复杂的理论,这让绝大部分人都会望而却步。

    Tesseract这个开源项目的出现让我们普通人也可以涉足OCR的开发。Tesseract可以从图片中识别出文字内容,但不要以为Tesseract可以智能的识别出各种奇形怪状、复杂的图片文字,Tesseract默认只能识别非常标准字体、清晰无干扰的图片文字,刚接触Tesseract的人很多都会发出这样的评价“Tesseract吹的挺厉害,但是识别率很低呀,不好用”。其实我们要识别的内容千奇百怪,Tesseract是需要去训练才能比较高准确率的识别的,我们需要把一批样本图片让Tesseract去尝试识别,然后对他识别出的错误结果进行校正,告诉他“这个图片你识别错了,应该识别为某某某”,这样Tesseract慢慢的就“学会了”怎么样进行识别。也就是如下一个训练过程:

    看到上图有一个“预处理”,这是什么意思呢?我们知道,很多验证码都是加了一些干扰处理的,比如说有的验证码加了噪音点、有的验证码加了干扰线、有的验证码加了干扰背景、有的验证码做了文字扭曲。如下图:

 

    这些图片如果直接交给Tesseract去处理,识别的难度会非常大。开发人员应该在把图片交给Tesseract之前对图片进行比较的预处理操作,比如去掉干扰线、去掉背景噪点、字符矫正等等,有些复杂的预处理操作可能会涉及到图形形态学中比较深入的理论,这不是一篇文章能够介绍的,下面只列出比较简单的图片预处理的基本知识,深入学习请参考图形学相关资料。

1、.Net中图片对象类是Image类,使用Image.FromFile(file)来加载一张图片,一般的图片都是位图,Bitmap类是Image类的子类,所以我们一般把Image. FromFile()返回值转换为Bitmap类型使用Bitmap bitmap = (Bitmap)Image.FromFile(file)

2、Bitmap. Save()用来把内存中的图片对象保存到输出中去。第二个参数为图片格式。

3、由于Bitmap关联到GDI的非托管资源,实现了IDisposable接口,所以需要使用using进行对象的资源管理,以避免程序内存泄露的问题。关于using、IDisposable这些C#/.Net基础知识这里不再介绍,不清楚的请参考传智播客.Net培训学院公布的免费.Net视频教程,下载地址如下:http://net.itcast.cn/

4、如果要进行高效的图片操作,需要配合指针对Bitmap进行操作,当然为了避免对C#指针操作不熟悉的读者,这篇文章中我将会使用效率略低但是比较易懂的GetPixel、 SetPixel方法来进行图片操作。GetPixel、 SetPixel是Bitmap提供的两个方法,分别可以用来对图片进行指定坐标像素点颜色的读取和设置指定坐标像素点的颜色。

 

    接下来开始讲解Tesseract的使用:

一、     首先我们要采集多张有代表性的验证码样本图片,因为比较复杂的验证码的训练过程会比较长,而这次传智播客.Net学院举办的验证码识别免费公开课时间有限,因此我挑选了相对比较简单的验证码进行识别。复杂验证码的识别过程也是大同小异的。我测试用的100张验证码图片在文章最后的“公开课软件、图片库和代码.zip”压缩包中。

 

二、     这些图片有一些明显的噪音背景和干扰线,但是噪音背景和干扰线的颜色就是那几个,因此我使用拾色器拾取了这些点的颜色,使用如下的代码把那些颜色替换为白色,并且保存为tif格式的图片:

?
     string [] files = Directory.GetFiles( @"D:\KuaiPan\传智资料\班级资料\公开课\2013年4月份验证码识别\haijia" , "*.gif" );
 
     for  ( int  i = 0; i < files.Length; i++)
 
     {
         string  file = files[i];
         using (Bitmap bitmap = (Bitmap)Image.FromFile(file))
         using  (Bitmap newBitmap = Process(bitmap))
         {
             newBitmap.Save( @"F:\aa\" +i+".tif",ImageFormat.Tiff);
         }
     }
 
 
private  static  Bitmap Process(Bitmap bitmap)
{
     Bitmap newBitmap =  new  Bitmap(bitmap.Width, bitmap.Height);
     for  ( int  x = 0; x < bitmap.Width; x++)
     {
         for  ( int  y = 0; y < bitmap.Height; y++)
         {
             //去掉边框
             if  (x == 0 || y == 0 || x == bitmap.Width - 1 || y == bitmap.Height - 1)
             {
                 newBitmap.SetPixel(x, y, Color.White);
             }
             else
             {
                 Color color = bitmap.GetPixel(x, y);
                 //如果点的颜色是背景干扰色,则变为白色
                 if  (color.Equals(Color.FromArgb(204, 204, 51)) ||
                     color.Equals(Color.FromArgb(153, 204, 51)) ||
                     color.Equals(Color.FromArgb(204, 255, 102)) ||
                     color.Equals(Color.FromArgb(204, 204, 204)) ||
                     color.Equals(Color.FromArgb(204, 255, 51)))
                 {
                     newBitmap.SetPixel(x, y, Color.White);
                 }
                 else
                 {
                     newBitmap.SetPixel(x, y, color);
                 }
             }
         }
     }
     return  newBitmap;
}

 F:\aa\文件夹下就会有100张图片转换后的图片,转换后效果如下:

 

         可以看到背景颜色和干扰线全部被去掉了。

三、 接下来运行jTessBoxEditor(jTessBoxEditor是使用java编写的,因此先需要安装配置java运行环境,对java运行环境安装配置不熟悉的朋友请自行寻找资料),双击jTessBoxEditor.jar即可启动运行。将第二步处理后的tiff使用主菜单 “Tool→Merge Tiff”图片合并为一张图片,比如保存到F:\aa\下haijia.tif文件中。

四、     下载安装tesseract-ocr-setup-3.01-1.exe(我使用3.02有问题,不知道是我的问题还是我不会用,总之还是推荐大家这里先使用3.01版本),这个setup版本会自动把安装目录添加到Path环境变量中,推荐使用。如果下载portable版本则需要自己编辑环境把tesseract解压路径添加到Path环境变量中。

五、     在下一步操作之前需要先给训练结果取一个名字,比如我这里就取haijia这个名字。如果你取了别的名字,只要把后面所有操作中的“haijia”改成你取的名字即可。

六、     启动windows命令行窗口,并且进入haijia.tif文件所在的目录,然后执行tesseract.exe haijia.tif haijia batch.nochop makebox。其中haijia.tif就是第三步生成的合并tiff文件的文件名,haijia则是咱们取的训练名。这样就会生成初始识别结果的haijia.box文件

七、     保证haijia.box文件和haijia.tif文件文件名完全一样并且放在同一个文件夹下。使用jTessBoxEditor打开haijia.tif文件,逐个校正文字,后保存。注意在jTessBoxEditor中每次修改完了字符都要回车,注意及时保存。如果发现多识别了、两个字母被识别为一个字母、一个字母被识别为两个字母等错误,需要使用Merge、split、delete之类的功能进行微调,还要通过修改X、Y、W、H修改自动识别的区域 。

八、     所有的自动识别结果矫正完毕后命令行执行tesseract.exe haijia.tif haijia nobatch box.train

九、     命令行执行unicharset_extractor.exe haijia.box

十、     在目录下新建一个名字为“font_properties”的文件,并且输入文本(其中haijia就是训练的名字,保存的时候使用EditPlus等高级文本编辑器去掉BOM头或者保存为ANSI格式): haijia   1 0 0 1 0

十一、  命令行执行cntraining.exe haijia.tr

十二、  命令行执行 mftraining.exe -F font_properties -U unicharset haijia.tr

十三、  第12步完成后,目录下应该生成若干个文件了,把unicharset, inttemp, normproto, pfftable这四个文件加上训练名字前缀“haijia.”。

十四、  命令行执行“combine_tessdata haijia.” 来合并生成的haijia.traineddata训练文件。执行完这步后,文件夹下就应该生成一个haijia.traineddata文件了,这个文件就是识别用的训练数据文件,只需要这一个haijia.traineddata文件即可,之前用的tif图片文件以及其他的中间文件都不需要了。

十五、  接下来调用Tesseract的API就可以在程序中进行验证码识别了。Tesseract支持很多语言,C/C++、Java、.Net、PHP、Python都有相应的API封装,只要寻找你使用语言的API库即可。下面还是以.Net为例。

a)   使用tesseractdotnet_v301_r590.zip中的tesseract.dll添加到相应的引用。注意tesseractdotnet默认只支持.Net 2.0,所以需要把项目的Target修改为.Net 2.0,如果你需要在2.0以上的版本中使用,则需要自己下载tesseractdotnet的源代码进行编译。

b)   采用第二步同样的方法对待识别的图片进行预处理,然后执行下面的代码对预处理过后的图片对象进行识别:

?
using  (Bitmap bitmap = (Bitmap)Image.FromFile(file))
using  (Bitmap newBitmap = Process(bitmap)) //图片预处理
{
     TesseractProcessor processor =  new  TesseractProcessor();
     processor.SetPageSegMode(ePageSegMode.PSM_SINGLE_LINE);
                   //F:\aa\是haijia.traineddata文件所在的文件夹。注意路径必须以\结尾,并且路径要用\分割,而不是/分割,否则会报错AccessViolation异常
     processor.Init( @"F:\aa \" ,
                         "haijia" , ( int )eOcrEngineMode.OEM_DEFAULT);
     string  result = processor.Recognize(newBitmap); //返回值就是识别结果
     MessageBox.Show(result);
}

  

 

         酷!帅!

 

  文字的表现能力毕竟有限,因此我把这次传智播客公开课我讲的课堂录像免费发布出来,大家对照视频教程来进行学习的话会更方便,视频教程中也讲了一些我这篇文章中没有讲的东西,视频教程下载地址:http://dl.vmall.com/c0kvta13ex

 

附录:公开课软件、图片库和代码.zip 下载地址:http://dl.vmall.com/c0w9bx8ym7


gif验证码识别,gif动态验证码识别 验证码识别,GIF验证码识别 阅读详情

相关推荐

使用 Tesseract 在 C# 中进行光学字符识别(OCR)

你可以根据需要对 Tesseract 进行自定义配置,例如设置识别的分辨率、识别模式等。// 只识别数字// 设置自定义变量本文只讲述了简单的使用方法,未涉及字库训练,识别的准确率与训练的字库有关。

仰望星空的博客 4733

tesseract:一个.Net版本的开源OCR项目

tesseract是针对Tesseract-OCR(C++)引擎封装的.NET版本,支持超过100种语言的文本识别,使得.NET开发者能够轻松地利用Tesseract的强大功能,无需深入了解OCR的底层技术。此项目缺点是,只能识别印刷的文本,针对手写的需要自己训练语言包。

成长的足迹 1472

【点选验证码识别】某招标网站反爬虫分析与验证码自动识别

爬虫文字点选验证码自动识别实与反爬虫防护分析实战

吴秋霖的博客 4320

ocr识别(未测试)--啥都不懂也能识别验证码

相信大家在开发一些程序会有识别图片上文字(即所谓的OCR)的需求,比如识别车牌、识别图片格式的商品价格、识别图片格式的邮箱地址等等,当然需求最多的还是识别验证码。如果要完成这些OCR的工作,需要你掌握图像处理、图像识别的知识,需要用到图形形态学、傅里叶变换、矩阵变换、贝叶斯决策等很多复杂的理论,这让绝大部分人都会望而却步。     Tesseract这个开源项目的出现让我们普通人也可以涉足O

数学屌丝走在it的道路上 1963

【验证码的识别】—— 图形验证码的识别

目前,许多网站采取各种各样的措施来反爬虫,其中一个措施便是使用验证码。随着技术的发展,验证码的花样越来越多。验证码最初是几个数字组合的简单的图形验证码,后来加入了英文字母和混淆曲线。有的网站还可能看到中文字符的验证码,这使得识别愈发困难。后来 12306 验证码的出现使得行为验证码开始发展起来,用过 12306 的用户肯定多少为它的验证码头疼过。我们需要识别文字,点击与文字描述相符的图片,验证码完全正确,验证才能通过。

爱吃饼干的小白鼠的博客 3050

Tesseract-OCR识别(.NET)

Tesseract-OCR识别,使用C#的winform开发,可以运行。里面有上传图片和DLL。 1、.NET Framework 4.5 2、C# Winform

福音:不懂代码也能用TensorFlow做验证码识别了

项目地址:https://github.com/kerlomz/captcha_trainer,欢迎各位大佬们指点 长话短说,开门见山,网络上现有的代码以教学研究为主,对于验证码识别有刚需的朋友们,无需阅读代码,几个参数任何人都能使用机器学习技术训练一个模型,如本文有不严谨之处还请告知与谅解,此文旨在献给不求甚解,拿来主义者。 笔者选用的时下最为流行的C...

weixin_33835690的博客 237

windows下tesseract-ocr安装包

windows下tesseract-ocr安装包

网络爬虫笔记—图形验证码识别

图片验证码识别和图片文字识别(OCR)

虹之间的博客 2685

SAP采购含税价转换的底层逻辑解析:ABAP例程如何实现价税分离计算

本文深入解析SAP系统中采购含税价与不含税价的转换机制,重点介绍VOFM例程和ABAP代码实现价税分离计算的方法。通过详细讲解数学原理、税率体系及SAP定价引擎架构,为开发人员提供完整的解决方案,帮助提升采购业务中的价格处理效率和准确性。

weixin_29237635的博客 450

【生成数据集EXCEL文件】使用生成对抗网络GAN生成数据集:输出生成数据集EXCEL

生成器的任务是接收随机噪声向量作为输入,并尽可能生成与真实数据相似的样本,而判别器则是一个二分类器,旨在区分输入的样本是来自生成器生成的,还是来自真实数据。在训练过程中,生成器和判别器通过对抗学习的方式相互博弈,生成器的目标是生成足以欺骗判别器的样本,而判别器的目标则是尽可能准确地判断样本的真实性。GAN网络在多个领域展现了强大的能力,能够生成与训练数据分布相似的新数据,包括但不限于图像生成、图像风格转换、超分辨率、数据增强、视频生成、自然语言处理、医学图像处理以及游戏与虚拟现实等。

hustef的博客 1521

验证码识别

验证码识别是3年前的一个小愿望了(当时是做一个自动回帖器,抽奖iphone),但自己这两年主要在做分布式架构,今年终于抽出了空,又战胜了对数学的恐惧,在coursera上学习了吴恩达的机器学习和深度学习,验证码识别也算是对部分课程的实践,下面就来整理一下这次识别的过程。 验证码识别主流程 识别细节 1 目标检测检测出验证码图片中的字符边距 11 labelImg使用 12 darknet使用

zxx的专栏 1万+

WSL2网络配置全攻略:如何让Windows和Linux子系统互相访问端口(附防火墙设置)

本文深入解析WSL2的网络架构,并提供详细的端口互通配置指南。针对WSL2与Windows宿主机之间常见的网络访问问题,文章从原理出发,逐步讲解如何识别网络环境、配置Windows防火墙规则、调整服务监听地址,并介绍镜像网络模式等进阶优化方案,最终实现稳定可靠的双向端口访问。

sony5的博客 1148

验证码识别OCR技术

在开发爬虫时,会遇到验证码识别,在网站中加入验证码的目的是加强用户安全性和提高反爬虫机制。 验证码类型:字符验证码,图片验证码,gif动图验证码,极验验证码(拖动滑块完成拼图),手机验证码,视频验证码等。 识别验证码的三种方案: 1,人工识别,但这过分依赖人为控制,难以实现批量爬取 2,python调用OCR引擎识别验证码。但正常情况下,OCR准确率低,需要机器学习不断提高OCR准确率,开发成本相...

weixin_43670105的博客 3874

手把手教你用周立功USBCANFD-200U和ZCANPRO软件,从驱动安装到UDS诊断一条龙搞定

本文详细介绍了如何使用周立功USBCANFD-200U硬件和ZCANPRO软件,从驱动安装到UDS诊断的全流程操作指南。涵盖硬件连接、软件配置、CAN通信测试及UDS诊断实战,帮助汽车电子爱好者和工程师快速掌握CAN总线通信技术,实现专业的车辆诊断功能。

weixin_30752699的博客 579

Win10+pycharm+conda 配置Siammask 过程记录(新手向)

我们跑动demo 需要配置两个相关的文件这两个文件需要用 git 进行下载,对于不熟悉git的小伙伴 我这里给出连接,大家可以直接下载即可,并将其配置在 experiments文件夹下然后大家再需要在设置参数参数这里给出了。

C1137577723的博客 551

通用验证码识别 无限识别

背景 最近在研究验证码图片识别,主要是字母+数字类型的验证码图片,找到了很多方法,但是大多都需要自己去通过深度学习自己训练,而且深度学习代码又看不懂。运气好,找到一个完整的深度学习代码能够去自己训练验证码图片识别,不需要看懂代码,直接拿来用,但是当遇到要识别验证码时,又需要时间去训练,训练出来识别率又不高。机缘巧合下,google到了一个验证码识别神器,而且是无限次数识别的。网址是:www.51learn.vip 这个网站支持的验证码类型也挺多的。 另外,百度到【无限打码】这个平台 证明这个网站做得还行

qq_33657664的博客 9369

面向非平行语料的语音转换技术综述

摘要语音转换是语音及人工智能领域的一项研究课题,其目标是在保持源语音内容不变的情况下改变语音的音色,使其听上去像是由另一个目标说话人说出的,同时还需保证语音的质量和自然度。面向非平行语料的语音转换技术是当下的热门研究内容,其使用非平行的多说话人语音数据集进行模型训练,能完成多对多以及任意对任意的语音转换。对近年来面向非平行语料的语音转换进行了全面的总结和分析。首先概述了早期面向平行语料的语音转换及其缺陷,然后对当下面向非平行语料的语音转换的各类实现方法进行介绍和对比分析,最后对语音转换技术进行了总结和展望。

qq_61890005的博客 829

图片识别之验证码识别

许多网站在进行某些操作前会要求输入验证码以此来抵御爬虫和攻击。此篇主要讲述如何通过代码来识别一些常见的验证码。以此探究图片识别的过程以及如何避免生成容易被识别的验证码。 理论 图片识别的过程 取样本 清洗区分样本 提取样本特征 提取目标的特征与样本进行对比 操作过程 Java有丰富的图片处理类,本次操作使用java语言。 一、取目标网站的验证码样本。在web页面中查看验证码请求...

RJ0024的博客 6592

Android 12.0 系统开机设置默认横屏显示

在12.0的系统产品开发中,对于产品需求来说,由于是宽屏设备所以产品需要开机默认横屏显示,开机横屏显示这就需要从两部分来实现,一部分是开机动画横屏显示,另一部分是系统显示横屏显示,从这两方面就可以做到开机默认横屏显示了。

安卓兼职framework和app工程师的博客 3743

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Python验证码识别

主要写的就是识图验证码,识别的是简单的验证码,要想让识别率更高,识别的更加准确就需要花很多的精力去训练自己的字体库。

m0_72557783的博客 3552

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

上一篇: 讲师秀之7:林仕鼎谈架构设计与架构师
下一篇: Highcharts using svg image to create pdf
ArvinStudy
博客等级 码龄15年 83粉丝 193原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值