文字识别(Optical Character Recognition,简称OCR)是指对图像文件的打印字符进行检测识别,将图像中的文字转换成可编辑的文本格式。
OCR以开放API(Application Programming Interface,应用程序编程接口)的方式提供给用户,用户通过实时访问和调用API获取推理结果,帮助用户自动采集关键数据,打造智能化业务系统,提升业务效率。
当前文字识别服务支持以下多种场景的文字识别功能:
自动识别身份证上的全部信息,支持身份证正反面识别,一次扫描即可识别身份证号码、姓名、地址等全部信息,在暗光、倾斜、过曝光、阴影等异常条件下均可准确识别身份证信息。
自动识别驾驶证正页上的全部信息,自动提取出姓名、性别、领证日期、准驾车型、有效期限等结构化信息,在暗光、倾斜、过曝光、防伪标志干扰、阴影等异常条件下均可准确识别驾驶证信息。
自动识别行驶证正页上的全部信息,自动提取出号牌号码、车辆类型、所有人、使用性质、品牌型号、车辆识别代号、发动机号码、注册日期等结构化信息,在暗光、倾斜、过曝光、防伪标志干扰、阴影等异常条件下均可准确识别行驶证信息。
通过对增值税发票图片预处理、表格提取、文字提取、文字识别、结构化信息输出等一系列技术化手段,快速将增值税发票上的文字信息识别出来,用于后续的进一步处理,节省大量的人工录入成本。
提取表格内的文字和所在行列位置信息,适应不同格式的表格。同时也识别表格外部的文字区域。用于各种单据和报表的电子化,恢复结构化信息。
提取图片内的文字及其对应位置信息,并能够根据文字在图片中的位置进行结构化整理工作。
提取表格内的手写字母、数字和所在行列位置信息,适应不同格式的表格。同时也支持表格外部文字区域的手写字母数字识别。
自动识别机动车销售发票图片内的文本内容,并返回结构化字段信息,用于后续的进一步处理,节省大量的人工录入成本。
OCR文字识别可用于检测与识别多种类型的数字图像,提取其中的文本、数值、符号等字符,并返回结构化信息,方便用户自动采集关键数据,助力业务流程自动化、提升效率和降低人力成本。应用于用户认证识别、财务报销审核、金融保险、海关单据电子化等场景。
降低用户实名认证成本,准确快速便捷。
用于公司员工发票报销,票据自动识别,节省人工录入成本,提升效率。
用户申请保险报销,需提供身份证,报销单,医疗单据等纸件材料。通过文字识别可实现信息的自动录入和审核校对,提升效率。
很多公司都存在海外业务,通用文字识别可实现海关单据数据自动结构化和电子化,提升效率和录入信息准确度。
文字识别提供了Web化的服务管理平台,即管理控制台,以及基于HTTPS请求的API管理方式。
具体流程如下:
1. 申请服务
使用文字识别服务之前,必须先申请并开通服务,服务申请步骤如下所示。
说明:
- 申请文字识别服务之前,必须先申请华为云账号。
- 用户首次使用文字识别服务时,需要先申请开通该服务。服务只需要开通一次即可,后面使用时无需再次申请。
文字识别管理控制台地址:https://console.huaweicloud.com/ocr/?agencyId=c59680fbb0d24af8a2da5416d19e91ad®ion=cn-north-1&locale=zh-cn#/ocr/management/main。
3. 选择要使用的服务,单击“申请服务”,进行服务使用申请。
4. 完成“申请服务”之后,即完成该服务的开通操作。
2. 获取请求认证(用于调用api)
调用OCR的API有如下两种认证方式,请任选其中一种进行认证鉴权。此处使用AK/SK方式(推荐)
AK(Access Key ID):访问密钥ID。与私有访问密钥关联的唯一标识符;访问密钥ID和私有访问密钥一起使用,对请求进行 加密签名。
SK(Secret Access Key):与访问密钥ID结合使用的密钥,对请求进行加密签名,可标识发送方,并防止请求被修改。
获取AK/SK步骤:
3. 调用API
配置JAVA SDK的AK/SK,地区,终端。如下图:
请求参数说明:
名称 |
是否必选 |
类型 |
说明 |
---|---|---|---|
image |
与url二选一 |
String |
图像数据,base64编码,要求base64编码后大小不超过10M。图像各边的像素大小在15到8000之间。支持JPG/PNG/BMP/TIFF格式。 |
url |
与image二选一 |
String |
图片的URL路径,目前仅支持华为云上OBS提供的临时授权或者匿名公开授权访问的URL。 |
side |
否 |
String |
如果参数值为空或无该参数,系统自动识别,建议填写,准确率更高。 |
响应参数说明:
名称 |
类型 |
说明 |
---|---|---|
result |
JSON |
调用成功时表示调用结果。 调用失败时无此字段。 |
name |
String |
姓名。 |
sex |
String |
性别。 |
birth |
String |
出生日期。 |
ethnicity |
String |
民族。 |
address |
String |
地址。 |
number |
String |
身份证号。 |
issue |
String |
发证机关。 |
valid_from |
String |
有效起始日期。 |
valid_to |
String |
有效结束日期。 |
error_code |
String |
调用失败时的错误码,具体请参见错误码。 调用成功时无此字段。 |
error_msg |
String |
调用失败时的错误信息。 调用成功时无此字段。 |
成功响应示例(正面)
{
"result":{
"name":"张三",
"sex":"男",
"ethnicity":"汉",
"birth":"2000-03-06",
"address":"XX省XX市XX区XX街道XX号",
"number:"610XXXXXXXXXXXXXXX"
}
}
成功响应示例(背面)
{
"result":{
"issue": "XX省XX市XX区XX派出所",
"valid_from": "2004-08-26",
"valid_to": "2034-08-26"
}
}
失败响应示例
{
"error_code": "AIS.0105",
"error_msg": "Recognize Failed"
}
返回值
返回值 |
说明 |
---|---|
400 |
|
401 |
当前请求需要用户验证。 |
403 |
没有操作权限。 |
404 |
请求失败,在服务器上未找到请求所希望得到的资源。 |
500 |
服务器遇到了一个未曾预料的状况,导致无法完成对请求的处理。 |
完整的状态码列表请参见状态码
完整的错误码列表请参见错误码
代码示例:
HWOcrClientAKSK.java (传入AK/SK,地区(Endpoint),终端(Endpoint)调用识别接口的类)
import com.alibaba.fastjson.JSONObject;
import com.huawei.ais.common.AuthInfo;
import com.huawei.ais.common.ProxyHostInfo;
import com.huawei.ais.sdk.AisAccess;
import com.huawei.ais.sdk.AisAccessWithProxy;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.io.FileUtils;
import org.apache.http.HttpResponse;
import org.apache.http.entity.StringEntity;
import java.io.File;
import java.io.IOException;
public class HWOcrClientAKSK {
private AuthInfo HEC_AUTH; //Authorization Information
private AisAccess HttpService; //access to ocr service on cloud
private ProxyHostInfo PROXYINFO; //proxy host info (optional)
/**
* Constructor for OcrClientAKSK without proxy
* @param Endpoint HTTPEndPoint for OCR Service
* @param Region The region info for OCR Service
* @param YourAK The Access Key from Authentication
* @param YourSK The Secret Key from Authentication
* */
public HWOcrClientAKSK(String Endpoint,String Region,String YourAK,String YourSK) {
if (Endpoint== null|Endpoint == ""|Region == null| Region == ""| YourAK == null| YourAK == ""| YourSK == null|
YourSK == "")
throw new IllegalArgumentException("the parameter for HWOcrClientAKSK's Constructor cannot be empty");
HEC_AUTH= new AuthInfo(Endpoint,Region,YourAK,YourSK);
HttpService=new AisAccess(HEC_AUTH);
}
/**
* Constructor for OcrClientAKSK with proxy
* @param Endpoint HTTPEndPoint for OCR Service
* @param Region The region info for OCR Service
* @param YourAK The Access Key from Authentication
* @param YourSK The Secret Key from Authentication
* @param ProxyHost The URL for the proxy server
* @param ProxyPort The Port number for the proxy service
* @param ProxyUsrName The Loggin user for the proxy server if authentication is required
* @param ProxyPwd The Loggin pwd for the proxy server if authentication is required
* */
public HWOcrClientAKSK(String Endpoint,String Region,String YourAK,String YourSK,String ProxyHost,int ProxyPort,String ProxyUsrName,String ProxyPwd) {
if (Endpoint== null|Endpoint == ""|Region == null| Region == ""| YourAK == null| YourAK == ""| YourSK == null|
YourSK == ""|ProxyHost == null | ProxyHost == "" | ProxyUsrName == null |ProxyUsrName == ""| ProxyPwd == null | ProxyPwd == "")
throw new IllegalArgumentException("the parameter for HWOcrClientAKSK's Constructor cannot be empty");
HEC_AUTH= new AuthInfo(Endpoint,Region,YourAK,YourSK);
PROXYINFO= new ProxyHostInfo(ProxyHost,ProxyPort,ProxyUsrName,ProxyPwd);
HttpService=new AisAccessWithProxy(HEC_AUTH,PROXYINFO);
}
/*
* Release the access service when the object is collected
* */
protected void finalize(){
HttpService.close();
}
/**
* Call the OCR API with a local picture file
* @param uri the uri for the http request to be called
* @param filepath the path for the picture file to be recognized
* */
public HttpResponse requestOcrServiceBase64(String uri,String filepath) throws IOException {
if(uri == null | uri == "" | filepath == null | filepath == "")
throw new IllegalArgumentException("the parameter for requestOcrServiceBase64 cannot be empty");
try {
byte[] fileData = FileUtils.readFileToByteArray(new File(filepath));
String fileBase64Str = Base64.encodeBase64String(fileData);
JSONObject json = new JSONObject();
json.put("image", fileBase64Str);
//
// 2.a (Optional) Specify whether the information is obtained from the front or back side of the ID card.
// side Possible value: front, back, or unspecified. If the parameter is left unspecified or the parameter is not included, the algorithm automatically determine the side from which the information is obtained. You are advised to specify this parameter to improve the accuracy.
//
//json.put("side", "front");
StringEntity stringEntity = new StringEntity(json.toJSONString(), "utf-8");
// 3. Pass the URI and required parameters of ID Card OCR.
// Pass the parameters in JSON objects and invoke the service using POST.
HttpResponse response = HttpService.post(uri, stringEntity);
return response;
// 4. Check whether the service invocation is successful. If 200 is returned, the invocation succeeds. Otherwise, it fails.
//ResponseProcessUtils.processResponseStatus(response);
// 5. Process the character stream returned by the service.
//ResponseProcessUtils.processResponse(response);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
ResponseProcessUtils.java (工具类,用于处理结果的返回)
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import org.apache.http.HttpResponse;
import com.huawei.ais.sdk.util.HttpClientUtils;
/**
* Tool used to verify the information returned from service access.
*/
public class ResponseProcessUtils {
/**
* Print the HTTP status code after the service access is complete.
*
* @param response Response object
*/
public static void processResponseStatus(HttpResponse response) {
System.out.println(response.getStatusLine().getStatusCode());
}
/**
* Convert the service access result into a character stream, which is used for showing the JSON data.
*
* @param response Response object
* @throws UnsupportedOperationException
* @throws IOException
*/
public static void processResponse(HttpResponse response) throws UnsupportedOperationException, IOException {
System.out.println(HttpClientUtils.convertStreamToString(response.getEntity().getContent()));
}
/**
* Write the byte array to the file to support generation of binary files (for example, images).
* @param fileName File name
* @param data Data
* @throws IOException
*/
public static void writeBytesToFile(String fileName, byte[] data) throws IOException{
FileChannel fc = null;
try {
ByteBuffer bb = ByteBuffer.wrap(data);
fc = new FileOutputStream(fileName).getChannel();
fc.write(bb);
} catch (Exception e) {
e.printStackTrace();
System.out.println(e.getMessage());
}
finally {
fc.close();
}
}
}
OCRDemo.java (调用身份识别示例方法)
import com.huawei.ais.demo.ocr.*;
import java.io.IOException;
import java.net.URISyntaxException;
import org.apache.http.HttpResponse;
import org.apache.commons.io.IOUtils;
public class OCRDemo {
public static void main(String[] args) throws URISyntaxException, UnsupportedOperationException, IOException{
/*
* AK/SK demo code
* */
String Httpendpoint="https://ocr.cn-north-1.myhuaweicloud.com"; //http endpoint for the service
String Region="cn-north-1"; //region name for the service
String AK="xxx"; //AK from authentication
String SK="xxx"; //SK from authentication
try {
HWOcrClientAKSK ocrClient=new HWOcrClientAKSK(Httpendpoint,Region,AK,SK);
HttpResponse response=ocrClient.requestOcrServiceBase64("/v1.0/ocr/id-card", "./data/id-card-demo.png");
System.out.println(response);
String content = IOUtils.toString(response.getEntity().getContent());
System.out.println(content);
}
catch (Exception e) {
e.printStackTrace();
}
}
}
OCR以API的方式提供服务,具体操作请参见《文字识别API参考》。