JAVA演示阿里云圖像識別API,印刷文字識別-營業(yè)執(zhí)照識別
最近有由于需要,我開始接觸阿里云的云市場的印刷文字識別-營業(yè)執(zhí)照識別這里我加上了官網(wǎng)的申請說明,只要你有阿里云賬號就可以用,前500次是免費(fèi)的,API說明很簡陋,只能做個(gè)簡單參考。
一、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, #輸入圖片的角度(順時(shí)針旋轉(zhuǎn)),[0, 90, 180,270] "reg_num" : string, #注冊號,沒有識別出來時(shí)返回"FailInRecognition" "name" : string, #公司名稱,沒有識別出來時(shí)返回"FailInRecognition" "type" : string, #公司類型,沒有識別出來時(shí)返回"FailInRecognition" "person" : string, #公司法人,沒有識別出來時(shí)返回"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, #公司地址,沒有識別出來時(shí)返回"FailInRecognition" "capital" : string, #注冊資本,沒有識別出來時(shí)返回"FailInRecognition" "business": string, #經(jīng)營范圍,沒有識別出來時(shí)返回"FailInRecognition" "emblem" : string, #國徽位置[top,left,height,width],沒有識別出來時(shí)返回"FailInDetection" "title" : string, #標(biāo)題位置[top,left,height,width],沒有識別出來時(shí)返回"FailInDetection" "stamp" : string, #印章位置[top,left,height,width],沒有識別出來時(shí)返回"FailInDetection" "qrcode" : string, #二維碼位置[top,left,height,width],沒有識別出來時(shí)返回"FailInDetection" "success" : bool, #識別成功與否 true/false "request_id": string }
購買后,在云市場列表里展示,你可要點(diǎn)擊進(jìn)去查看AppCode等其主要信息(接口調(diào)用里需要AppCode)
簡單的API介紹,但挺有效了的,唯一不好的就是沒有錯(cuò)誤返回碼的描述,需要自己測試。
二、代碼開發(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("讀取配置文件出錯(cuò):" + 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í)照的圖片時(shí)將會(huì)返回“invalid business licence”結(jié)果,我這么沒有進(jìn)行判斷處理直接按照正確的json解析,所以報(bào)錯(cuò),此處你們可以按照自己需求選擇處理邏輯。從這返回結(jié)果也看的出該接口做的不合理,返回內(nèi)容不統(tǒng)一,導(dǎo)致接口使用者,必須知曉各種情況才能做有效的處理,如果此處能返回json串,給錯(cuò)誤碼那對于調(diào)用者來說就方便多了。
四、后記
此API適合一般的營業(yè)執(zhí)照和新的三證合一的營業(yè)執(zhí)照,但是字段獲取的含義不同,此處需要注意;
由于API并未列出錯(cuò)誤碼,在未知的錯(cuò)誤情況還包含識別次數(shù)不夠的時(shí)候是報(bào)錯(cuò)還是有錯(cuò)誤提示(由于條件限制,此情況無法驗(yàn)證);
工具是死的,人是活的,開發(fā)需要考慮盡可能多的情況,來保證代碼的完善。
至此,工具介紹完畢,歡迎交流。
相關(guān)文章
Java 實(shí)戰(zhàn)項(xiàng)目之疫情防控管理系統(tǒng)詳解
讀萬卷書不如行萬里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用Java實(shí)現(xiàn)一個(gè)疫情防控管理系統(tǒng),大家可以在過程中查缺補(bǔ)漏,提升水平2021-11-11SpringBoot+POI實(shí)現(xiàn)給word添加水印功能
這篇文章主要介紹了SpringBoot+POI實(shí)現(xiàn)給word添加水印功能,文中通過代碼示例講解的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-06-06SpringBoot創(chuàng)建自定義starter詳解
這篇文章主要介紹了SpringBoot創(chuàng)建自定義starter詳解,Starter是Spring Boot中的一個(gè)非常重要的概念,Starter相當(dāng)于模塊,它能將模塊所需的依賴整合起來并對模塊內(nèi)的Bean根據(jù)環(huán)境(條件)進(jìn)行自動(dòng)配置,需要的朋友可以參考下2024-01-01