最近要做一个在手机屏幕上手写数字,然后识别其值,找了很久,最终还是确定要是使用Tesseract-OCR库来做,而Tesseract-OCR需要我们不断训练来使用我们的App.
用到的工具:
Tesseract-OCR:https://sourceforge.net/projects/tesseract-ocr-alt/files/tesseract-ocr-setup-3.02.02.exe/download
[jtessboxeditor] Ver 1.5版本https://sourceforge.net/projects/vietocr/files/jTessBoxEditor/jTessBoxEditor-1.5.zip
(我一开始用Ver1.7的,会有一些问题的,所以建议使用1.5 )
1,准备图片
1.png 2.png 3.png
2, 打开jtessboxeditor 点击 train.bat
4.png
点击Tools->Merge Tiff,并把生成的tif合并到目录下 并且命名为langyp.fontyp.exp0.tif
3, 然后用cmd 生成box文件 { 切换到D盘 cd /d d: } 5.png{这个是需要切换到文件目录下的}运行命令:
tesseract num.font.exp0.tif num.font.exp0 batch.nochop makebox
目录就便成为这样:
7.png
切换到jTessBoxEditor工具的Box Editor页,点击open,打开前面的tiff文件langyp.fontyp.exp0.tif,工具会自动加载对应的box文件。{如果没有左边没有加载数据出来,可以试试重启电脑}
博客.png点击左边的char列 修改我们要改的值。
修改完成,点击save按钮
在cmd里面输入 echo fontyp 0 0 0 0 0 >font_properties 生成font_properties文件[或者手动新建font_properties 文件 ,在里面输入font 0 0 0 0 0 ,最后不要后缀名了]
接着便是复制下面的代码到cmd ,生成字库文件
tesseract num.font.exp0.tif num.font.exp0 nobatch box.train
unicharset_extractor num.font.exp0.box
mftraining -F font_properties -U unicharset -O num.unicharset num.font.exp0.tr
cntraining num.font.exp0.tr
rename normproto num.normproto
rename inttemp num.inttemp
rename pffmtable num.pffmtable
rename shapetable num.shapetable
combine_tessdata num.
如无意外,本地下即可看到num.traineddata文件,就是我们使用自定义字体图片tif文件训练得到的字库文件了。
结果.png
/*识别手写的图片然后转化为图片识别
* */
private void RecognitPicture() {
//sd卡路径
final String SD_PATH= Environment.getExternalStorageDirectory().getPath()+ "/tesseract/";
final String SD_PATH2= Environment.getExternalStorageDirectory().getPath();
File dir = new File(SD_PATH + "tessdata");
if (!dir.exists()){
dir.mkdirs();
}
TessBaseAPI baseApi = new TessBaseAPI();
//记得要在你的sd卡的tessdata文件夹下放对应的字典文件,例如我这里就放的是eng.traineddata,这个需要在网上下载
baseApi.init(SD_PATH, "eng");
baseApi.setPageSegMode(TessBaseAPI.PSM_AUTO);
//记得要在对应的文件夹里放上要识别的图片文件,比如我这里就在sd卡根目录放了img.png
baseApi.setImage(new File(SD_PATH2+"/img.png"));
final String result= baseApi.getUTF8Text();
//这里,你可以把result的值赋值给你的TextView
Toast.makeText(this,"识别的结果:"+result,Toast.LENGTH_SHORT).show();
baseApi.end();
}
网友评论