百度OCR识别图片

最近项目也是比较忙,好长时间没有写博客了,刚好腾出点空最近做项目的时候需要对身份证进行扫描识别身份证上面的信息,我采用的是百度的OCR识别技术
下面是对OCR识别的一些步骤和总结,分享一下踩过的坑和要注意的点,希望能帮助到一些需要的人。
百度OCR识别的官方文档 百度OCR技术文档,有兴趣的可以先去这篇文档看看
1.支持的系统和硬件版本
系统:支持 Android 4.0(API Level 15)到Android7.0(API Level 25)系统。通过设置build.gradle里面的minSdkVersion来保证支持系统

CPU架构:armeabi,arm64-v8a,armeabi-v7a,x86
机型:手机和平板皆可
2.sdk的包含的UI部分和demo工程以Android Studio方式提供,sdk部分则可以较方便的集成到eclipse工程中。首先我们要先把sdk集成到项目中去
  1. 前往SDK下载页面下载Android SDK压缩包。
  2.(必须)将下载包libs目录中的ocr-sdk.jar文件拷贝到工程libs目录中,并加入工程依赖。
  3. (必须)将libs目录下armeabi,arm64-v8a,armeabi-v7a,x86文件夹按需添加到android studio工程src/main/jniLibs目录中,            eclipse用户默认为libs目录。

4. (可选)如果需要使用UI模块,请在Android studio中以模块方式导入下载包中的ocr-ui文件夹。

注意:在做第3步的时候,不一定非要将libs目录下armeabi,arm64-v8a,armeabi-v7a,x86文件夹添加到android studio工程src/main/jniLibs目录中。要看你的项目引用的是jniLibs中的依赖还是libs文件夹中这个我当时按照官方文档上放置的时候,初始化token的时候一直失败,后来才发现项目的引用在libs文件夹中。坑啊!!!

3.AndroidManifest.xml文件中添加如下权限

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

注:权限说明
INTERNET  应用联网,发送请求数据至服务器,获得识别结果。
CAMERA    调用相机进行拍照(仅UI部分需要)
WRITE_EXTERNAL_STORAGE    图片裁剪临时存储
READ_EXTERNAL_STORAGE    图片裁剪临时存储

4.Proguard配置(非必须,看项目是否需要)

如果你为了安全性给你的项目加入了混淆,你需要在



 

-keep class com.baidu.ocr.sdk.**{*;}
-dontwarn com.baidu.ocr.**

百度AI开放平台使用OAuth2.0授权调用开放API,调用API时必须在URL中带上accesss_token参数。AccessToken可用AK/SK或者授权文件的方式获得。安卓SDK中已经做了封装,当初始化完毕后,所有API请求会自动带上accesss_token参数,你也可以通过initAccessTokenWithAkSk,initAccessToken这两个函数的回调中查看。

OCR Android SDK提供了以下2种AccessToken管理方法.

扫描二维码关注公众号,回复: 2559426 查看本文章

虽然SDK对网络传输的敏感数据进行了二次加密,但由于AK/SK是明文填写在代码中,在移动设备中可能会存在AK/SK被盗取的风险。有安全考虑的开发者可使用第二种授权方案。

第一种:

1.在管理控制台控制台中新建一个OCR应用,并且请填写正确的包名

2.在应用详情页面查看并复制应用的Api Key(简称AK) 和 Secret Key(简称SK),初始化OCR单例:

OCR.getInstance().initAccessTokenWithAkSk(new OnResultListener<AccessToken>() {
    @Override
    public void onResult(AccessToken result) {
        // 调用成功,返回AccessToken对象
        String token = result.getAccessToken();
    }
    @Override
    public void onError(OCRError error) {
        // 调用失败,返回OCRError子类SDKError对象
    }
}, getApplicationContext(), "您的应用AK", "您的应用SK");

第二种

授权文件(安全模式)

1.在应用详情页面下载对应应用的授权文件

2.调用initAccessToken方法,初始化OCR单例:

    /**
     * 自定义license的文件路径和文件名称,以license文件方式初始化
     */
    private void initAccessTokenLicenseFile() {
        OCR.getInstance(getApplication()).initAccessToken(new OnResultListener<AccessToken>() {
            @Override
            public void onResult(AccessToken accessToken) {
                String token = accessToken.getAccessToken();
                hasGotToken = true;
            }

            @Override
            public void onError(OCRError error) {
                error.printStackTrace();
                hasGotToken = false;
              

            }
        }, getApplication());
    }

3.判断是否初始化token成功

    //是否成功获取token 成功true 不成功false
    private boolean checkTokenStatus() {
        if (!hasGotToken) {
    //未成功
        }
        return hasGotToken;
    }

4.在需要调起扫描的地方调取相机扫描


                if (!checkTokenStatus()) {
                    return;
                }
                intent = new Intent(this, CameraActivity.class);
                intent.putExtra(CameraActivity.KEY_OUTPUT_FILE_PATH,
                        FileUtil.getSaveFile(getPageContext()).getAbsolutePath());
                intent.putExtra(CameraActivity.KEY_NATIVE_ENABLE,
                        true);
                // KEY_NATIVE_MANUAL设置了之后CameraActivity中不再自动初始化和释放模型
                // 请手动使用CameraNativeHelper初始化和释放模型
                // 推荐这样做,可以避免一些activity切换导致的不必要的异常
                intent.putExtra(CameraActivity.KEY_NATIVE_MANUAL,
                        true);
                intent.putExtra(CameraActivity.KEY_CONTENT_TYPE, 
                CameraActivity.CONTENT_TYPE_ID_CARD_FRONT);
                startActivityForResult(intent, REQUEST_CODE_CAMERA);

5.扫描成功的回调

6.调取接口

    /**
     * 调接口获取身份证数据
     *
     * @param idCardSide
     * @param filePath
     */
    private void recIDCard(String idCardSide, String filePath) {
     
        IDCardParams param = new IDCardParams();
        param.setImageFile(new File(filePath));
        // 设置身份证正反面
        param.setIdCardSide(idCardSide);
        // 设置方向检测
        param.setDetectDirection(true);
        // 设置图像参数压缩质量0-100, 越大图像质量越好但是请求时间越长。 不设置则默认值为20
        param.setImageQuality(20);
        OCR.getInstance(this).recognizeIDCard(param, new OnResultListener<IDCardResult>() {
            @Override
            public void onResult(IDCardResult result) {
                HHTipUtils.getInstance().dismissProgressDialog();
                if (result != null) {
               
                  
                }
            }

            @Override
            public void onError(OCRError error) {
               
                }
            }
        });

    }

可以在result中取得身份证的各种信息、最后别忘记销毁

   @Override
    protected void onDestroy() {
        // 释放内存资源
        OCR.getInstance(this).release();
        // 释放本地质量控制模型
        CameraNativeHelper.release();
        super.onDestroy();

    }

猜你喜欢

转载自blog.csdn.net/APPLYB/article/details/81407616