一切福田,不離方寸,從心而覓,感無不通。

tess4j图片识别 和训练语言库提高图片识别率

1.pom文件添加依赖

 

<!-- 图形验证码识别https://mvnrepository.com/artifact/net.sourceforge.tess4j/tess4j -->
<dependency>
<groupId>net.sourceforge.tess4j</groupId>
<artifactId>tess4j</artifactId>
<version>4.5.4</version>
</dependency>

2.下载文件配置

链接:https://pan.baidu.com/s/1BsFJ7uTl-AEzcUEfuV9ESw
提取码:4wzp

解压后显示

 

3.进入dist文件,拷贝文件tess4j-3.4.8.jar到lib文件下

 

 

4.将lib文件和tessdata文件方到项目根目录

 

5.进入项目编码软件刷新项目目录

 

6.testdata可以放到项目文件目录下

 

7.被识别的图片存放位置

新建目录,放在项目路径下

 

 

8.编写识别代码

package com.app.ocr;

import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;
import java.io.File;
import java.io.IOException;

public class Main {
public static void main(String[] args) {
//  当前项目存放路径
String path = "E://heduijiang//APP-test//APP-test//src//test//resources";
// 要识别的图片
File file = new File("E://heduijiang//APP-test//APP-test//src//test//resources//tupian//9188.png");
ITesseract instance = new Tesseract();

/**
*  获取项目根路径,
*/
File directory = new File(path);
String courseFile = null;
try {
courseFile = directory.getCanonicalPath();
} catch (IOException e) {
e.printStackTrace();
}
//设置训练库的位置
instance.setDatapath(courseFile + "/tessdata");
//chi_sim :简体中文, eng    根据需求选择语言库
instance.setLanguage("eng");
String result = null;
try {
long startTime = System.currentTimeMillis();
result =  instance.doOCR(file);
long endTime = System.currentTimeMillis();
System.out.println("Time is:" + (endTime – startTime) + "ms");
} catch (TesseractException e) {
e.printStackTrace();
}
System.out.println("result: "+ result+"");
}
}

 

9.在图片文件下放入要识别的图片

 

10.代码路径指定图片的绝对路径输入图片名称,进行识别

 

 

训练语言库适合自己的项目,自己编辑训练一个

1.截图自己的项目的图片

 

2.下载软件 jTessBoxEditorFX-2.3.1  和 tesseract-ocr-w64-setup-v5.0.0

链接:https://pan.baidu.com/s/1PUlfRKC5Xt4SWeBjfGKVUA
提取码:ad1q

 

esseract-ocr-w64-setup-v5.0.0安装后配置环境变量,找到自己的安装的位置

https://digi.bib.uni-mannheim.de/tesseract/下载tesseract版本完成安装。配置好环境变量,打开命令行窗口执行tesseract -v 看到相关版本信息,则表示安装配置成功。

 

 

jTessBoxEditorFX-2.3.1 解压后显示

 

双击启动 train.bat

 

把图片文件夹放在此目录下,也可以在其它位置,这里我放到这个文件夹下

 

 

1、生成tif和box文件

可参照第一种方法生成。但这里介绍通过自定义图片使用jTessBoxEditor 合并tif

 

 

全选图片

 

输入名字num.font.exp0.tif

 

 

生成了文件

 

2、生成box文件

在生成图片文件夹下,打开cmd命令框

 

打开命令行执行命令tesseract num.font.exp0.tif num.font.exp0 batch.nochop makebox生成box文件,执行命令后输出如下:

D:\wspace\tess4j-demo2\test-data\num>tesseract num.font.exp0.tif num.font.exp0 batch.nochop makebox
Tesseract Open Source OCR Engine v4.0.0.20181030 with Leptonica
Page 1
Page 2
Page 3
Page 4

 

生成文件 box

3、字符配置文件font_properties

在文件夹文件夹内,新建一个文本文件,名为font_properties,删掉.txt,用记事本打开,写入内容为:

font 0 0 0 0 0

 

 

 

 

 

准备环节

  • 将5个tif文件,num.font.exp0.tif,生成的num.font.exp0.box文件,还有font_properties文件放在同一个目录下,如上面已经在一个目录下了

字符矫正

  • 打开 jTessBoxEditor>【BOX Editor】> 【Open】,打开num.font.exp0.tif;矫正【Char】上的字符
  • 操作截图:

 

 

开始进行编写识别

insert 添加

delete 删除

merge 合并

split 分离 几乎不用此按钮

 

 

只选择x值调

 

 

依次循环,第一张完成后,切换第二张 最后点击保存

 

所有图片编辑完后,点击 Save 保存即可

8.执行批处理文件

  • 【注意】:执行该批处理文件前,先要目录下创建font_properties文件 ,也就是滴 5 步
  • 在目标目录下,新建一个txt文件,复制代码,重命名为 do.bat,直接更改后缀名就可以
  • 代码如下

 

