首先对比一下各厂商开放接口免费额度

阿里云OCR:自购买起500次/年,过期作废。超过另计算
腾讯云OCR:1000次/月。超过另计算
百度云OCR:各种场景几十到几万次/天。超过另计算

标题小型项目,为节约成本,最终项目确定使用百度云OCR,接下来记录一下使用体验。

标题1、首先创建一个maven普通Java工程。项目结构如下:

java 识别汉子 java实现ocr文字识别_百度云

2、添加依赖 (注意版本要用最新的)

最新的版本看这里

<!--  百度云OCR文字识别Java-SDK依赖      -->
        <dependency>
            <groupId>com.baidu.aip</groupId>
            <artifactId>java-sdk</artifactId>
            <version>最新的版本</version>
        </dependency>

java 识别汉子 java实现ocr文字识别_百度云_02

3、在项目根目录下(路径可自定义)创建存放本地图片的目录,并加入测试需要的图片

java 识别汉子 java实现ocr文字识别_json_03

4、编写代码

import com.baidu.aip.ocr.AipOcr;
import org.json.JSONArray;
import org.json.JSONObject;
 
import java.util.HashMap;
import java.util.Iterator;
 
/*
* 百度云文字识别测试类
* */
public class BaiduyunOCRDemo {
    //设置APPID/AK/SK
    public static final String APP_ID = "";//你的 App ID
    public static final String API_KEY = "";//你的 Api Key
    public static final String SECRET_KEY = "";//你的 Secret Key
 
    public static void main(String []args){
            // 初始化一个AipOcr
            AipOcr aipOcr = new AipOcr(APP_ID, API_KEY, SECRET_KEY);
            // 可选:设置网络连接参数
//            aipOcr.setConnectionTimeoutInMillis(2000);//建立连接的超时时间(单位:毫秒)
//            aipOcr.setSocketTimeoutInMillis(60000);//通过打开的连接传输数据的超时时间(单位:毫秒)
 
            // 可选:设置代理服务器地址, http和socket二选一,或者均不设置
//            aipOcr.setHttpProxy("proxy_host", proxy_port);  // 设置http代理
//            aipOcr.setSocketProxy("proxy_host", proxy_port);  // 设置socket代理
 
            // 可选:设置log4j日志输出格式,若不设置,则使用默认配置
            // 也可以直接通过jvm启动参数设置此环境变量
//            System.setProperty("aip.log4j.conf", "path/to/your/log4j.properties");
 
            //设置本地图片地址
            String path = "E:\\IDEA\\IntelliJ IDEA 2019.1.3\\IdeaProjects\\BaiduyunOCRDemo\\images\\Chinese.jpg";
           //通用文字识别
            basicGeneral(aipOcr,path);
            //身份证识别
//            idCord(aipOcr,path);
            //车牌号识别
//            licencePlateNumber(aipOcr,path);
    }
    /*
    * 通用文字识别
    * */
    public static void basicGeneral(AipOcr aipOcr,String path){
            // 传入可选参数调用接口
            HashMap<String, String> options = new HashMap<String, String>();
            options.put("language_type", "CHN_ENG");//识别语言类型,默认为中英文混合
            options.put("detect_direction", "true");//是否检查图片朝向,默认false不检查
            options.put("detect_language", "true");//是否检查语言,默认false不检查
            options.put("probability", "true");//是否返回识别结果中每一行的置信度
 
            // 调用接口,返回JSON格式数据
            JSONObject jsonObject = aipOcr.basicGeneral(path, options);
            //获取JSON对象里提取图片文字信息数组
            JSONArray jsonArray = jsonObject.getJSONArray("words_result");
            //循环打印信息
            for(int i = 0;i<jsonArray.length();i++){
                System.out.println(jsonArray.getJSONObject(i).get("words"));
            }
    }
 
    /*
    * 身份证文字识别
    * */
    public  static void idCord(AipOcr aipOcr,String path){
        // 传入可选参数调用接口
        HashMap<String, String> options = new HashMap<String, String>();
        options.put("detect_direction", "true");//检查图片朝向。默认false不检测
        options.put("detect_risk", "false");//是否开启身份证类型检测功能(类型为身份证复印件、临时身份证、身份证翻拍、修改过的身份证),默认false不开启
        String idCardSide = "front";//身份证含照片一面
//        String idCardSide = "back";//身份证含国徽一面
        //本地图片识别,返回JSON对象
        JSONObject jsonObject = aipOcr.idcard(path, idCardSide, options);
        //获取到我们需要的信息
        JSONObject result = jsonObject.getJSONObject("words_result");
 
        //获取迭代器,
        Iterator<String> iterator = result.keys();
        while (iterator.hasNext()){
            //获取键和值
            String key = iterator.next();
            String value = result.getJSONObject(key).getString("words");
            //打印识别结果
            System.out.println(key+" : "+value);
        }
    }
 
    /*
    * 车牌号识别
    * */
    public static void licencePlateNumber(AipOcr aipOcr,String path){
        // 传入可选参数调用接口
        HashMap<String, String> options = new HashMap<String, String>();
        options.put("multi_detect", "false");//是否检测多张图片,默认false
        //本地图片识别,返回JSON对象
        JSONObject jsonObject = aipOcr.plateLicense(path, options);
        //获取需要的信息
        JSONObject result = jsonObject.getJSONObject("words_result");
        System.out.println("车牌颜色:"+result.getString("color")+"\n"+"车牌号:"+result.getString("number"));
    }
}

5、测试三种场景运行结果

5.1、通用文字识别结果

5.1.1

java 识别汉子 java实现ocr文字识别_java_04


java 识别汉子 java实现ocr文字识别_开发语言_05


5.1.2

java 识别汉子 java实现ocr文字识别_百度云_06


java 识别汉子 java实现ocr文字识别_开发语言_07


5.1.3

java 识别汉子 java实现ocr文字识别_json_08


java 识别汉子 java实现ocr文字识别_json_09


5.1.4

java 识别汉子 java实现ocr文字识别_java_10


java 识别汉子 java实现ocr文字识别_java_11


结果:印刷体识别效果较好。

5.2、身份证文字识别

5.2.1

java 识别汉子 java实现ocr文字识别_json_12


java 识别汉子 java实现ocr文字识别_json_13


5.2.2

java 识别汉子 java实现ocr文字识别_开发语言_14


java 识别汉子 java实现ocr文字识别_java 识别汉子_15


5.2.3、识别图片为本人真实身份证、

java 识别汉子 java实现ocr文字识别_百度云_16


结果:对比1、2发现,身份证原件识别效果高于复印件,对比1、2、3发现前2次返回结果中身份证号码都为空,通过多次对不同真假身份证对比发现,百度云后台对识别的身份证做了真实性检查,假身份证返回号码为空,真实身份证才会返回身份证号码。

5.3、车牌识别

java 识别汉子 java实现ocr文字识别_java 识别汉子_17


java 识别汉子 java实现ocr文字识别_json_18


车牌识别仅简单体验,并未测试多图片对比。