欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

基于百度云的身份证识别

程序员文章站 2024-03-16 10:10:22
...

基于百度云的身份证识别

转载出自:ziyejinwei1994基于百度云的身份证识别

  最近公司需要用户上传身份证照片来获取用户的信息,刚开始可愁死我了,满世界的去找demo,没想到还真找到一个,然后发现识别的是啥玩意啊。然后无意中发现好多第三方,然后经过对比我还是选择了百度,因为每日500次免费哈哈。

  废话不多说,开始正文。

首先还是要进入百度ai开放平台(http://ai.baidu.com/),登录以后我们要进入下图所示的控制台基于百度云的身份证识别

然后我们要找的身份证识别是在文字识别里面,点击进入基于百度云的身份证识别

接下来就是创建自己的应用了基于百度云的身份证识别

里面安装提示的填就行了,唯一一点要注意的是本文采取的是授权第二种方式,所以下面那个一定要勾选基于百度云的身份证识别

搞定了以后记得要下载基于百度云的身份证识别

需要注意的是:

  1. 在官网下载Android SDK压缩包。
  1. (必须)将下载包libs目录中的ocr-sdk.jar文件拷贝到工程libs目录中,并加入工程依赖。
  1. (必须)将libs目录下armeabi,arm64-v8a,armeabi-v7a,x86文件夹按需添加到android studio工程src/main/jniLibs目录中, eclipse用户默认为libs目录。

从现在开始准备工作就已经做完了,下面我们来进行本文的重头戏。

上面说了我们采取的授权是第二种方式也就是:

  1. 将授权文件添加至工程assets文件夹,文件名必须为aip.license
  2. 调用initAccessToken方法,初始化OCR单例:
    1. OCR.getInstance().initAccessToken(new OnResultListener<AccessToken>() {  
    2.         @Override  
    3.         public void onResult(AccessToken result) {  
    4.             // 调用成功,返回AccessToken对象  
    5.             String token = result.getAccessToken();  
    6.         }  
    7.         @Override  
    8.         public void onError(OCRError error) {  
    9.             // 调用失败,返回OCRError子类SDKError对象  
    10.         }  
    11. }, 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());

还有一点千万要注意的是 getApplicationContext() 这个参数 一定要换成自己的,不然怎么都获取不了token,前车之鉴啊,翻来覆去的检查代码结果发现这个没有换,愚蠢的博主….

百度云还给提供了一套UI ,不过我就不在这里介绍了因为我没有用,根据他的demo可以很好的进行实现。

我是自己调用了系统的拍照和剪裁,剪裁完毕以后就保存在了手机里面。

  1. private void recIDCard( String filePath) {  
  2.    IDCardParams param = new IDCardParams();  
  3.    param.setImageFile(new File(filePath));  
  4.    // 设置身份证正反面  
  5.    param.setIdCardSide(”front”);  
  6.    // 设置方向检测  
  7.    param.setDetectDirection(true);  
  8.    // 设置图像参数压缩质量0-100, 越大图像质量越好但是请求时间越长。 不设置则默认值为20  
  9.    param.setImageQuality(100);  
  10.    OCR.getInstance().recognizeIDCard(param, new OnResultListener<IDCardResult>() {  
  11.      @Override  
  12.      public void onResult(IDCardResult result) {  
  13.        if (result != null) {  
  14.          LLogUtils.i(result.getJsonRes());  
  15.          try {  
  16.            perJson0(result.getJsonRes());  
  17.          } catch (JSONException e) {  
  18.            e.printStackTrace();  
  19.          }  
  20.        }  
  21.      }  
  22.   
  23.      @Override  
  24.      public void onError(OCRError error) {  
  25.        LLogUtils.i(error.toString());  
  26.      ToastUtil.show(”扫描识别失败,请重新拍照上传”);  
  27.      }  
  28.    });  
  29.  }  
 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感觉真不习惯。

  1. private void perJson0(String jsonRes) throws JSONException {  
  2.   JSONObject jsonObject=new JSONObject(jsonRes);  
  3.   JSONObject jsonObject1=jsonObject.optJSONObject(”words_result”);  
  4.   String name=jsonObject1.optJSONObject(”姓名”).optString(“words”);  
  5.   CacheUtil.save(”name”,name);  
  6.   String sex=jsonObject1.optJSONObject(”性别”).optString(“words”);  
  7.   if (“男”.equals(sex)){  
  8.     CacheUtil.save(”xingbie”,“1”);  
  9.   }else if (“女”.equals(sex)){  
  10.     CacheUtil.save(”xingbie”,“2”);  
  11.   }else {  
  12.     CacheUtil.save(”xingbie”,“0”);  
  13.   }  
  14.   String minzu=jsonObject1.optJSONObject(”民族”).optString(“words”);  
  15.   CacheUtil.save(”minzu”,minzu);  
  16.   String shenfen=jsonObject1.optJSONObject(”公民身份号码”).optString(“words”);  
  17.   CacheUtil.save(”shenfen”,shenfen);  
  18.   
  19.   
  20. }  
  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/),登录以后我们要进入下图所示的控制台基于百度云的身份证识别