打开复制代码-保存

 

 

echo Run Tesseract for Training..
tesseract.exe num.font.exp0.tif num.font.exp0 nobatch box.train

echo Compute the Character Set..
unicharset_extractor.exe num.font.exp0.box
mftraining -F font_properties -U unicharset -O num.unicharset num.font.exp0.tr

echo Clustering..
cntraining.exe num.font.exp0.tr

echo Rename Files..
rename normproto num.normproto
rename inttemp num.inttemp
rename pffmtable num.pffmtable
rename shapetable num.shapetable

echo Create Tessdata..
combine_tessdata.exe num.

echo. & pause

修改为 .bat文件

 

 

 

双击do.bat文件前

 

双击do.bat文件后

9.拷贝 num.trainddata 文件

  • 最后将 num.trainddata 复制到 Tesseract-OCR 安装目录下的 tessdata 文件夹
  • 【注意】:这里是【Tesseract-OCR 安装目录下的 tessdata 文件夹】

 

在图片文件下 输入cmd

再次输入命令 tesseract num1.jpg num01 -l num

num1.jpg 换成自己的图片

 

 

遇到问题 mftraining.exe 停止运行

解决方法 替换此文件就可以

 

用上面安装的软件,找到此路径下这个文件直接替换就可

找到本地文件位置

 

下载可以启动的文件

链接:https://pan.baidu.com/s/1NklBXlIi3W4D30O20lvXdw
提取码:d2pb

地址只把替换的文件拿出来了

 

然后在执行 do.bat 就不报错了

 

 

其他

基于图片识别的识别率不高,所以我们一般先做图片的处理再进行识别。这个时候我们可以用到Tess4J专门提供的ImageHelper。里面分别有如下方法:

getScaledInstance 放大图片
getSubImage 截取图片
convertImageToBinary 转二进制
convertImageToGrayscale 将图像转换为灰度
invertImageColor 反转图像颜色
rotateImage 旋转影像

 

//图片转图片流
BufferedImage img = ImageIO.read(file);
// 这里对图片黑白处理,增强识别率.这里先通过截图,截取图片中需要识别的部分
img = ImageHelper.convertImageToGrayscale(img);
// 图片锐化,自己使用中影响识别率的主要因素是针式打印机字迹不连贯,所以锐化反而降低识别率
// img = ImageHelper.convertImageToBinary(img);
// 图片放大5倍,增强识别率(很多图片本身无法识别,放大7倍时就可以轻易识,但是考滤到客户电脑配置低,针式打印机打印不连贯的问题,这里就放大7倍)
img = ImageHelper.getScaledInstance(img, img.getWidth() * 7, img.getHeight() * 7);
package com.app.ocr;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;
import net.sourceforge.tess4j.util.ImageHelper;

public class Tess4jmain {
public static void main(String[] args) throws IOException {
// 识别图片的文件(修改为自己的图片路径)
String imagePath = ClassLoader.getSystemResource("tupian/9188.png").getPath();
if (imagePath.length()>0){
imagePath = imagePath.substring(1);
}
System.out.println("imagePath:"+imagePath);
File file = new File(imagePath);

//图片转图片流
BufferedImage img = ImageIO.read(file);
// 这里对图片黑白处理,增强识别率.这里先通过截图,截取图片中需要识别的部分
img = ImageHelper.convertImageToGrayscale(img);
// 图片锐化,自己使用中影响识别率的主要因素是针式打印机字迹不连贯,所以锐化反而降低识别率
img = ImageHelper.convertImageToBinary(img);
// 图片放大5倍,增强识别率(很多图片本身无法识别,放大7倍时就可以轻易识,但是考滤到客户电脑配置低,针式打印机打印不连贯的问题,这里就放大7倍)
img = ImageHelper.getScaledInstance(img, img.getWidth() * 7, img.getHeight() * 7);

// 创建ITesseract对象
ITesseract instance = new Tesseract();
//设置训练库的位置
String path = ClassLoader.getSystemResource("tessdata").getPath();
if (path.length()>0){
path = path.substring(1);
}
//打印一下路径,看有没有问题
System.out.println("tessdata:"+path);
instance.setDatapath(path);
//chi_sim :简体中文, eng    根据需求选择语言库
instance.setLanguage("eng");
String result = null;
try {
long startTime = System.currentTimeMillis();
result =  instance.doOCR(file);
long endTime = System.currentTimeMillis();
System.out.println("Time is:" + (endTime – startTime) + " 毫秒");
} catch (TesseractException e) {
e.printStackTrace();
}

System.out.println("result: "+result);
}
}

 

 

from:https://www.cnblogs.com/tiansc1/p/15773740.html