JAVA演示阿里云圖像識別API,印刷文字識別-營業(yè)執(zhí)照識別
最近有由于需要,我開始接觸阿里云的云市場的印刷文字識別-營業(yè)執(zhí)照識別這里我加上了官網(wǎng)的申請說明,只要你有阿里云賬號就可以用,前500次是免費的,API說明很簡陋,只能做個簡單參考。
一、API介紹
JAVA示例:
public static void main(String[] args) {
String host = "https://dm-58.data.aliyun.com";
String path = "/rest/160601/ocr/ocr_business_license.json";
String method = "POST";
String appcode = "你自己的AppCode";
Map<String, String> headers = new HashMap<String, String>();
//最后在header中的格式(中間是英文空格)為Authorization:APPCODE 83359fd73fe94948385f570e3c139105
headers.put("Authorization", "APPCODE " + appcode);
//根據(jù)API的要求,定義相對應(yīng)的Content-Type
headers.put("Content-Type", "application/json; charset=UTF-8");
Map<String, String> querys = new HashMap<String, String>();
String bodys = "{\"image\":\"對圖片內(nèi)容進(jìn)行Base64編碼\"}";
try {
/**
* 重要提示如下:
* HttpUtils請從
* https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/src/main/java/com/aliyun/api/gateway/demo/util/HttpUtils.java
* 下載
*
* 相應(yīng)的依賴請參照
* https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/pom.xml
*/
HttpResponse response = HttpUtils.doPost(host, path, method, headers, querys, bodys);
System.out.println(response.toString());
//獲取response的body
//System.out.println(EntityUtils.toString(response.getEntity()));
} catch (Exception e) {
e.printStackTrace();
}
}
返回碼:
{
"config_str" : "null\n", #配置字符串信息
"angle" : float, #輸入圖片的角度(順時針旋轉(zhuǎn)),[0, 90, 180,270]
"reg_num" : string, #注冊號,沒有識別出來時返回"FailInRecognition"
"name" : string, #公司名稱,沒有識別出來時返回"FailInRecognition"
"type" : string, #公司類型,沒有識別出來時返回"FailInRecognition"
"person" : string, #公司法人,沒有識別出來時返回"FailInRecognition"
"establish_date": string, #公司注冊日期(例:證件上為"2014年04月16日",算法返回"20140416")
"valid_period": string, #公司營業(yè)期限終止日期(例:證件上為"2014年04月16日至2034年04月15日",算法返回"20340415")
#當(dāng)前算法將日期格式統(tǒng)一為輸出為"年月日"(如"20391130"),并將"長期"表示為"29991231",若證件上沒有營業(yè)期限,則默認(rèn)其為"長期",返回"29991231"。
"address" : string, #公司地址,沒有識別出來時返回"FailInRecognition"
"capital" : string, #注冊資本,沒有識別出來時返回"FailInRecognition"
"business": string, #經(jīng)營范圍,沒有識別出來時返回"FailInRecognition"
"emblem" : string, #國徽位置[top,left,height,width],沒有識別出來時返回"FailInDetection"
"title" : string, #標(biāo)題位置[top,left,height,width],沒有識別出來時返回"FailInDetection"
"stamp" : string, #印章位置[top,left,height,width],沒有識別出來時返回"FailInDetection"
"qrcode" : string, #二維碼位置[top,left,height,width],沒有識別出來時返回"FailInDetection"
"success" : bool, #識別成功與否 true/false
"request_id": string
}
購買后,在云市場列表里展示,你可要點擊進(jìn)去查看AppCode等其主要信息(接口調(diào)用里需要AppCode)
簡單的API介紹,但挺有效了的,唯一不好的就是沒有錯誤返回碼的描述,需要自己測試。
二、代碼開發(fā)
閑話少說,上代碼:
AliyunImageRecognitionUtil :阿里云圖像識別工具類
package com.casic.cloud.qcy.util;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import org.apache.http.HttpResponse;
import org.apache.http.util.EntityUtils;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
import com.alibaba.fastjson.JSONObject;
import com.casic.cloud.qcy.constant.Constants;
import sun.misc.BASE64Encoder;
/**
* @ClassName: AliyunImageRecognitionUtil
* @Description: 阿里云圖像識別工具類
* @author: tianpengw
* @date 2019年3月21日 上午8:49:08
*
*/
public class AliyunImageRecognitionUtil {
private static String businessLicenceHost = PropertiesUtil.getProperties("businessLicenceHost");
private static String businessLicencePath = PropertiesUtil.getProperties("businessLicencePath");
private static String method = "POST";
private static String appCode = PropertiesUtil.getProperties("appCode");
/**
*
* @Description: 根據(jù)文件全路徑識別
* @author: tianpengw
* @param imgPath
* @return
*/
public static Map<String,Object> bussinessLicenceRecognition(String imgPath){
Map<String,Object> resultMap = new HashMap<String,Object>();
Map<String, String> headers = new HashMap<String, String>();
//最后在header中的格式(中間是英文空格)為Authorization:APPCODE 83359fd73fe94948385f570e3c139105
headers.put("Authorization", "APPCODE " + appCode);
headers.put("Content-Type", "application/json; charset=UTF-8");
Map<String, String> querys = new HashMap<String, String>();
String bodys = "{\"image\":\""+imageToBase64Str(imgPath)+"\"}";
try {
/**
* 重要提示如下:
* HttpUtils請從
* https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/src/main/java/com/aliyun/api/gateway/demo/util/HttpUtils.java
* 下載
*
* 相應(yīng)的依賴請參照
* https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/pom.xml
*/
HttpResponse response = AliyunHttpUtils.doPost(businessLicenceHost, businessLicencePath, method, headers, querys, bodys);
String resStr = EntityUtils.toString(response.getEntity());
System.out.println(resStr);
resultMap = JSONObject.parseObject(resStr, Map.class);
//獲取response的body
} catch (Exception e) {
e.printStackTrace();
}
return resultMap;
}
/**
*
* @Description: 根據(jù)InputStream識別
* @author: tianpengw
* @param imgPath
* @return
*/
public static Map<String,Object> bussinessLicenceRecognition(InputStream inputStream){
Map<String,Object> resultMap = new HashMap<String,Object>();
Map<String, String> headers = new HashMap<String, String>();
//最后在header中的格式(中間是英文空格)為Authorization:APPCODE 83359fd73fe94948385f570e3c139105
headers.put("Authorization", "APPCODE " + appCode);
headers.put("Content-Type", "application/json; charset=UTF-8");
Map<String, String> querys = new HashMap<String, String>();
// 加密
BASE64Encoder encoder = new BASE64Encoder();
byte[] data = null;
try {
data = new byte[inputStream.available()];
inputStream.read(data);
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
String bodys = "{\"image\":\""+encoder.encode(data)+"\"}";
try {
/**
* 重要提示如下:
* HttpUtils請從
* https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/src/main/java/com/aliyun/api/gateway/demo/util/HttpUtils.java
* 下載
*
* 相應(yīng)的依賴請參照
* https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/pom.xml
*/
HttpResponse response = AliyunHttpUtils.doPost(businessLicenceHost, businessLicencePath, method, headers, querys, bodys);
String resStr = EntityUtils.toString(response.getEntity());
System.out.println(resStr);
resultMap = JSONObject.parseObject(resStr, Map.class);
resultMap.put("errCode", Constants.RESULT_SUCCESS);
//獲取response的body
} catch (Exception e) {
e.printStackTrace();
resultMap.put("errCode", Constants.RESULT_FAIL);
}
return resultMap;
}
/**
*
* @Description: 根據(jù)byte[]識別
* @author: tianpengw
* @param imgPath
* @return
*/
public static Map<String,Object> bussinessLicenceRecognition( byte[] data){
Map<String,Object> resultMap = new HashMap<String,Object>();
Map<String, String> headers = new HashMap<String, String>();
//最后在header中的格式(中間是英文空格)為Authorization:APPCODE 83359fd73fe94948385f570e3c139105
headers.put("Authorization", "APPCODE " + appCode);
headers.put("Content-Type", "application/json; charset=UTF-8");
Map<String, String> querys = new HashMap<String, String>();
// 加密
BASE64Encoder encoder = new BASE64Encoder();
String bodys = "{\"image\":\""+encoder.encode(data)+"\"}";
try {
/**
* 重要提示如下:
* HttpUtils請從
* https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/src/main/java/com/aliyun/api/gateway/demo/util/HttpUtils.java
* 下載
*
* 相應(yīng)的依賴請參照
* https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/pom.xml
*/
HttpResponse response = AliyunHttpUtils.doPost(businessLicenceHost, businessLicencePath, method, headers, querys, bodys);
String resStr = EntityUtils.toString(response.getEntity());
System.out.println(resStr);
resultMap = JSONObject.parseObject(resStr, Map.class);
resultMap.put("errCode", Constants.RESULT_SUCCESS);
//獲取response的body
} catch (Exception e) {
e.printStackTrace();
resultMap.put("errCode", Constants.RESULT_FAIL);
}
return resultMap;
}
/**
* 圖片轉(zhuǎn)base64字符串
* @param imgFile 圖片路徑
* @return
*/
public static String imageToBase64Str(String imgFile) {
InputStream inputStream = null;
byte[] data = null;
try {
inputStream = new FileInputStream(imgFile);
data = new byte[inputStream.available()];
inputStream.read(data);
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
// 加密
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(data);
}
public static void main(String[] args) {
String imgPath = "d:/yyzznew1.jpg";
Map<String,Object> map = AliyunImageRecognitionUtil.bussinessLicenceRecognition(imgPath);
System.out.println(map.get("person"));
System.out.println(map.get("reg_num"));
}
}
AliyunHttpUtils :阿里云httpUtils
package com.casic.cloud.qcy.util;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import org.apache.commons.lang.StringUtils;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.entity.ByteArrayEntity;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
/**
* @ClassName: AliyunHttpUtils
* @Description:
* @author: tianpengw
* @date 2019年3月21日 上午8:44:51
*
*/
public class AliyunHttpUtils {
/**
* get
*
* @param host
* @param path
* @param method
* @param headers
* @param querys
* @return
* @throws Exception
*/
public static HttpResponse doGet(String host, String path, String method,
Map<String, String> headers,
Map<String, String> querys)
throws Exception {
HttpClient httpClient = wrapClient(host);
HttpGet request = new HttpGet(buildUrl(host, path, querys));
for (Map.Entry<String, String> e : headers.entrySet()) {
request.addHeader(e.getKey(), e.getValue());
}
return httpClient.execute(request);
}
/**
* post form
*
* @param host
* @param path
* @param method
* @param headers
* @param querys
* @param bodys
* @return
* @throws Exception
*/
public static HttpResponse doPost(String host, String path, String method,
Map<String, String> headers,
Map<String, String> querys,
Map<String, String> bodys)
throws Exception {
HttpClient httpClient = wrapClient(host);
HttpPost request = new HttpPost(buildUrl(host, path, querys));
for (Map.Entry<String, String> e : headers.entrySet()) {
request.addHeader(e.getKey(), e.getValue());
}
if (bodys != null) {
List<NameValuePair> nameValuePairList = new ArrayList<NameValuePair>();
for (String key : bodys.keySet()) {
nameValuePairList.add(new BasicNameValuePair(key, bodys.get(key)));
}
UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(nameValuePairList, "utf-8");
formEntity.setContentType("application/x-www-form-urlencoded; charset=UTF-8");
request.setEntity(formEntity);
}
return httpClient.execute(request);
}
/**
* Post String
*
* @param host
* @param path
* @param method
* @param headers
* @param querys
* @param body
* @return
* @throws Exception
*/
public static HttpResponse doPost(String host, String path, String method,
Map<String, String> headers,
Map<String, String> querys,
String body)
throws Exception {
HttpClient httpClient = wrapClient(host);
HttpPost request = new HttpPost(buildUrl(host, path, querys));
for (Map.Entry<String, String> e : headers.entrySet()) {
request.addHeader(e.getKey(), e.getValue());
}
if (StringUtils.isNotBlank(body)) {
request.setEntity(new StringEntity(body, "utf-8"));
}
return httpClient.execute(request);
}
/**
* Post stream
*
* @param host
* @param path
* @param method
* @param headers
* @param querys
* @param body
* @return
* @throws Exception
*/
public static HttpResponse doPost(String host, String path, String method,
Map<String, String> headers,
Map<String, String> querys,
byte[] body)
throws Exception {
HttpClient httpClient = wrapClient(host);
HttpPost request = new HttpPost(buildUrl(host, path, querys));
for (Map.Entry<String, String> e : headers.entrySet()) {
request.addHeader(e.getKey(), e.getValue());
}
if (body != null) {
request.setEntity(new ByteArrayEntity(body));
}
return httpClient.execute(request);
}
/**
* Put String
* @param host
* @param path
* @param method
* @param headers
* @param querys
* @param body
* @return
* @throws Exception
*/
public static HttpResponse doPut(String host, String path, String method,
Map<String, String> headers,
Map<String, String> querys,
String body)
throws Exception {
HttpClient httpClient = wrapClient(host);
HttpPut request = new HttpPut(buildUrl(host, path, querys));
for (Map.Entry<String, String> e : headers.entrySet()) {
request.addHeader(e.getKey(), e.getValue());
}
if (StringUtils.isNotBlank(body)) {
request.setEntity(new StringEntity(body, "utf-8"));
}
return httpClient.execute(request);
}
/**
* Put stream
* @param host
* @param path
* @param method
* @param headers
* @param querys
* @param body
* @return
* @throws Exception
*/
public static HttpResponse doPut(String host, String path, String method,
Map<String, String> headers,
Map<String, String> querys,
byte[] body)
throws Exception {
HttpClient httpClient = wrapClient(host);
HttpPut request = new HttpPut(buildUrl(host, path, querys));
for (Map.Entry<String, String> e : headers.entrySet()) {
request.addHeader(e.getKey(), e.getValue());
}
if (body != null) {
request.setEntity(new ByteArrayEntity(body));
}
return httpClient.execute(request);
}
/**
* Delete
*
* @param host
* @param path
* @param method
* @param headers
* @param querys
* @return
* @throws Exception
*/
public static HttpResponse doDelete(String host, String path, String method,
Map<String, String> headers,
Map<String, String> querys)
throws Exception {
HttpClient httpClient = wrapClient(host);
HttpDelete request = new HttpDelete(buildUrl(host, path, querys));
for (Map.Entry<String, String> e : headers.entrySet()) {
request.addHeader(e.getKey(), e.getValue());
}
return httpClient.execute(request);
}
private static String buildUrl(String host, String path, Map<String, String> querys) throws UnsupportedEncodingException {
StringBuilder sbUrl = new StringBuilder();
sbUrl.append(host);
if (!StringUtils.isBlank(path)) {
sbUrl.append(path);
}
if (null != querys) {
StringBuilder sbQuery = new StringBuilder();
for (Map.Entry<String, String> query : querys.entrySet()) {
if (0 < sbQuery.length()) {
sbQuery.append("&");
}
if (StringUtils.isBlank(query.getKey()) && !StringUtils.isBlank(query.getValue())) {
sbQuery.append(query.getValue());
}
if (!StringUtils.isBlank(query.getKey())) {
sbQuery.append(query.getKey());
if (!StringUtils.isBlank(query.getValue())) {
sbQuery.append("=");
sbQuery.append(URLEncoder.encode(query.getValue(), "utf-8"));
}
}
}
if (0 < sbQuery.length()) {
sbUrl.append("?").append(sbQuery);
}
}
return sbUrl.toString();
}
private static HttpClient wrapClient(String host) {
HttpClient httpClient = new DefaultHttpClient();
if (host.startsWith("https://")) {
sslClient(httpClient);
}
return httpClient;
}
private static void sslClient(HttpClient httpClient) {
try {
SSLContext ctx = SSLContext.getInstance("TLS");
X509TrustManager tm = new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(X509Certificate[] xcs, String str) {
}
public void checkServerTrusted(X509Certificate[] xcs, String str) {
}
};
ctx.init(null, new TrustManager[] { tm }, null);
SSLSocketFactory ssf = new SSLSocketFactory(ctx);
ssf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
ClientConnectionManager ccm = httpClient.getConnectionManager();
SchemeRegistry registry = ccm.getSchemeRegistry();
registry.register(new Scheme("https", 443, ssf));
} catch (KeyManagementException ex) {
throw new RuntimeException(ex);
} catch (NoSuchAlgorithmException ex) {
throw new RuntimeException(ex);
}
}
}
PropertiesUtil :讀取配置文件工具
package com.casic.cloud.qcy.util;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
/**
* @ClassName: PropertiesUtil
* @Description:
* @author tianpengw
* @date 2018年6月27日 下午3:09:08
*
*/
public class PropertiesUtil {
private static Logger log = LogManager.getLogger(PropertiesUtil.class);
private static Properties prop;
static{
try{
if(null == prop){
prop = new Properties();
}
InputStream fis = null;
fis = ClassLoaderUtils.getResourceAsStream("common.properties", PropertiesUtil.class);
if(fis!=null){
prop.load(fis);// 將屬性文件流裝載到Properties對象中
fis.close();// 關(guān)閉流
}
}catch (Exception e) {
log.error("讀取配置文件出錯:" + e );
}
}
/**
*
* @Description: 根據(jù)key獲取配置的值
* @author tianpengw
* @param key
* @return
*/
public static String getProperties(String key){
if(key==null) return null;
return prop.getProperty(key);
}
/**
*
* @Description:
* @author tianpengw
* @param proper 讀取配置的文件名稱
* @param key
* @return
*/
public static String getPropertie(String resourceName,String key){
InputStream fis = ClassLoaderUtils.getResourceAsStream(resourceName, PropertiesUtil.class);
if(fis!=null){
try {
prop.load(fis);
fis.close();// 關(guān)閉流
} catch (IOException e) {
e.printStackTrace();
}
}
if(key==null) return null;
return prop.getProperty(key);
}
/**
*
* @Description: 根據(jù)key獲取配置的值,若沒有,則取傳過來的默認(rèn)的值
* @author tianpengw
* @param key
* @param defaultValue 默認(rèn)值
* @return
*/
public static String getProperties(String key,String defaultValue){
if(key==null) return null;
return prop.getProperty(key, defaultValue);
}
}
配置文件common.properties(放在 src/main/resources下)
#aliyun business licence recognition businessLicenceHost = https://dm-58.data.aliyun.com businessLicencePath = /rest/160601/ocr/ocr_business_license.json appCode = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
三、測試結(jié)果
成功的結(jié)果:
失敗結(jié)果,當(dāng)處理非營業(yè)執(zhí)照的圖片時將會返回“invalid business licence”結(jié)果,我這么沒有進(jìn)行判斷處理直接按照正確的json解析,所以報錯,此處你們可以按照自己需求選擇處理邏輯。從這返回結(jié)果也看的出該接口做的不合理,返回內(nèi)容不統(tǒng)一,導(dǎo)致接口使用者,必須知曉各種情況才能做有效的處理,如果此處能返回json串,給錯誤碼那對于調(diào)用者來說就方便多了。
四、后記
此API適合一般的營業(yè)執(zhí)照和新的三證合一的營業(yè)執(zhí)照,但是字段獲取的含義不同,此處需要注意;
由于API并未列出錯誤碼,在未知的錯誤情況還包含識別次數(shù)不夠的時候是報錯還是有錯誤提示(由于條件限制,此情況無法驗證);
工具是死的,人是活的,開發(fā)需要考慮盡可能多的情況,來保證代碼的完善。
至此,工具介紹完畢,歡迎交流。
相關(guān)文章
Java調(diào)用pyzbar解析base64二維碼過程解析
這篇文章主要介紹了Java調(diào)用pyzbar解析base64二維碼過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-08-08
IntelliJ IDEA 2020.3 重大特性(新功能一覽)
這篇文章主要介紹了IntelliJ IDEA 2020.3 重大特性(新功能一覽),本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12

