在Android中调用百度的OCR接口

前言

最近实验室开了个新项目,是一个通过扫描单词后把扫描过的单词生成游戏来让小朋友记单词的APP,扫描单词这个功能需要用到OCR.
现在常用的OCR有

  • Tesseract 这个用的人比较多,而且开源,目前google正在维护,但是我尝试了一下,发现识别准确率不是特别理想。

  • 微软的Azure上的认知服务 识别率很高,但是收费,现在有1元体验的套餐,而且不需要验证信用卡,感兴趣的同学可以试试。

  • 百度的文字识别 之所以用这个是因为免费,不过有每天的限制次数,对于学生项目来说够用,还要什么自行车。

下面进入正文

如何在Android 中调用百度的OCR进行文字识别

1.获取百度文字识别产品服务的 Ak/Sk

1.在百度AI开放平台中进入控制台

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v8Hyj52T-1649739771341)(https://ws1.sinaimg.cn/large/9c347cably1fxi9h8djs4j21240ft7kw.jpg)]

2.找到文字识别 产品服务
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aLJ9nke3-1649739771343)(https://ws1.sinaimg.cn/large/9c347cably1fxi9j5tr4xj20q00iedie.jpg)]

3,创建应用

4,填写信息,注意这里的包名一定要和项目的包名一致

5.获得AK/SK

6.下载license文件,在项目中如果直接用AK/SK明文调用百度的OCR,很不安全,可能会被别人反编译之后获得你的AK.SK
license文件集成了AK/SK 放在项目中可以防止别人破解。

7.下载之后将获得的api.license文件放入main目录下的assets目录中

2.添加百度OCR的SDK到项目中

1.下载 百度OCR的android Sdk


2.下载的SDK压缩包将其解压,并将libs下的ocr-sdk的jar包放入项目的libs目录下

3.在main目录下新建jniLibs目录,并将libs文件夹中的其他文件放入其中

4.在app下的build,gradle中添加

将添加在libs下的sdk JAR包编译

5.这里下载的压缩包中包括了百度提供的相机扫描时的UI,在拍完照有裁剪框,比较方便,这里我们可以作为module引入项目中

3.调用百度OCR

做完准备工作我们就可以开始调用百度的OCR接口了。

首先在我们需要进行识别的页面所在的文件中创建 根据License文件初始化OCR实例的函数,并在onCreate()方法中调用

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

            @Override
            public void onError(OCRError error) {
                error.printStackTrace();
                alertText("自定义文件路径licence方式获取token失败", error.getMessage());
            }
        }, "aip.license", mActivity.getApplicationContext());
    }

定义我们的打开相机事件

/**
     * 打开相机,进入的相机页面是借用百度OCR 官方DEMO中的相机页面
     * 能够在相机中裁剪图片,和进入图库
     * @author cyd
     */
    private void openCameraForResult() {
        if (!checkTokenStatus()) {
            return;
        }
        Intent intent = new Intent(mActivity, CameraActivity.class);
        intent.putExtra(CameraActivity.KEY_OUTPUT_FILE_PATH,
                FileUtil.getSaveFile(getActivity()).getAbsolutePath());
        intent.putExtra(CameraActivity.KEY_CONTENT_TYPE,
                CameraActivity.CONTENT_TYPE_GENERAL);
        startActivityForResult(intent, REQUEST_CODE_GENERAL_BASIC);
    }

这里的CameraActivity用的是引入OCR_UI中的相机活动,自带剪裁框

接下来需要我们新建一个可以存放OCR的识别方法的类RecognizeService

**
 * 这个类是用于将拍摄或者图库中获得的图片进行识别,返回JSON格式的字符串。
 */
public class RecognizeService {

	public interface ServiceListener {
        public void onResult(String result);
    }
    
    //高精度版
    public static void recAccurateBasic(Context ctx, String filePath, final ServiceListener listener) {
        GeneralParams param = new GeneralParams();
        param.setDetectDirection(true);
        param.setVertexesLocation(true);
        param.setLanguageType(GeneralBasicParams.ENGLISH);
        param.setRecognizeGranularity(GeneralParams.GRANULARITY_SMALL);
        param.setImageFile(new File(filePath));
        
        //这里的recognizeAccurateBasic方法为百度OCR识别的核心方法
        OCR.getInstance(ctx).recognizeAccurateBasic(param, new OnResultListener<GeneralResult>() {
            @Override
            public void onResult(GeneralResult result) {
                StringBuilder sb = new StringBuilder();
                for (WordSimple wordSimple : result.getWordList()) {
                    WordSimple word = wordSimple;
                    sb.append(word.getWords());
                    sb.append("\n");
                }
                listener.onResult(result.getJsonRes());
            }

            @Override
            public void onError(OCRError error) {
                listener.onResult(error.getMessage());
            }
        });
    }


}

