1、工具下载
tesseract源码下载:https://github.com/tesseract-ocr/tesseract
tesseract安装包下载:https://digi.bib.uni-mannheim.de/tesseract/
tesseract语言包下载: https://github.com/tesseract-ocr/tessdata
jTessBoxEditor下载:https://sourceforge.net/projects/vietocr/files/jTessBoxEditor/
2、识别文字
下载tesseract中文语言包chi_sim.traineddata,并放入tesseract程序中的Tesseract-OCR\tessdata目录中
执行命令识别文字
tesseract penngo.normal.exp0.png result -l chi_sim
参数说明
penngo.normal.exp0.png 需要识别的文字图片
result 识别结果
-l chi_sim 指定识别语言,chi_sim为中文简体
如果识别不准确,就需要自己训练字体识别库
3、训练识别库
(1)使用jTessBoxEditor把penngo.normal.exp0.png转成tif,打开菜单Tools->Merge TIFF,同时文件名保存为penngo.normal.exp0.tif
tif文面命名格式[lang].[fontname].exp[num].tif
lang是语言,fontname是字体,num为自定义数字。
(2)生成box文件penngo.normal.exp0.box
tesseract penngo.normal.exp0.tif penngo.normal.exp0 -l chi_sim batch.nochop makebox
(3)jTessBoxEditor调整.box训练文件
“.box” 文件中保存每个字符在图片上的位置以及识别出的内容,训练之前,可以使用jTessBoxEditor调整字符位置和内容,纠正识别错误的内容。
打开jTessBoxEditor点击Box Editor -> Open ,打开步骤(2)中生成的 “penngo.normal.exp0.tif” ,程序会自动关联到 “penngo.normal.exp0.box” 文件。
(4)生成font_properties文件,
执行如下命令:echo normal 0 0 0 0 0 > font_properties
或者记事本新建font_properties,然后输入内容normal 0 0 0 0 0
注意normal与penngo.normal.exp0中的normal一致
(5)使用 tesseract 生成penngo.normal.exp0.tr文件
tesseract penngo.normal.exp0.tif penngo.normal.exp0 nobatch box.train
(6)生成字符集文件
unicharset_extractor penngo.normal.exp0.box
(7)生成字典数据
mftraining -F font_properties -U unicharset -O penngo.unicharset penngo.normal.exp0.tr
生成:penngo.unicharset、shapetable、inttemp、pffmtable四个文件
cntraining penngo.normal.exp0.tr
生成:normproto文件
修改4 个文件(inttemp、pffmtable、normproto、shapetable)的名称为 [lang].xxx。这里改为 penngo.inttemp、penngo.pffmtable、penngo.normproto、penngo.shapetable。
(8)合并数据文件
combine_tessdata penngo.
将生成的 “penngo.traineddata” 语言包文件拷贝到 tessdata 目录下,就可以用它来进行中文字符识别了。
4、测试训练结果
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.penngo.tesseract</groupId>
<artifactId>tesseract</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>tesseract</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>net.sourceforge.tess4j</groupId>
<artifactId>tess4j</artifactId>
<version>4.5.4</version>
</dependency>
</dependencies>
<repositories>
<repository>
<id>alimaven</id>
<name>Maven Aliyun Mirror</name>
<url>https://maven.aliyun.com/repository/central</url>
</repository>
</repositories>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
package com.penngo.tesseract;
import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;
import java.io.File;
public class TesseractExample {
public static void main(String[] args) {
File imageFile = new File("logs/tess1/penngo.normal.exp0.png");
ITesseract instance = new Tesseract();
instance.setDatapath("tessdata");
instance.setLanguage("penngo");
try {
String result = instance.doOCR(imageFile);
System.out.println(result);
} catch (TesseractException e) {
System.err.println(e.getMessage());
}
}
}