就目前来讲,腾讯云的图片识别功能相对来讲还是比较稳定,识别率还算可以(本人尝试,并没有官方说的90%那么高,70~80%我觉的是比较真实)。
之前,我们需要开发一个协助用户输入身份信息(驾驶证、行驶证等),所以只需要将行驶证驾驶上传进行识别,来减少用户的输入量。
因为之前,没有用过腾讯云的识别功能,所以还是遇到了一些问题。下面我来详细的说一下,关键的几步问题。
这一步是十分重要的,也是必须的。开发过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。