1. 程式人生 > >基於百度API,實現圖片文字識別功能(Java版)

基於百度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添加了一個新