麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > Java > 正文

JAVA演示阿里云圖像識別API,印刷文字識別-營業執照識別

2020-01-31 16:50:03
字體:
來源:轉載
供稿:網友

最近有由于需要,我開始接觸阿里云的云市場的印刷文字識別-營業執照識別這里我加上了官網的申請說明,只要你有阿里云賬號就可以用,前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);   //根據API的要求,定義相對應的Content-Type   headers.put("Content-Type", "application/json; charset=UTF-8");   Map<String, String> querys = new HashMap<String, String>();   String bodys = "{/"image/":/"對圖片內容進行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   * 下載   *   * 相應的依賴請參照   * 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, #輸入圖片的角度(順時針旋轉),[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, #公司營業期限終止日期(例:證件上為"2014年04月16日至2034年04月15日",算法返回"20340415")  #當前算法將日期格式統一為輸出為"年月日"(如"20391130"),并將"長期"表示為"29991231",若證件上沒有營業期限,則默認其為"長期",返回"29991231"。  "address" : string, #公司地址,沒有識別出來時返回"FailInRecognition"  "capital" : string, #注冊資本,沒有識別出來時返回"FailInRecognition"  "business": string, #經營范圍,沒有識別出來時返回"FailInRecognition"  "emblem" : string, #國徽位置[top,left,height,width],沒有識別出來時返回"FailInDetection"  "title" : string, #標題位置[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}

購買后,在云市場列表里展示,你可要點擊進去查看AppCode等其主要信息(接口調用里需要AppCode)

簡單的API介紹,但挺有效了的,唯一不好的就是沒有錯誤返回碼的描述,需要自己測試。

二、代碼開發

閑話少說,上代碼:

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: 根據文件全路徑識別 * @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   * 下載   *   * 相應的依賴請參照   * 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: 根據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   * 下載   *   * 相應的依賴請參照   * 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: 根據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   * 下載   *   * 相應的依賴請參照   * 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; }  /**  * 圖片轉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();// 關閉流    } }catch (Exception e) {  log.error("讀取配置文件出錯:" + e ); } }  /** *  * @Description: 根據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();// 關閉流    } catch (IOException e) {  e.printStackTrace();  }     } if(key==null) return null; return prop.getProperty(key); }   /** *  * @Description: 根據key獲取配置的值,若沒有,則取傳過來的默認的值 * @author tianpengw  * @param key * @param defaultValue 默認值 * @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 recognitionbusinessLicenceHost = https://dm-58.data.aliyun.combusinessLicencePath = /rest/160601/ocr/ocr_business_license.jsonappCode = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

三、測試結果

成功的結果:

失敗結果,當處理非營業執照的圖片時將會返回“invalid business licence”結果,我這么沒有進行判斷處理直接按照正確的json解析,所以報錯,此處你們可以按照自己需求選擇處理邏輯。從這返回結果也看的出該接口做的不合理,返回內容不統一,導致接口使用者,必須知曉各種情況才能做有效的處理,如果此處能返回json串,給錯誤碼那對于調用者來說就方便多了。

四、后記

此API適合一般的營業執照和新的三證合一的營業執照,但是字段獲取的含義不同,此處需要注意;
由于API并未列出錯誤碼,在未知的錯誤情況還包含識別次數不夠的時候是報錯還是有錯誤提示(由于條件限制,此情況無法驗證);

工具是死的,人是活的,開發需要考慮盡可能多的情況,來保證代碼的完善。
至此,工具介紹完畢,歡迎交流。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 欧美一级免费在线观看 | 99精品视频久久精品视频 | 国产成人精品一区二区仙踪林 | caoporn国产一区二区 | 一级大片一级一大片 | 国产激情精品一区二区三区 | 国产免费一级淫片a级中文 99国产精品自拍 | 国产精品一区在线观看 | 久久久成人精品视频 | 色悠悠久久久久 | www.guochanav.com| 91午夜理伦私人影院 | 欧美黄色大片免费观看 | 精品国产一区二区亚洲人成毛片 | 亚洲一二三久久 | 欧美韩国日本在线 | av免费在线观看免费 | 久久精品久久精品久久精品 | 97se亚洲综合在线韩国专区福利 | 亚洲综合91 | 国产女厕一区二区三区在线视 | 精品国产一区二区三 | 韩国草草影院 | 一区二区三区日韩电影 | 色999国产 | 亚洲日本欧美 | 一级在线视频 | 成人毛片免费视频 | 黄色成人短视频 | 欧美 亚洲 视频 | 色a综合| 依依成人综合 | 国产乱淫av一区二区三区 | 一区二区精品视频 | 亚洲精品 在线播放 | 免费国产视频大全入口 | 福利在线播放 | 亚洲白嫩在线观看 | 午夜视频国产 | 色综合一区二区 | 日韩精品久久久 |