使用腾讯云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。

你可能感兴趣的:(react)