基於百度API,實現圖片文字識別功能(Java版)
1、登入百度AI開放平臺
(1)在頂部導航欄中,找到控制檯選項,並選擇文字識別功能,進入管理中心頁面
(2)在管理中心頁面中,找到建立應用按鈕並點選
(3)填寫應用名名稱和應用描述,選擇相應的應用型別,勾選自己需要的介面服務(如果選擇的是文字識別,則對應的文字識別介面服務預設全部勾選),文字識別包名如果是應用在電腦端,則預設選擇不需要即可,如果還需要其他功能,則再勾選其功能對應的相關介面即可,例如:在文字識別的時候,我還需要人臉識別,則再勾選人臉識別對應的所有介面即可
(4)建立完畢之後,點選返回應用列表按鈕
(5)在應用列表介面中,即可檢視應用對應的 API Key 和 Secret Key
2、獲取Access Token
(1)匯入Java SDK 和 FastJson工具包
普通工程:
三、找到文字識別,選擇Java SDK,點選右邊的下載按鈕
四、把下載好的Java SDK 和 FastJson工具包 匯入到專案中即可
Maven工程:
直接把下面這段程式碼複製到 pom.xml 中就行
<!--百度文字識別介面--> <dependency> <groupId>com.baidu.aip</groupId> <artifactId>java-sdk</artifactId> <version>4.5.0</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.47</version> </dependency>
(2)獲取Access Token
package com.project.dom; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.List; import java.util.Map; import com.alibaba.fastjson.JSONObject; /** * 百度文字識別demo */ public class baiduOcr { /** * 獲取許可權token * @return 返回示例: * { * "access_token": "24.c9303e47f0729c40f2bc2be6f8f3d589.2592000.1530936208.282335-1234567", * "expires_in":2592000 * } */ public static String getAuth() { // 官網獲取的 API Key String clientId = "API Key"; // 官網獲取的 Secret Key String clientSecret = "Secret Key"; return getAuth(clientId, clientSecret); } /** * 獲取API訪問token * 該token有一定的有效期,需要自行管理,當失效時需重新獲取. * @param ak - 百度雲的 API Key * @param sk - 百度雲的 Securet Key * @return assess_token 示例: * "24.c9303e47f0729c40f2bc2be6f8f3d589.2592000.1530936208.282335-1234567" */ public static String getAuth(String ak, String sk) { // 獲取token地址 String authHost = "https://aip.baidubce.com/oauth/2.0/token?"; String getAccessTokenUrl = authHost // 1. grant_type為固定引數 + "grant_type=client_credentials" // 2. 官網獲取的 API Key + "&client_id=" + ak // 3. 官網獲取的 Secret Key + "&client_secret=" + sk; try { URL realUrl = new URL(getAccessTokenUrl); // 開啟和URL之間的連線 HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection(); connection.setRequestMethod("POST");//百度推薦使用POST請求 connection.connect(); // 獲取所有響應頭欄位 Map<String, List<String>> map = connection.getHeaderFields(); // 定義 BufferedReader輸入流來讀取URL的響應 BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); String result = ""; String line; while ((line = in.readLine()) != null) { result += line; } System.err.println("result:" + result); JSONObject jsonObject = JSONObject.parseObject(result.toString()); String access_token = jsonObject.getString("access_token"); return access_token; } catch (Exception e) { System.err.printf("獲取token失敗!"); e.printStackTrace(System.err); } return null; } }
呼叫baiduOcr.getAuth()就能獲取到result,result格式如下:
result: {
"access_token": "24.6c5e1ff107f0e8bcef8c46d3424a0e78.2592000.1485516651.282335-8574074",
"session_key":"9mzdDZXu3dENdFZQurfg0Vz8slgSgvvOAUebNFzyzcpQ5EnbxbF+hfG9DQkpUVQdh4p6HbQcAiz5RmuBAja1JJGgIdJI",
"scope": "public wise_adapt",
"refresh_token": "25.5f706c15bfc5799897518ab954b2bc07.1234567890.1843716344.1234567-1234567",
"session_secret": "dfac94a3489fe9fca7c3221cbf7525ff",
"expires_in": 2592000
}
其中暫時有用的就access_token和expires_in兩個值,access_token是呼叫文字識別必帶的一個引數,expires_in是Access Token 的有效期一般是一個月
3.將本地圖片進行BASE64位編碼
import sun.misc.BASE64Encoder;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
public class BASE64 {
/**
* 將本地圖片進行Base64位編碼
*
* @param imgUrl 圖片的url路徑,如D:\\photo\\1.png
*
* @return
*/
public static String encodeImgageToBase64(File imageFile) {
// 將圖片檔案轉化為位元組陣列字串,並對其進行Base64編碼處理
// 其進行Base64編碼處理
byte[] data = null;
// 讀取圖片位元組陣列
try {
InputStream in = new FileInputStream(imageFile);
data = new byte[in.available()];
in.read(data);
in.close();
} catch (Exception e) {
e.printStackTrace();
}
// 對位元組陣列Base64編碼
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(data);// 返回Base64編碼過的位元組陣列字串
}
}
4.文字識別
package com.project.dom;
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import com.alibaba.fastjson.JSONObject;
/**
*
* @版權 : Copyright (c) 2017-2018 *********公司技術開發部
* @author: wubin
* @E-mail: [email protected]
* @版本: 1.0
* @建立日期: 2018年9月8日 上午8:40:34
* @ClassName PictureUtil
* @類描述-Description: TODO(這裡用一句話描述這個方法的作用)
* @修改記錄:
* @版本: 1.0
*/
public class PictureUtil {
public static String request(String httpUrl, String httpArg) {
BufferedReader reader = null;
String result = null;
StringBuffer sbf = new StringBuffer();
try {
// 用java JDK自帶的URL去請求
URL url = new URL(httpUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// 設定該請求的訊息頭
// 設定HTTP方法:POST
connection.setRequestMethod("POST");
// 設定其Header的Content-Type引數為application/x-www-form-urlencoded
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
// 填入apikey到HTTP header
connection.setRequestProperty("apikey", "uml8HFzu2hFd8iEG2LkQGMxm");
// 將第二步獲取到的token填入到HTTP header
connection.setRequestProperty("access_token", baiduOcr.getAuth());
connection.setDoOutput(true);
connection.getOutputStream().write(httpArg.getBytes("UTF-8"));
connection.connect();
InputStream is = connection.getInputStream();
reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
String strRead = null;
while ((strRead = reader.readLine()) != null) {
sbf.append(strRead);
sbf.append("\r\n");
}
reader.close();
result = sbf.toString();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
// 把json格式轉換成HashMap
public static HashMap<String, String> getHashMapByJson(String jsonResult) {
HashMap map = new HashMap<String, String>();
try {
JSONObject jsonObject = JSONObject.parseObject(jsonResult.toString());
JSONObject words_result = jsonObject.getJSONObject("words_result");
Iterator<String> it = words_result.keySet().iterator();
while (it.hasNext()) {
String key = it.next();
JSONObject result = words_result.getJSONObject(key);
String value = result.getString("words");
switch (key) {
case "姓名":
map.put("name", value);
break;
case "民族":
map.put("nation", value);
break;
case "住址":
map.put("address", value);
break;
case "公民身份號碼":
map.put("IDCard", value);
break;
case "出生":
map.put("Birth", value);
break;
case "性別":
map.put("sex", value);
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}
return map;
}
public static void main(String[] args) {
// 獲取本地的絕對路徑圖片
File file = new File("D:\\photo\\1.png");
// 進行BASE64位編碼
String imageBase = BASE64.encodeImgageToBase64(file);
imageBase = imageBase.replaceAll("\r\n", "");
imageBase = imageBase.replaceAll("\\+", "%2B");
// 百度雲的文字識別介面,後面引數為獲取到的token
String httpUrl = "https://aip.baidubce.com/rest/2.0/ocr/v1/idcard?access_token=" + baiduOcr.getAuth();
String httpArg = "detect_direction=true&id_card_side=front&image=" + imageBase;
String jsonResult = request(httpUrl, httpArg);
System.out.println("返回的結果--------->" + jsonResult);
HashMap<String, String> map = getHashMapByJson(jsonResult);
Collection<String> values = map.values();
Iterator<String> iterator2 = values.iterator();
while (iterator2.hasNext()) {
System.out.print(iterator2.next() + ", ");
}
}
}
其中HttpArg中的請求引數我就直接把官網上的弄了下來
引數 | 是否必選 | 型別 | 可選值範圍 | 說明 |
detect_direction | false | string | true、false | 是否檢測影象旋轉角度,預設不檢測,即:false。朝向是指輸入影象是正常方向、逆時針旋轉90/180/270度。可選值包括: - true:檢測旋轉角度並矯正識別; - false:不檢測旋轉角度,針對擺放情況不可控制的情況建議本引數置為true。 |
id_card_side | true | string | front、back | front:身份證含照片的一面;back:身份證帶國徽的一面 |
image | true | string | 影象資料,base64編碼後進行urlencode,要求base64編碼和urlencode後大小不超過4M,最短邊至少15px,最長邊最大4096px,支援jpg/png/bmp格式 | |
detect_risk | false | string | true、false | 是否開啟身份證風險型別(身份證影印件、臨時身份證、身份證翻拍、修改過的身份證)功能,預設不開啟,即:false。可選值:true-開啟;false-不開啟 |
身份證的文字識別程式碼就差不多都寫完了,我把身份證附上(百度官網上弄下來的測試身份證)
讓我們來執行看下效果吧
{
"log_id": 6403608607836186924,
"words_result_num": 6,
"direction": 0,
"image_status": "normal",
"words_result": {
"住址": {
"location": {
"width": 197,
"top": 150,
"height": 37,
"left": 78
},
"words": "北京市海淀區上地十號七棟2單元110室"
},
"出生": {
"location": {
"width": 148,
"top": 111,
"height": 15,
"left": 79
},
"words": "19890601"
},
"姓名": {
"location": {
"width": 63,
"top": 32,
"height": 25,
"left": 77
},
"words": "百度熊"
},
"公民身份號碼": {
"location": {
"width": 252,
"top": 243,
"height": 15,
"left": 139
},
"words": "532101198906010015"
},
"性別": {
"location": {
"width": 20,
"top": 76,
"height": 15,
"left": 71
},
"words": "男"
},
"民族": {
"location": {
"width": 12,
"top": 76,
"height": 15,
"left": 172
},
"words": "漢"
}
}
}
其中main方法的map列印為:北京市海淀區上地十號七棟2單元110室, 532101198906010015, 漢, 男, 百度熊, 19890601
如果有遇到不懂或者有問題時,可以掃描下方二維碼,歡迎進群交流與分享,希望能夠跟大家交流學習!
相關推薦
基於百度API,實現圖片文字識別功能(Java版)
1、登入百度AI開放平臺 (1)在頂部導航欄中,找到控制檯選項,並選擇文字識別功能,進入管理中心頁面 (2)在管理中心頁面中,找到建立應用按鈕並點選 (3)填寫應用名名稱和應用描述,選擇相應的應用型別,勾選自己需要的介面服
借助百度OCR,實現一鍵識別圖片中文字,就是這麽酷!
mage src 百度 文字 身份證 公眾 分享圖片 目前 增加 轉眼已是淩晨兩點,還好通過java根據百度提供的OCR接口,實現了一個有趣的小應用:一鍵識別圖片中文字 經過一個小時的反復測試,沒想到識別確實很高,而且,居然還可以識別稍微復雜的驗證碼 比如: 主要為了
Android定位&地圖&導航——基於百度地圖,實現自定義圖示繪製並點選時彈出泡泡
public class MainActivity extends Activity { private EditText txtAddr; // 定位相關 LocationClient mLocClient; LocationData locData = nul
Python微信小程式,實現自動回覆等功能(itchat模組)
本文是使用Python的itchat模組進行微信私聊訊息以及群訊息的自動回覆功能,必須在自己的微信中新增微訊號xiaoice-ms(微軟的微信機器人)才能實現,直接複製程式碼執行之後掃一掃二維碼即可,經過測試,該程式能夠保持幾小時的時間。實現原理,將別人傳送給你的訊息轉發給A
基於PCA的人臉識別系統(JAVA版)(三) 系統實現
系統主要由上圖幾部分組成。其中EigenFaceCore為特徵臉類,faceMain為主程式,ImageViewer為顯示圖片的工具類。如果根據第一篇博文環境都已經配置好的話則程式可以完美執行。J
Spark自定義累加器的實現需要注意的細節(java版)
可以參考下面博文 !!!!!! 需要注意的是 ,原始碼中給出 也就是說兩個方法的實現是不一樣的。 下面是我的實現 import constant.Constants; import org.apache.spark.AccumulatorParam;
Selenium實現元素的拖拽(java版)
【前言】 自從淘寶網登陸頁出現滑塊驗證,很多其他網站也在模仿這個滑塊驗證,在防止機器人惡意註冊方面確實起到一定的作用。 【關於滑塊的原理】: 響應時間,拖拽速度,時間
ChainDesk : 手把手教你實現簡易比特幣(Java版)
ChainDesk : 手把手教你實現簡易比特幣(Java版) 第一章:初識比特幣與區塊鏈 http://chaindesk.cn/columninfo.html?id=26&dirId=4=20190108meiti 第二章:密碼學hash函式
基於PCA的人臉識別系統(JAVA版)(一) OpenCV在JAVA上的環境配置
這裡用的JDK 1.8和OpenCV3.2.0版本。後面會重點提到OpenCV的安裝配置和OpenCV在JAVA上的配置。 1.OpenCV的安裝配置 (1)下載安裝
Java-基於百度API的圖片文字識別(支援中文,英文和中英文混合)
PS: 基於Java 1.8 版本控制:maven 使用之前需要獲取對應的專案API_KEY,SECRET_KEY,這些引數在使用API的時候必須用到,
Java-基於百度API的圖片文字識別(支援中文,英文和中英文混合)貨運APP開發找上海捌躍網路科技有限公司
PS: 基於Java 1.8 版本控制:maven 使用之前需要獲取對應的專案API_KEY,SECRET_KEY,這些引數在使用API的時候必須用到,用於生成access_token。 如何獲取這些引數:在百度開發者中心申請一個“通用文字識別”專案,然後就可
Java基於百度API的圖片文字識別
使用之前需要獲取對應的專案API_KEY,SECRET_KEY,這些引數在使用API的時候必須用到,用於生成access_token。 如何獲取這些引數:在百度開發者中心申請一個“通用文字識別”專案,然後就可以獲取到這些引數。 1、pom檔案 <?xml v
呼叫百度AI開放平臺實現圖片文字識別
閒話少說: 註冊百度賬號,獲取APP_ID,API_KEY,SECRECT_KEY 檢視SDK,下面是我呼叫識別圖片 import os import csv from aip import AipO
百度地圖熱力圖--批量地址轉換應用(基於百度api)
ldp item keyvalue 使用 創建地圖 ebr efault amp ont 需求:把外賣訂餐地址做個用戶分布熱力圖 思路分析:第一步去百度地圖api開放平臺找例子 http://lbsyun.baidu.com/jsdemo.htm#c1_15 首
C#呼叫百度api,根據經度和緯度獲取地理位置資訊
/// <summary> /// 百度api 根據經緯度獲取地理位置 /// </summary> /// <param name="lng">經度</param&g
基於Eclipse下的 tesseract -OCR實現圖片文字識別過程簡單介紹
前言:最近忙於考研複習,好久沒有敲程式碼了,本人目前只是學生,寫部落格的目的只是為了記錄自己的學習過程,當然,如果能為他人提供一些幫助,那更好了。 一.Tesseract 簡介 Tesseract 是Ray Smith 在1985 - 1995年間在惠普布里斯托實驗室開發的一個ocr引擎(O
JS呼叫百度api介面——實現簡單的百度頁面
描述: JS呼叫百度api介面——實現簡單的百度頁面 效果: 實現: css檔案: @charset "utf-8"; /* CSS Document */ *{ margin: 0; padding: 0; list-style: none;
初探機器學習之使用百度AI服務實現圖片識別與相似圖片
一、百度雲AI服務 最近在調研一些雲服務平臺的AI(人工智慧)服務,瞭解了一下阿里雲、騰訊雲和百度雲。其中,百度雲提供了影象識別及影象搜尋,而且還細分地提供了相似圖片這項服務,比較符合我的需求,且百度雲提供了每日10000次入庫和500次檢索的免費次數,使得我可以更快地試用,且沒有任何花費。更為重要的是
利用百度地圖,實現移動端附近門店功能
2、建立應用 3、檢視建立應用的AK 4、進入 資料管理 建立資料表,並記錄表編號,欄位裡可增加自己想要的欄位,資料裡可標註自己需要的地址,並錄入資訊。 是否釋出到檢索項,是決定介面能不能搜尋到資料的總開關!!! 其中,資料標註項中,標籤欄,為分組檢索的依據,可以把
基於Tesseract實現圖片文字識別
一.簡介 Tesseract是一個開源的文字識別【OCR】引擎,可通過Apache 2.0許可獲得。它可以直接使用,或者使用API從影象中提取列印的文字,支援多種語言。該軟體包包含一個ORC引擎【libtesseract】和一個命令列程式【tesseract】。Tesseract4添加了一個新