基于百度云的身份证识别
转载出自:ziyejinwei1994基于百度云的身份证识别
最近公司需要用户上传身份证照片来获取用户的信息,刚开始可愁死我了,满世界的去找demo,没想到还真找到一个,然后发现识别的是啥玩意啊。然后无意中发现好多第三方,然后经过对比我还是选择了百度,因为每日500次免费哈哈。
废话不多说,开始正文。
首先还是要进入百度ai开放平台(http://ai.baidu.com/),登录以后我们要进入下图所示的控制台
然后我们要找的身份证识别是在文字识别里面,点击进入
接下来就是创建自己的应用了
里面安装提示的填就行了,唯一一点要注意的是本文采取的是授权第二种方式,所以下面那个一定要勾选
搞定了以后记得要下载
需要注意的是:
- 在官网下载Android SDK压缩包。
- (必须)将下载包libs目录中的ocr-sdk.jar文件拷贝到工程libs目录中,并加入工程依赖。
-
(必须)将libs目录下armeabi,arm64-v8a,armeabi-v7a,x86文件夹按需添加到android studio工程
src/main/jniLibs
目录中, eclipse用户默认为libs目录。
从现在开始准备工作就已经做完了,下面我们来进行本文的重头戏。
上面说了我们采取的授权是第二种方式也就是:
-
将授权文件添加至工程assets文件夹,文件名必须为
aip.license
-
调用initAccessToken方法,初始化OCR单例:
- OCR.getInstance().initAccessToken(new OnResultListener<AccessToken>() {
- @Override
- public void onResult(AccessToken result) {
- // 调用成功,返回AccessToken对象
- String token = result.getAccessToken();
- }
- @Override
- public void onError(OCRError error) {
- // 调用失败,返回OCRError子类SDKError对象
- }
- }, getApplicationContext());
OCR.getInstance().initAccessToken(new OnResultListener<AccessToken>() { @Override public void onResult(AccessToken result) { // 调用成功,返回AccessToken对象 String token = result.getAccessToken(); } @Override public void onError(OCRError error) { // 调用失败,返回OCRError子类SDKError对象 } }, getApplicationContext());
百度云还给提供了一套UI ,不过我就不在这里介绍了因为我没有用,根据他的demo可以很好的进行实现。
我是自己调用了系统的拍照和剪裁,剪裁完毕以后就保存在了手机里面。
- private void recIDCard( String filePath) {
- IDCardParams param = new IDCardParams();
- param.setImageFile(new File(filePath));
- // 设置身份证正反面
- param.setIdCardSide(”front”);
- // 设置方向检测
- param.setDetectDirection(true);
- // 设置图像参数压缩质量0-100, 越大图像质量越好但是请求时间越长。 不设置则默认值为20
- param.setImageQuality(100);
- OCR.getInstance().recognizeIDCard(param, new OnResultListener<IDCardResult>() {
- @Override
- public void onResult(IDCardResult result) {
- if (result != null) {
- LLogUtils.i(result.getJsonRes());
- try {
- perJson0(result.getJsonRes());
- } catch (JSONException e) {
- e.printStackTrace();
- }
- }
- }
- @Override
- public void onError(OCRError error) {
- LLogUtils.i(error.toString());
- ToastUtil.show(”扫描识别失败,请重新拍照上传”);
- }
- });
- }
private void recIDCard( String filePath) {
IDCardParams param = new IDCardParams();
param.setImageFile(new File(filePath));
// 设置身份证正反面
param.setIdCardSide("front");
// 设置方向检测
param.setDetectDirection(true);
// 设置图像参数压缩质量0-100, 越大图像质量越好但是请求时间越长。 不设置则默认值为20
param.setImageQuality(100);
OCR.getInstance().recognizeIDCard(param, new OnResultListener<IDCardResult>() {
@Override
public void onResult(IDCardResult result) {
if (result != null) {
LLogUtils.i(result.getJsonRes());
try {
perJson0(result.getJsonRes());
} catch (JSONException e) {
e.printStackTrace();
}
}
}
@Override
public void onError(OCRError error) {
LLogUtils.i(error.toString());
ToastUtil.show("扫描识别失败,请重新拍照上传");
}
});
}
这个就是实现的方法传入的参数是你图片存的地址。
下面是我手动解析的json串,吐槽下竟然用的汉字做key感觉真不习惯。
- private void perJson0(String jsonRes) throws JSONException {
- JSONObject jsonObject=new JSONObject(jsonRes);
- JSONObject jsonObject1=jsonObject.optJSONObject(”words_result”);
- String name=jsonObject1.optJSONObject(”姓名”).optString(“words”);
- CacheUtil.save(”name”,name);
- String sex=jsonObject1.optJSONObject(”性别”).optString(“words”);
- if (“男”.equals(sex)){
- CacheUtil.save(”xingbie”,“1”);
- }else if (“女”.equals(sex)){
- CacheUtil.save(”xingbie”,“2”);
- }else {
- CacheUtil.save(”xingbie”,“0”);
- }
- String minzu=jsonObject1.optJSONObject(”民族”).optString(“words”);
- CacheUtil.save(”minzu”,minzu);
- String shenfen=jsonObject1.optJSONObject(”公民身份号码”).optString(“words”);
- CacheUtil.save(”shenfen”,shenfen);
- }
private void perJson0(String jsonRes) throws JSONException {
JSONObject jsonObject=new JSONObject(jsonRes);
JSONObject jsonObject1=jsonObject.optJSONObject("words_result");
String name=jsonObject1.optJSONObject("姓名").optString("words");
CacheUtil.save("name",name);
String sex=jsonObject1.optJSONObject("性别").optString("words");
if ("男".equals(sex)){
CacheUtil.save("xingbie","1");
}else if ("女".equals(sex)){
CacheUtil.save("xingbie","2");
}else {
CacheUtil.save("xingbie","0");
}
String minzu=jsonObject1.optJSONObject("民族").optString("words");
CacheUtil.save("minzu",minzu);
String shenfen=jsonObject1.optJSONObject("公民身份号码").optString("words");
CacheUtil.save("shenfen",shenfen);
}
因为身份证信息比较敏感就不放演示图片了,希望看完以后对你有所帮助!
最近公司需要用户上传身份证照片来获取用户的信息,刚开始可愁死我了,满世界的去找demo,没想到还真找到一个,然后发现识别的是啥玩意啊。然后无意中发现好多第三方,然后经过对比我还是选择了百度,因为每日500次免费哈哈。
废话不多说,开始正文。
首先还是要进入百度ai开放平台(http://ai.baidu.com/),登录以后我们要进入下图所示的控制台
然后我们要找的身份证识别是在文字识别里面,点击进入
接下来就是创建自己的应用了
里面安装提示的填就行了,唯一一点要注意的是本文采取的是授权第二种方式,所以下面那个一定要勾选
搞定了以后记得要下载
需要注意的是:
- 在官网下载Android SDK压缩包。
- (必须)将下载包libs目录中的ocr-sdk.jar文件拷贝到工程libs目录中,并加入工程依赖。
-
(必须)将libs目录下armeabi,arm64-v8a,armeabi-v7a,x86文件夹按需添加到android studio工程
src/main/jniLibs
目录中, eclipse用户默认为libs目录。
从现在开始准备工作就已经做完了,下面我们来进行本文的重头戏。
上面说了我们采取的授权是第二种方式也就是:
-
将授权文件添加至工程assets文件夹,文件名必须为
aip.license
-
调用initAccessToken方法,初始化OCR单例:
- OCR.getInstance().initAccessToken(new OnResultListener<AccessToken>() {
- @Override
- public void onResult(AccessToken result) {
- // 调用成功,返回AccessToken对象
- String token = result.getAccessToken();
- }
- @Override
- public void onError(OCRError error) {
- // 调用失败,返回OCRError子类SDKError对象
- }
- }, getApplicationContext());
OCR.getInstance().initAccessToken(new OnResultListener<AccessToken>() { @Override public void onResult(AccessToken result) { // 调用成功,返回AccessToken对象 String token = result.getAccessToken(); } @Override public void onError(OCRError error) { // 调用失败,返回OCRError子类SDKError对象 } }, getApplicationContext());
百度云还给提供了一套UI ,不过我就不在这里介绍了因为我没有用,根据他的demo可以很好的进行实现。
我是自己调用了系统的拍照和剪裁,剪裁完毕以后就保存在了手机里面。
- private void recIDCard( String filePath) {
- IDCardParams param = new IDCardParams();
- param.setImageFile(new File(filePath));
- // 设置身份证正反面
- param.setIdCardSide(”front”);
- // 设置方向检测
- param.setDetectDirection(true);
- // 设置图像参数压缩质量0-100, 越大图像质量越好但是请求时间越长。 不设置则默认值为20
- param.setImageQuality(100);
- OCR.getInstance().recognizeIDCard(param, new OnResultListener<IDCardResult>() {
- @Override
- public void onResult(IDCardResult result) {
- if (result != null) {
- LLogUtils.i(result.getJsonRes());
- try {
- perJson0(result.getJsonRes());
- } catch (JSONException e) {
- e.printStackTrace();
- }
- }
- }
- @Override
- public void onError(OCRError error) {
- LLogUtils.i(error.toString());
- ToastUtil.show(”扫描识别失败,请重新拍照上传”);
- }
- });
- }
private void recIDCard( String filePath) {
IDCardParams param = new IDCardParams();
param.setImageFile(new File(filePath));
// 设置身份证正反面
param.setIdCardSide("front");
// 设置方向检测
param.setDetectDirection(true);
// 设置图像参数压缩质量0-100, 越大图像质量越好但是请求时间越长。 不设置则默认值为20
param.setImageQuality(100);
OCR.getInstance().recognizeIDCard(param, new OnResultListener<IDCardResult>() {
@Override
public void onResult(IDCardResult result) {
if (result != null) {
LLogUtils.i(result.getJsonRes());
try {
perJson0(result.getJsonRes());
} catch (JSONException e) {
e.printStackTrace();
}
}
}
@Override
public void onError(OCRError error) {
LLogUtils.i(error.toString());
ToastUtil.show("扫描识别失败,请重新拍照上传");
}
});
}
这个就是实现的方法传入的参数是你图片存的地址。
下面是我手动解析的json串,吐槽下竟然用的汉字做key感觉真不习惯。
- private void perJson0(String jsonRes) throws JSONException {
- JSONObject jsonObject=new JSONObject(jsonRes);
- JSONObject jsonObject1=jsonObject.optJSONObject(”words_result”);
- String name=jsonObject1.optJSONObject(”姓名”).optString(“words”);
- CacheUtil.save(”name”,name);
- String sex=jsonObject1.optJSONObject(”性别”).optString(“words”);
- if (“男”.equals(sex)){
- CacheUtil.save(”xingbie”,“1”);
- }else if (“女”.equals(sex)){
- CacheUtil.save(”xingbie”,“2”);
- }else {
- CacheUtil.save(”xingbie”,“0”);
- }
- String minzu=jsonObject1.optJSONObject(”民族”).optString(“words”);
- CacheUtil.save(”minzu”,minzu);
- String shenfen=jsonObject1.optJSONObject(”公民身份号码”).optString(“words”);
- CacheUtil.save(”shenfen”,shenfen);
- }
private void perJson0(String jsonRes) throws JSONException {
JSONObject jsonObject=new JSONObject(jsonRes);
JSONObject jsonObject1=jsonObject.optJSONObject("words_result");
String name=jsonObject1.optJSONObject("姓名").optString("words");
CacheUtil.save("name",name);
String sex=jsonObject1.optJSONObject("性别").optString("words");
if ("男".equals(sex)){
CacheUtil.save("xingbie","1");
}else if ("女".equals(sex)){
CacheUtil.save("xingbie","2");
}else {
CacheUtil.save("xingbie","0");
}
String minzu=jsonObject1.optJSONObject("民族").optString("words");
CacheUtil.save("minzu",minzu);
String shenfen=jsonObject1.optJSONObject("公民身份号码").optString("words");
CacheUtil.save("shenfen",shenfen);
}
因为身份证信息比较敏感就不放演示图片了,希望看完以后对你有所帮助!