然后我们要找的身份证识别是在文字识别里面,点击进入基于百度云的身份证识别

接下来就是创建自己的应用了基于百度云的身份证识别

里面安装提示的填就行了,唯一一点要注意的是本文采取的是授权第二种方式,所以下面那个一定要勾选基于百度云的身份证识别

搞定了以后记得要下载基于百度云的身份证识别

需要注意的是:

  1. 在官网下载Android SDK压缩包。
  1. (必须)将下载包libs目录中的ocr-sdk.jar文件拷贝到工程libs目录中,并加入工程依赖。
  1. (必须)将libs目录下armeabi,arm64-v8a,armeabi-v7a,x86文件夹按需添加到android studio工程src/main/jniLibs目录中, eclipse用户默认为libs目录。

从现在开始准备工作就已经做完了,下面我们来进行本文的重头戏。

上面说了我们采取的授权是第二种方式也就是:

  1. 将授权文件添加至工程assets文件夹,文件名必须为aip.license
  2. 调用initAccessToken方法,初始化OCR单例:
    1. OCR.getInstance().initAccessToken(new OnResultListener<AccessToken>() {  
    2.         @Override  
    3.         public void onResult(AccessToken result) {  
    4.             // 调用成功,返回AccessToken对象  
    5.             String token = result.getAccessToken();  
    6.         }  
    7.         @Override  
    8.         public void onError(OCRError error) {  
    9.             // 调用失败,返回OCRError子类SDKError对象  
    10.         }  
    11. }, 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());

还有一点千万要注意的是 getApplicationContext() 这个参数 一定要换成自己的,不然怎么都获取不了token,前车之鉴啊,翻来覆去的检查代码结果发现这个没有换,愚蠢的博主….

百度云还给提供了一套UI ,不过我就不在这里介绍了因为我没有用,根据他的demo可以很好的进行实现。

我是自己调用了系统的拍照和剪裁,剪裁完毕以后就保存在了手机里面。

  1. private void recIDCard( String filePath) {  
  2.    IDCardParams param = new IDCardParams();  
  3.    param.setImageFile(new File(filePath));  
  4.    // 设置身份证正反面  
  5.    param.setIdCardSide(”front”);  
  6.    // 设置方向检测  
  7.    param.setDetectDirection(true);  
  8.    // 设置图像参数压缩质量0-100, 越大图像质量越好但是请求时间越长。 不设置则默认值为20  
  9.    param.setImageQuality(100);  
  10.    OCR.getInstance().recognizeIDCard(param, new OnResultListener<IDCardResult>() {  
  11.      @Override  
  12.      public void onResult(IDCardResult result) {  
  13.        if (result != null) {  
  14.          LLogUtils.i(result.getJsonRes());  
  15.          try {  
  16.            perJson0(result.getJsonRes());  
  17.          } catch (JSONException e) {  
  18.            e.printStackTrace();  
  19.          }  
  20.        }  
  21.      }  
  22.   
  23.      @Override  
  24.      public void onError(OCRError error) {  
  25.        LLogUtils.i(error.toString());  
  26.      ToastUtil.show(”扫描识别失败,请重新拍照上传”);  
  27.      }  
  28.    });  
  29.  }  
 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感觉真不习惯。

  1. private void perJson0(String jsonRes) throws JSONException {  
  2.   JSONObject jsonObject=new JSONObject(jsonRes);  
  3.   JSONObject jsonObject1=jsonObject.optJSONObject(”words_result”);  
  4.   String name=jsonObject1.optJSONObject(”姓名”).optString(“words”);  
  5.   CacheUtil.save(”name”,name);  
  6.   String sex=jsonObject1.optJSONObject(”性别”).optString(“words”);  
  7.   if (“男”.equals(sex)){  
  8.     CacheUtil.save(”xingbie”,“1”);  
  9.   }else if (“女”.equals(sex)){  
  10.     CacheUtil.save(”xingbie”,“2”);  
  11.   }else {  
  12.     CacheUtil.save(”xingbie”,“0”);  
  13.   }  
  14.   String minzu=jsonObject1.optJSONObject(”民族”).optString(“words”);  
  15.   CacheUtil.save(”minzu”,minzu);  
  16.   String shenfen=jsonObject1.optJSONObject(”公民身份号码”).optString(“words”);  
  17.   CacheUtil.save(”shenfen”,shenfen);  
  18.   
  19.   
  20. }  
  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);


  }




因为身份证信息比较敏感就不放演示图片了,希望看完以后对你有所帮助!