1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 使用tesseract-ocr实现验证码识别

使用tesseract-ocr实现验证码识别

时间:2020-02-10 03:04:20

相关推荐

使用tesseract-ocr实现验证码识别

tesseract-ocr介绍

光学字符识别,是指对图片文件中的文字进行分析识别,获取的过程

Tesseract - OCR 引擎最先由HP实验室于1985年开始研发,至1995年时已经成为OCR业内最准确的三款识别引擎之一。然而,HP不久便决定放弃OCR业务,Tesseract也从此尘封

数年以后,HP 意识到,与其将Tesseract束之高阁,不如贡献给开源软件业,让其重焕新生

在,Tesseract 由美国内华达州信息技术研究所获得,并求诸于 Google 对 Tesseract 进行改进、消除Bug、优化工作,Tesseract 由惠普公司宣布开源,从到现在,都由 Google 公司开发维护

java实现

1、maven引入

<dependency><groupId>net.java.dev.jna</groupId><artifactId>jna</artifactId><version>4.1.0</version></dependency><dependency><groupId>net.sourceforge.tess4j</groupId><artifactId>tess4j</artifactId><version>3.4.0</version><exclusions><exclusion><groupId>com.sun.jna</groupId><artifactId>jna</artifactId></exclusion></exclusions></dependency>

2、方法调用

public static void main(String[] args){//加载待读取图片File imageFile = new File("C:\\Users\\Desktop\\wenzi.png");//创建tess对象ITesseract instance = new Tesseract();//设置训练文件目录instance.setDatapath("D:\\autotest\\tessdata");//设置训练语言instance.setLanguage("eng");//执行转换try {//图片转图片流BufferedImage img = ImageIO.read(imageFile);// 这里对图片黑白处理,增强识别率.这里先通过截图,截取图片中需要识别的部分img = ImageHelper.convertImageToGrayscale(img);// 图片锐化,自己使用中影响识别率的主要因素是针式打印机字迹不连贯,所以锐化反而降低识别率// img = ImageHelper.convertImageToBinary(img);// 图片放大5倍,增强识别率(很多图片本身无法识别,放大7倍时就可以轻易识,但是考滤到客户电脑配置低,针式打印机打印不连贯的问题,这里就放大7倍)img = ImageHelper.getScaledInstance(img, img.getWidth() * 7, img.getHeight() * 7);String result = instance.doOCR(imageFile);System.out.println("获取结果:"+result);} catch (TesseractException | IOException e) {e.printStackTrace();}}

注意:代码中的“D:\autotest\tessdata”路径为语言训练文件的存储路径

语言训练文件传送门 提取码:a9pm

自定义语言训练文件

除使用上述语言训练文件外,还可以自定义训练文件

下载jTessBoxEditor创建语言训练文件,文件传送门 提取码:ol8a文件下载后设置环境变量将文件夹tesseract-ocr路径设置到环境变量中将需要识别的图片文件放至一个文件夹,图片越多识别率会比较高,工作量就会比较大

打开下载的 jTessBoxEditor

合并图片为tiff格式的图片,选择tools下的第一个菜单

选中需要识别的图片,命名按照规范命名

打开cmd进入到图片存放目录中,执行命令生成BOX文件

tesseract langyp.fontyp.exp0.tif langyp.fontyp.exp0 -l chi_sim batch.nochop makebox

调整字体坐标,调整识别错误的汉字。使用open打开刚才生成的tif文件,根据刚才生成的box文件调整字库。这个步骤才是真正核心的步骤,也是最麻烦的地方,有多个文件记得要翻页每个文件都手动调整

新建font_properties文件

tesseract langyp.fontyp.exp0.tif langyp.fontyp.exp0 -l chi_sim nobatch box.train

调整完成box文件后,就需要生成tr文件

tesseract langyp.fontyp.exp0.tif langyp.fontyp.exp0 -l chi_sim nobatch box.train

生成unicharset文件

unicharset_extractor langyp.fontyp.exp0.box

生成shape文件

shapeclustering -F font_properties -U unicharset -O langyp.unicharset langyp.fontyp.exp0.tr

生成聚集字符特征文件

mftraining -F font_properties -U unicharset -O langyp.unicharset langyp.fontyp.exp0.tr

生成字符正常化特征文件

cntraining langyp.fontyp.exp0.tr

重命名把目录下的unicharset、inttemp、pffmtable、shapetable、normproto这五个文件都加上fontyp.

rename normproto fontyp.normproto

rename inttemp fontyp.inttemp

rename pffmtable fontyp.pffmtable

rename unicharset fontyp.unicharset

rename shapetable fontyp.shapetable

组合文件,成功后会生成fontyp.traineddata训练文件

combine_tessdata fontyp.

将生成的训练文件放入最开始的tessdata文件夹中,instance.setLanguage(“fontyp”)使用

public static void main(String[] args){//加载待读取图片File imageFile = new File("C:\\Users\\Desktop\\wenzi.png");//创建tess对象ITesseract instance = new Tesseract();//设置训练文件目录instance.setDatapath("D:\\autotest\\tessdata");//设置训练语言instance.setLanguage("fontyp");//执行转换try {//图片转图片流BufferedImage img = ImageIO.read(imageFile);// 这里对图片黑白处理,增强识别率.这里先通过截图,截取图片中需要识别的部分img = ImageHelper.convertImageToGrayscale(img);// 图片锐化,自己使用中影响识别率的主要因素是针式打印机字迹不连贯,所以锐化反而降低识别率// img = ImageHelper.convertImageToBinary(img);// 图片放大5倍,增强识别率(很多图片本身无法识别,放大7倍时就可以轻易识,但是考滤到客户电脑配置低,针式打印机打印不连贯的问题,这里就放大7倍)img = ImageHelper.getScaledInstance(img, img.getWidth() * 7, img.getHeight() * 7);String result = instance.doOCR(imageFile);System.out.println("获取结果:"+result);} catch (TesseractException | IOException e) {e.printStackTrace();}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。