• 百度Ocr文字识别


    简述

    最近开发一个项目需要用到Ocr文字识别技术来识别手写文字,在评估过程中体验了百度的文字识别和腾讯的文字识别。查找官方开发文档,发现它们都有印刷体和手写体两种符合项目需求的识别模式,但是腾讯的手写体模式并没找到sdk,只能直接根据文档手动post请求并返回结果,但网上却找不到具体的例子,导致进行过程中出现了一些小困难。这篇文章主要记录一下在Android Studio中百度Ocr的用法(主要参考官方文档)。下篇文章记录腾讯Ocr的用法。

    通用识别模式(高精度版)

    1.首先需要下载百度文字识别的sdk。SDK下载页面
    2.解压缩下载的包,然后进入libs目录,找到ocr-sdk.jar,复制到工程的libs目录下,然后点击Android Studio的Build->Edit Libralies and Dependencies...,点击+号,再点击jar dependency,找到ocr-sdk.jar并添加即可。
    3.查看下载的包的libs目录下,发现有armeabi,arm64-v8a,armeabi-v7a,x86这几个文件夹,选择自己设备对应的文件夹,复制到android studio工程src/main/jniLibs目录中,如果不知道设备的arm架构,可以用Android Studio连接设备,然后在Android Studio的控制台中输入:
    adb shell getprop ro.product.cpu.abi
    即可查看当前设备的arm架构。
    4.添加必要的权限:

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

    注意:android6.0以上需要申请动态权限。
    5.如果在自己的工程中集成SDK,为了防止release发布时打包报错,需要在Proguard配置文件中增加:

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

    6.在代码中初始化sdk:

        /**
         * 用明文ak,sk初始化
         */
        private void initAccessTokenWithAkSk() {
            OCR.getInstance(mContext).initAccessTokenWithAkSk(new OnResultListener<AccessToken>() {
                @Override
                public void onResult(AccessToken result) {
                    String token = result.getAccessToken();
                    hasGotToken = true;   //用来判断是否成功获取授权
                    ocrNormal();                 //开始文字识别(为了简单起见,直接在这里进行文字识别,实际上使用看项目需要进行判断token)
                }
    
                @Override
                public void onError(OCRError error) {
                    error.printStackTrace();
                }
            }, mContext.getApplicationContext(), "替换成你的Api Key", "替换成你的Secret Key");
        }
    

    Api Key和Secret Key需要去百度开放平台注册获取(百度ai开放平台)。还有一种安全模式授权这里不详说了。
    7.开始文字识别:

       private void ocrNormal() {
            // 通用文字识别参数设置
            GeneralBasicParams param = new GeneralBasicParams();
            param.setDetectDirection(true);
            //这里调用的是本地文件,使用时替换成你的本地文件
            File file=getBitmapFile(mBitmap);
            param.setImageFile(file);
          // 调用通用文字识别服务
            OCR.getInstance(mContext).recognizeAccurateBasic(param, new OnResultListener<GeneralResult>() {
                @Override
                public void onResult(GeneralResult result) {
                    StringBuilder sb = new StringBuilder();
                    // 调用成功,返回GeneralResult对象
                    for (WordSimple wordSimple : result.getWordList()) {
                        // wordSimple不包含位置信息
                        WordSimple word = wordSimple;
                        sb.append(word.getWords());
                        //sb.append("
    ");
                    }
                    //file.delete();
                      //String返回
                    ocrResult = sb.toString();
                    // json格式返回字符串result.getJsonRes())
                }
    
                @Override
                public void onError(OCRError error) {
                    // 调用失败,返回OCRError对象
                }
            });
        }
    

    手写体文字识别

    手写体文字识别只需要把上述调用的方法ocrNormal()修改为ocrHandwrite(),然后第7步修改为以下即可:

     private void orcHandwrite() {
            // 通用文字识别参数设置
            OcrRequestParams param = new OcrRequestParams();
            File file=getBitmapFile(mBitmap);
            param.setImageFile(file);
          // 调用通用文字识别服务
            OCR.getInstance(mContext).recognizeHandwriting(param, new OnResultListener<OcrResponseResult>() {
                @Override
                public void onResult(OcrResponseResult ocrResponseResult) {
                    //file.delete();
                    // json格式返回字符串
                   ocrResult = ocrResponseResult.getJsonRes();
                }
                @Override
                public void onError(OCRError ocrError) {
    
                }
            });
        }
    

    其中ocrResult返回的是json格式的字符串,需要自己去转换成jsonObject然后读取需要的数据。

    两种模式比较

    为了比较他们的准确度,我测试了印刷体和手写体两种文字的多个样例,发现一般情况下,都是高精度的普通印刷体模式识别准确率比较高,但是在比较潦草的情况下,手写体识别率比较高(这只是相对而言,实际上潦草字在很多情况下两种模式都未识别成功),所以得出结论,大部分情况下用高精度印刷体文字识别模式即可。

  • 相关阅读:
    【基础】Oracle 表空间和数据文件
    oracle学习笔记1:windows下oracle数据库安装及.net调用oracle数据库
    redis中文网站
    .NET中的消息队列
    .Net下的进程间的通讯 -- Windows消息队列
    1060 最复杂的数(反素数玄学dfs)
    1282 时钟(最小表示法+hash)
    1191 消灭兔子(贪心+优先队列)
    1366 贫富差距(floyed)
    1503 猪和回文(DP)
  • 原文地址:https://www.cnblogs.com/newbyblog/p/10451450.html
Copyright © 2020-2023  润新知