首先下载tesseractOCR应用,下载地址:digi.bib.uni-mannheim.de/tesseract/
源码地址为:github.com/tesseract-o…;
安装中这里选择需要的语言包
安装完成后,将目录添加到系统变量path中
查看版本信息
查看已下载的语言包
训练样本需要一个工具,jTessBoxEditor,这个工具是用java开发的,需要jre7以上的版本支持。
下载jTessBoxEditor
1、获取训练的图片,为了方便我使用了原来的图片一张,样本当然是越多越好。
2、合并样本文件,打开jTessBoxEditor,点开train.bat。在菜单栏中Tools->Merge TIFF。在弹出的窗口中可以选择多张样本图片(网上之前有说要.tif格式的图片,测试.jpg .png格式的也行)。 之后会合成一张tif格式文件
生成box文件, 打开命令行,输入:
| 1 | tesseract.exe test.font.exp1.tif test.font.exp1 batch.nochop makebox |
|---|---|
| tip | 如果有多个文件,比如增量训练,就需要多行生成box |
| - | tesseract.exe test.font.exp2.tif test.font.exp2 batch.nochop makebox |
| - | tesseract.exe test.font.exp3.tif test.font.exp3 batch.nochop makebox |
生成的BOX文件为test.font.exp1.box,BOX文件为Tessercat识别出的文字和其坐标。Make BOX的命名的个数为:
| 1 | tesseract [lang].[fontname].exp[num].tif [lang].[fontname].exp[num] batch.nochop makebox |
|---|
其中lang为语言名称,fontname为字体名称,num为序号,可以随便定义。有些博客说对于这个命名无所谓,但是我尝试到后免出错了,是tr文件名的问题,在下面我会贴出报错图。读者也可以试试,不知是不是我之前步骤哪里做错了。
4、文字矫正,打开jTessBoxEditor工具,打开test.font.exp1.tif文件(必须将上一步生成的.box和.tif样本文件放在同一目录),如下图所示。可以看出有些字符分割和识别都不正确,可以通过该工具手动对每张图片中识别错误的字符进行校正。校正完成后保存即可。(注:发现中文打不上去,在菜单Setting->Font中可以修改,改为宋体即可
5、生成.tr文件,在命令行中输入:
| 1 | tesseract test.font.exp1.tif test.font.exp1 nobatch box.train |
|---|---|
| tip | 如果有多个文件,比如增量训练,就需要多行生成tr |
| - | tesseract test.font.exp2.tif test.font.exp2 nobatch box.train |
| - | tesseract test.font.exp3.tif test.font.exp3 nobatch box.train |
6、计算字符集,从生成的box文件中提取,继续输入:
| 1 | unicharset_extractor test.font.exp1.box |
|---|---|
| tip | 如果有多个文件,比如增量训练,就需要以空格分割多个box |
| - | unicharset_extractor test.font.exp1.box test.font.exp2.box |
7、生成字体特征文件,在当前文件夹中新建任意名称的文件,里面格式为:
| 1 | <span><fontname> <italic> <bold> <fixed> <serif> <fraktur> </span> |
|---|
例如:我建了一个名为font的文件,里面内容为:font 0 0 0 0 0
这个文件可以是手动生成的txt文件,也可以在在命令行中输入:
| 1 | echo font ``0 0 0 0 0 >font |
|---|
即可。
8、特征训练,继续在命令行输入:
| 1 | mftraining -F font -U unicharset test.font.exp1.tr |
|---|---|
| tip | 如果有多个文件,比如增量训练,就需要以空格分割多个tr |
| - | mftraining -F font -U unicharset test.font.exp1.tr test.font.exp2.tr |
9、聚类:Clustering 聚集tesseract识别的训练文件,命令行输入:
| 1 | cntraining test.font.exp1.tr |
|---|---|
| tip | 如果有多个文件,比如增量训练,就需要以空格分割多个tr |
| - | cntraining test.font.exp1.tr test.font.exp2.tr |
有人会说其他还有一条shapeclustering语句,说下这个步骤可有可无,这个是在3.02中新加的,主要针对印度语,所以我们在做的时候会有一个警告 warning No shape table file present。
现在需要做的是把训练过程创建的五个文件:shapetable,normproto,inttemp,pffmtable,unicharset,用lang.为前缀重命名(例如test.),然后运行combine_tessdata.
如下图所示:
10、最后,合并相关文件,生成字典文件,输入:
| 1 | combine_tessdata font. |
|---|
最终,在当前目录中会产生一个为font.traineddata文件,将其拷到tessdata文件夹中,再测试一下。
| 1 | tesseract.exe .\7766.png result -l font |
|---|
接下来是EC代码内操作
直接上代码
let pa = {
"type": "tess",
"path": "D:/tesseract-ocr/tessdata",
"baseDir": "D:/tesseract-ocr",
"language": "font",
"ocrEngineMode": 0
}
- 参数设置为: {"type":"tess","path":"d:\tesseract-ocr\tessdata","baseDir":"d:\tesseract-ocr"}
- baseDir: 代表是tesseract安装路径,安装包下载: github.com/tesseract-o… 或者官方王下载jTessBoxEditor.zip包含了训练工具和tesseract的dll
- path: 代表是tesseract 的 tesssdata 文件夹
- language: 语言数据集文件, 例如 chi_sim.traineddata 代表是中文简体语言,参数就填写 chi_sim,多个可以用+链接,例如:chi_sim+eng+num
- ocrEngineMode: 识别引擎类型,0 OEM_TESSERACT_ONLY , 1 OEM_LSTM_ONLY,2 OEM_TESSERACT_LSTM_COMBINED,3 OEM_DEFAULT
- rilLevel: PageIteratorLevel 参数,-1 自适应, 0: RIL_BLOCK, 1: RIL_PARA, 2: RIL_TEXTLINE, 3: RIL_WORD, 4:RIL_SYMBOL
let tocr = ocr.newOcr()
let inited = tocr.initOcr(pa);
logd("初始化结果 -" + inited);
if (!inited) {
loge("error : " + tocr.getErrorMsg());
return;
}
console.time("1")
let _image = image.captureFullScreenEx({"type": "1", "quality": 100}); //截取全图
// _image = image.binaryzation(_image,1,100); //这里是图片二值化让去除图片杂点方便识别,可以不使用
if (!_image) {
loge("读取图片失败");
}
let _rect_image = image.clip(_image, 1032,346,1057,399); //裁剪图片只留下想要识别的区域
image.recycle(_image)
let _img = image.rotateImage(_rect_image, -90); //将图片逆时针旋转90度 游戏图片为竖屏的所以需要旋转
image.recycle(_rect_image)
logd("start---ocr");
// 对图片进行识别
let result = tocr.ocrImage(_img, 20 * 1000)
image.recycle(_img)
logd("识别结果:" + result)
if (result) {
logd("ocr结果-》 " + JSON.stringify(result));
for (var i = 0; i < result.length; i++) {
var value = result[i];
logd("文字 : " + value.label + " x: " + value.x + " y: " + value.y + " width: " + value.width + " height: " + value.height);
}
} else {
logw("未识别到结果");
}
logd("耗时: " + console.timeEnd(1) + " ms")
sleep(1000);
代码上方可以加一行在ec执行结束之后释放ocr资源
setStopCallback(() => {
//释放所有资源
tocr.releaseAll();
});