Android图文识别

一、简介

针对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 目录下,就可以用它来进行中文字符识别了。

你可能感兴趣的:(Android)