就目前來講,騰訊雲的圖片識別功能相對來講還是比較穩定,識別率還算可以(本人嘗試,並沒有官方說的90%那麼高,70~80%我覺的是比較真實)。
之前,我們需要開發一個協助用戶輸入身份信息(駕駛證、行駛證等),所以只需要將行駛證駕駛上傳進行識別,來減少用戶的輸入量。
因爲之前,沒有用過騰訊雲的識別功能,所以還是遇到了一些問題。下面我來詳細的說一下,關鍵的幾步問題。
生成sign
這一步是十分重要的,也是必須的。開發過android的應該都知道,使用第三方的SDK,正常情況下,都需要去創建對應的簽名,這個是唯一的。參考官網,一共有兩種方式來生成(一種是後臺的,用php方式來生成;一種是客戶端自己的,用android來生成)。我是用了android方式的生成方式,直接將這幾個方法copy到一個activity裏面,直接運行,打logo顯示出來。
import android.util.Base64;
import java.util.Random;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
public class Sign {
/**
* 生成Authorization簽名字段
*
* @param appId
* @param secretId
* @param secretKey
* @param bucketName
* @param expired
* @return
* @throws Exception
*/
public static String appSign(long appId, String secretId, String secretKey, String bucketName,
long expired) throws Exception {
long now = System.currentTimeMillis() / 1000;
int rdm = Math.abs(new Random().nextInt());
String plainText = String.format("a=%d&b=%s&k=%s&t=%d&e=%d&r=%d&f=img", appId, bucketName,
secretId, now, now + expired, rdm);
byte[] hmacDigest = HmacSha1(plainText, secretKey);
byte[] signContent = new byte[hmacDigest.length + plainText.getBytes().length];
System.arraycopy(hmacDigest, 0, signContent, 0, hmacDigest.length);
System.arraycopy(plainText.getBytes(), 0, signContent, hmacDigest.length,
plainText.getBytes().length);
return Base64Encode(signContent);
}
/**
* 生成base64編碼
*
* @param binaryData
* @return
*/
public static String Base64Encode(byte[] binaryData) {
// String encodedstr = Base64.getEncoder().encodeToString(binaryData);
// String encodedstr = Base64.encode().encodeToString(binaryData);
String encodedstr=Base64.encodeToString(binaryData,Base64.DEFAULT);
return encodedstr;
}
/**
* 生成hmacsha1簽名
*
* @param binaryData
* @param key
* @return
* @throws Exception
*/
public static byte[] HmacSha1(byte[] binaryData, String key) throws Exception {
Mac mac = Mac.getInstance("HmacSHA1");
SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), "HmacSHA1");
mac.init(secretKey);
byte[] HmacSha1Digest = mac.doFinal(binaryData);
return HmacSha1Digest;
}
/**
* 生成hmacsha1簽名
*
* @param plainText
* @param key
* @return
* @throws Exception
*/
public static byte[] HmacSha1(String plainText, String key) throws Exception {
return HmacSha1(plainText.getBytes(), key);
}
}
上傳圖片
騰訊雲是根據用戶上傳的圖片來進行識別的,所以我們必須要將自己的圖片上傳。appid這個是必須的,我們自己在百度雲裏面創建的,如果不知道怎麼創建,直接在百度中搜索(如何創建百度雲appId);bucket開始我沒有創建,直接隨便傳了一個字符串,依然可以使用,我也比較懵逼(不過最好還是使用自己創建的,如果不知道最好還是自己創建一個)。上傳方式,就是大家都知道的那種方式,’Content-Type’: ’ multipart/form-data’。
//圖片識別(駕駛證行駛證,type: 0---行駛證,1---駕駛證)
static async recognizeImg(img, type) {
let params = {appid: '1256184939', bucket: 'cloudhome-1256184939', type: type || 0};
try {
let formData = new FormData();
for (let key in params) {
formData.append(key, params[key]);
}
let file = {uri: img, type: 'multipart/form-data', name: 'test.jpg'};
formData.append('image', file);
let response = await fetch('http://recognition.image.myqcloud.com/ocr/drivinglicence', {
method: 'POST',
headers: {
'Host': 'recognition.image.myqcloud.com',
'Content-Type': ' multipart/form-data',
'Content-Length': 350,
'Authorization': sign
},
body: formData,
});
let responseJson = await response.json();
let result = JSON.parse(JSON.stringify(responseJson));
return {result: result, json: responseJson, resp: response,};
} catch (error) {
toastShort('網絡不給力');
}
}
注意
出問題基本上都是自己的sign不對,如果自己是在沒辦法判斷問題在哪兒,可以提工單給百度雲工作人員,我就經常騷然他們,感覺還是挺耐心幫咱們解決的。要是感覺我還挺靠譜的,歡迎加QQ:357076659。