针对Android,使用的是Tesseract的封装开源项目tesstwo
tessdata:字体识别库(chi_sim.traineddata 中文简体,chi_tra.traineddata 中文繁体,eng.traineddata 英文库)
1、首先在gradle中引入tess-two:implementation ‘com.rmtheis:tess-two:9.0.0’
2、在手机的根目录创建一个tesseract文件夹,里面再创建一个tessdata文件夹,tessdata文件夹就是存放 tessdata字体识别库中下载的字体文件,字体文件必须要有,并且tessdata文件夹的名称不能变,必须是tessdata。
3、创建Activity
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//点击按钮开始识别
ocrBtn = (Button) findViewById(R.id.test_orc_app_btn);
//将结果显示在TextView中
showTv = (TextView) findViewById(R.id.test_orc_app_show_tv);
ocrBtn.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.test_orc_app_btn:
orcText();
break;
}
}
private void orcText() {
//初始化TessBaseAPI对象
mTess = new TessBaseAPI();
//语言:(chi_sim简体中文/eng英文等等,具体的语言可以去tessdata字体识字库中下载)
String language = "chi_sim";
//
File dir = new File(ROOT_PATH_LANGUAGE + "tessdata/");
if (!dir.exists()){
Log.e("tag","文件不存在");
}
//第一个参数存放语言的文件夹路径,第二个参数为语言
mTess.init(ROOT_PATH_LANGUAGE, language);
mTess.setDebug(true);
//图片路径
String path = ROOT_PATH_PHOTO + 1 + ".png";
File mFile=new File(path);
//若该文件存在
if (mFile.exists()) {
Bitmap bitmap=BitmapFactory.decodeFile(path);
mTess.setImage(bitmap);
}
mTess.clear();
mTess.end();
//将识别的结果显示在TextView
showTv.setText(str);
}
由于识别的过程需要一定时间,建议将识别的方法放到线程中去做。
由于tesseract的中文语言包“chi_sim”对中文手写字体的识别正确率不高,需要针对特定情况用自己的样本进行训练,提高识别率.
步鄹如下:
1、下载并安装tesseract
https://github.com/UB-Mannheim/tesseract/wiki
windows下可以直接下载exe文件,进行安装。安装比较简单
安装完成之后需要添加2个环境变量:
<1> 把安装路径“C:\Program Files (x86)\Tesseract-OCR”添加到环境变量里,方便在命令行里直接调用;
<2> 把语言包所在路径“C:\Program Files (x86)\Tesseract-OCR\tessdata”添加到环境变量里, 变量名称为“TESSDATA_PREFIX”,不添加语言包路径的话调用tesseract识别会报错误
2、jTessBoxEditor下载安装
jTessBoxEditor下载地址: https://sourceforge.net/projects/vietocr/files/jTessBoxEditor/
各个版本有两个,其中带FX的版本,才支持中文字符编辑。
安装包解压出来之后双击里边的“jTessBoxEditor.jar” 即可运行。
3、样本图片准备
理论上训练样本数量越多越好
4、使用 jTessBoxEditor 生成 训练样本的 “合并”(Merge)图片
打开 jTessBoxEditor ,选择 Tools -> Merge TIFF,打开对话框,选择训练样本所在文件夹,并选中所有要参与训练的样本图片。
点击 “打开” 之后弹出保存对话框,还是选择在当前路径下保存,文件命名为 “chi_my.font.exp0.tif” ,格式只有一种 “TIFF” 可选。
tif文件命名格式[lang].[fontname].exp[num].tif:
lang是语言名称,自定义
fontname是字体名,自定义
num一般为0
5、生成box文件
在上一步骤中生成的 “chi_my.font.exp0.tif” 文件所在路径下打开命令行程序,输入命令:
tesseract chi_my.font.exp0.tif chi_my.font.exp0 -l chi_sim batch.nochop makebox
在当前路径下就会生成.box文件。box文件和对应的tif一定要在相同的目录下,不然后面打不开。
6、使用 jTessBoxEditor 调整 .box 训练文件
打开 jTessBoxEditor ,点击 Box Editor -> Open 打开生成的 “chi_my.font.exp0.tif” ,会自动关联到 “chi_my.font.exp0.box” 文件。并校正。可以调整字符的内容、位置、宽高等信息。调整所有样本后点击 File -> Save as保存即可。
7、 创建一个font_properties文件
在tif文件所在的目录下创建一个名称为font_properties文件,内容为:
font 0 0 0 0 0 表示默认普通字体
其中font必须和tif文件(chi_my.font.exp0.tif)名中的font一致。
8、编写一个脚本文件rem.bat,内容:
echo Run Tesseract for Training..
#执行后在当前文件夹下生成 chi_ym.font.exp0.tr训练文件。
tesseract.exe chi_my.font.exp0.tif chi_my.font.exp0 nobatch box.train
echo Compute the Character Set..
#执行之后在当前文件夹下生成 “unicharset” 文件
unicharset_extractor.exe chi_my.font.exp0.box
#执行后面的两句后会生成4 个文件(inttemp、pffmtable、normproto、shapetable)
mftraining -F font_properties -U unicharset -O chi_my.unicharset chi_my.font.exp0.tr
echo Clustering..
cntraining.exe chi_my.font.exp0.tr
#重命名生成的4个文件
echo Rename Files..
rename normproto chi_my.normproto
rename inttemp chi_my.inttemp
rename pffmtable chi_my.pffmtable
rename shapetable chi_my.shapetable
echo Create Tessdata..
#执行之后会生成chi_my.traineddata语言包,这句话最后有个点,不能少
combine_tessdata.exe chi_my.
将生成的 “chi_my.traineddata” 语言包文件拷贝到 tessdata 目录下,就可以用它来进行中文字符识别了。