在onActivityResult方法中,我们调用刚刚新建的类的recAccurateBasic方法,此方法接收三个参数,分别是context,拍照获取的图片路径,和在RecognizeService类中定义的监听接口,这里的获取图片路径方法,我用的是百度官方DEMO中的方法

在onResult方法中,返回的result字符串即为识别结果的json字符串,只需要对JSON解析一下就能得到识别结果啦

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) {
            case REQUEST_CODE_GENERAL_BASIC:
                if (resultCode == Activity.RESULT_OK) {
                    RecognizeService.recAccurateBasic(mActivity, FileUtil.getSaveFile(mActivity.getApplicationContext()).getAbsolutePath(),
                            new RecognizeService.ServiceListener() {
                                @Override
                                public void onResult(String result) {
                                    Bundle bundle = new Bundle();
                                    bundle.putString("wordResultJson",result );
                                    Intent intent = new Intent(mActivity,SelectWordsActivity.class);
                                    intent.putExtra("wordResultBundle",bundle );
                                    startActivity(intent);
                                }
                            });
                }
                break;
            default:
                Log.d(TAG, "onActivityResult: "+"run in default");
                break;
        }
    }

FileUtil类

public class FileUtil {
    public static File getSaveFile(Context context) {
        File file = new File(context.getFilesDir(), "pic.jpg");
        return file;
    }
}

  • 6
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
### 回答1: 要在Java实现调用百度OCR票据识别服务,可以按照以下步骤进行: 1. 首先,我们需要获取百度AI开放平台的相关API Key和Secret Key。可以在百度AI开放平台的官方网站上注册并创建一个应用,然后获取到这两个关键的身份验证参数。 2. 在Java,可以使用百度AI开放平台提供的Java SDK调用相关服务。首先,需要确保项目已经引入了百度OCR的Java SDK依赖。 3. 创建一个OCRClient对象,并使用之前获取到的API Key和Secret Key进行身份验证。 4. 为要识别的票据准备好图片数据。可以使用Java的File类来读取本地图片文件,也可以直接使用网络上的图片URL。将图片数据转换为字节数组。 5. 调用票据识别的方法,传入要识别的图片数据。可以使用票据识别的方法来识别票据的各种字段信息,如发票代码、发票号码等。 6. 处理返回的结果。根据百度OCR API的返回结果,解析出需要的字段信息,并进行相应的业务处理。 7. 最后,记得释放资源和处理异常情况,确保程序的稳定性和安全性。 这样,我们就可以在Java调用百度OCR票据识别服务了。记得在调用API之前,阅读相关文档和了解API的使用限制和注意事项,以确保调用的有效性。 ### 回答2: 在Java调用百度OCR票据识别功能,可以通过以下几个步骤来实现。 首先,需要在百度云AI平台上创建一个OCR应用,并获取应用的API Key和Secret Key。这些凭证将用于后续的认证和授权。 然后,需要引入百度AIP Java SDK,可以通过maven等方式将它添加到项目的依赖,以便能够在代码使用百度OCR相关的接口。 接下来,在代码构建AipOcr对象,将API Key和Secret Key以及OCR接口的请求地址设置进去。可以通过AipOcr的实例来调用百度OCR相关的接口调用百度OCR票据识别功能时,可以通过调用AipOcr对象的receiptRecognize方法来实现。将票据图片的二进制数据作为参数传递给该方法即可。 对于返回的结果,可以通过解析返回的JSON数据来获取识别结果。如票据的种类、识别的文字内容、发票代码、发票号码等信息。 最后,根据需要对返回的识别结果进行处理和展示,可以输出到控制台,保存到文件,或者在界面上显示出来。 总结起来,调用百度OCR票据识别功能需要先获取API Key和Secret Key,然后引入百度AIP Java SDK,构建AipOcr对象,并调用相关接口进行票据识别。最后根据识别结果进行后续处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值