使用百度OCR文字识别API从图片中提取字符串

      今天遇到一个问题需要解决,就是从顾客的账单(PDF格式)中通过标识提取出属性值。有两个方法来实现这个功能,一是通过PDFBox或itext先提取文字再进行位置判断,二是通过图像识别,先找到位置再进行文字的识别。第一种方法有局限性,一旦用户上传的不是PDF格式的文件,就无法进行识别,使用导师让我考虑用图像识别的方法来进行提取。

      尝试使用了一下百度的OCR识别,识别的准确率挺高的,但是无奈顾客的信息不能泄露,所以实际应用中不能使用百度OCR。只能写个博客记录一下开发过程。

 

1、创建应用

首先当然是在百度的网站上创建应用,拿到APP_ID、API_KEY和SECRET_KEY,比较简单就不多说了

2、自定义模板

因为我所需要的业务是从账单中提取所需要的内容,而且账单的格式比较固定,使用可以使用自定义模板来提取只对我有用的信息,这样做识别率和准确率会更高一些,但是缺点就是一旦模板修改就需要重新设计。

百度的自定义模板分为两块,分别是

  • 【参照字段】:图片中位置和内容都固定不变的文字后期上传的图片会以此为依据进行扭正,参照字段的选取会影响图片的识别率,建议选取8个以上的参照字段,单个参照字段内的文字不可以换行。
  • 【识别区】:需要识别的值可能出现的范围。

通过这两个区域的设置,可以对我们所需要的区域进行一个识别

3、创建AipOcr并且调用

AipOcr就是百度OCR的应用程序,通过创建AipOcr来进行识别,然后调用custom方法

public class Exemple {
	//设置APPID/AK/SK
	private static final String APP_ID = "XXXXXX";
    private static final String API_KEY = "XXXXXX";
    private static final String SECRET_KEY = "XXXXXX";
 
    public static void main(String[] args) {
        // 初始化一个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");

        sample(client);
        
    }
    
    public static void sample(AipOcr client) {
        // 传入可选参数调用接口
        HashMap options = new HashMap();
        options.put("templateSign", "XXXXXXX");
        options.put("classifierId", "31232");
        
        String templateSign = "e751690979c6b9631834ae891c48459b";
        // 参数为本地路径
        String image = "E:/p/55/0.jpg";
        org.json.JSONObject res = client.custom(image, templateSign, options);
        System.out.println(res.toString(2));
    }
}

 

你可能感兴趣的:(Java)