使用騰訊雲OCR文字識別

就目前來講,騰訊雲的圖片識別功能相對來講還是比較穩定,識別率還算可以(本人嘗試,並沒有官方說的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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章