关于现阶段java调用OCR文字识别技术的总结

关于现阶段java调用OCR文字识别技术的总结

  • 1.Google开源OCR Tesseract
        • 下面说一下如何提高识别率
  • 2.Java调用百度OCR文字识别API
  • 3.上帝之眼sikulix—ocr
  • 4.ocr文字识别软件源码
  • 总结一下

经过这么多年的技术发展,ocr文字识别技术依然步入正轨,不过知识就是财富,要想精准的识别还是得购买大公司的成熟技术,已知的有阿里ocr、腾讯ocr、百度ocr、搜狗ocr、有道ocr等等,本次就说说有哪些开源的ocr

1.Google开源OCR Tesseract

Tesseract 是一个 开源的OCR引擎,由 Google 赞助。Tesseract 是目前公认最优秀、最精确的开源 OCR 系统,除了较高的精确度外,Tesseract 也具有很高的灵活性。它可以通过训练识别出任何字体,也可以识别出任何 Unicode 字符。
不过说实话,没有经过训练得Tesseract语言库识别率真的不怎么样,大概有30%的样子吧。
maven依赖

<dependency>
    <groupId>net.sourceforge.tess4j</groupId>
    <artifactId>tess4j</artifactId>
    <version>4.4.0</version>
</dependency>

下面说一下如何提高识别率

  1. Tesseract 更新到4.0以上版本
  2. 图像前处理
    做好图片的二值化
    合理的降噪
    图片resize
    图片旋转到合适的角度
    图片切割
    具体如何操作就不一一描述了
  3. 通过训练字库来提高识别率
    重点说一下Tesseract训练方法,虽然有点繁琐,但这个才是提高识别率的主要方向
    1.安装 jTessBoxEditor
    2.【train.bat】打开 jTessBoxEditor >【Tools】>【Merge TIFF】
    关于现阶段java调用OCR文字识别技术的总结_第1张图片
    关于现阶段java调用OCR文字识别技术的总结_第2张图片
    注意:tif文面命名格式[lang].[fontname].exp[num].tif
    lang是语言,fontname是字体,num为自定义数字
    3.保存为 num.font.exp1.tif
    4.运行以下命令生成.box文件
tesseract num.font.exp1.tif num.font.exp1 batch.nochop makebox

6.在文件夹文件夹内,新建一个文本文件,名为font_propertie,用记事本打开,写入内容为: font 0 0 0 0 0(可根据需求调整)
7.打开 jTessBoxEditor>【BOX Editor】> 【Open】,打开num.font.exp0.tif;矫正【Char】上的字符
关于现阶段java调用OCR文字识别技术的总结_第3张图片
打开tif文件时,会自动加载它的.box文件
8.点击save保存
9.运行cmd命令

echo Run Tesseract for Training.. 
tesseract.exe num.font.exp1.tif num.font.exp1 nobatch box.train 

echo Compute the Character Set.. 
unicharset_extractor.exe num.font.exp1 
mftraining -F font_properties -U unicharset -O num.unicharset num.font.exp1.tr 

echo Clustering.. 
cntraining.exe num.font.exp1.tr 

echo Rename Files.. 
rename normproto num.normproto 
rename inttemp num.inttemp 
rename pffmtable num.pffmtable 
rename shapetable num.shapetable  

echo Create Tessdata.. 
combine_tessdata.exe num. 

echo. & pause

运行这个命令会在生成许多文件,其他的不用管,我们只需要 .trainddata文件就够了
10.拷贝 num.trainddata 文件至tesseract-ocr的tessdata目录下,然后就可以使用训练生成的语言包进行图像文字识别了。

2.Java调用百度OCR文字识别API

虽说百度ocr也是付费,但是比其他良心一点,如果访问量小的话,可以考虑一下。因为它有50000次/日的免费次数
百度ocr免费次数

首先你需要进入百度ai开放平台并且登录进去(百度账号)
关于现阶段java调用OCR文字识别技术的总结_第4张图片
创建一个新的应用,表单随便填写
关于现阶段java调用OCR文字识别技术的总结_第5张图片
创建成功后,你就可以看到自己的APP_ID、API_KEY、SECRET_KEY
这三个参数很重要!用来获取token
在这里插入图片描述
然后就可以通过百度API文档在你的代码中调用了
下面取自api中

	public static final String APP_ID = "你的APP_ID ";
    public static final String API_KEY = "你的API_KEY ";
    public static final String SECRET_KEY = "你的SECRET_KEY ";

    
    private static String test() {
    	// 初始化一个AipOcr
        AipOcr client = new AipOcr(APP_ID, API_KEY, SECRET_KEY);

        // 可选:设置网络连接参数
        client.setConnectionTimeoutInMillis(2000);
        client.setSocketTimeoutInMillis(60000);

        // 可选:设置代理服务器地址, http和socket二选一,或者均不设置
//        client.setHttpProxy("proxy_host", proxy_port);  // 设置http代理
//        client.setSocketProxy("proxy_host", proxy_port);  // 设置socket代理

        // 可选:设置log4j日志输出格式,若不设置,则使用默认配置
        // 也可以直接通过jvm启动参数设置此环境变量
        //System.setProperty("aip.log4j.conf", "path/to/your/log4j.properties");

        // 调用接口
        String path = "D:\\image.jpg";
        JSONObject res = client.basicGeneral(path, new HashMap<String, String>());
        JSONArray jsonArray = res.getJSONArray("words_result");
        String content = "";
        for (int j = 0; j < jsonArray.length(); j++) {
            JSONObject jObj = jsonArray.getJSONObject(j);
            content += jObj.getString("words").trim()+"\n";
        }
        //System.out.println(res.toString(2));
        //System.out.println(content);
		return content;
    }

不过要注意的是,由于是免费的所以有着QPS限制,也就是说一秒内只能访问两次,超出会识别失败的

3.上帝之眼sikulix—ocr

sikulix上帝之眼是支持ocr的,其底层是tesseract的实现。
比tesseract稍微好一点的是,sikulix是封装过的,可以使用api调用
由于它的底层是tesseract,所以我也并没有过多的去了解,tesseract的识别率都不怎么样,更何况是sikulix呢,不过想来应该比自己摸索tesseract简单一点吧
给大家一个链接有兴趣的可以去了解一下SikuliX 使用笔记
在这里我也不多说了。

4.ocr文字识别软件源码

这是我在了解ocr的时候,发现的一款基于java的ocr文字识别软件的源码,可以单独运行识别,也可取其核心代码来使用,经测试识别效果挺不错的。
识别度较高的ocr文字识别软件源码

总结一下

目前开源的ocr实在是太少了,如果需要识别的是英文或数字验证码之类的,推荐使用Tesseract,虽然中文识别不怎么样,但是其他语言还是蛮不错的。中文的话,如果需求不大,可以试一下百度ocr。如果需求比较大,还要求精确度高,那也只能购买成熟的技术了,毕竟知识就是财富呀

你可能感兴趣的:(java随笔记录)