百度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("\n");
                }
                //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然后讀取需要的數據。

兩種模式比較

為了比較他們的准確度,我測試了印刷體和手寫體兩種文字的多個樣例,發現一般情況下,都是高精度的普通印刷體模式識別准確率比較高,但是在比較潦草的情況下,手寫體識別率比較高(這只是相對而言,實際上潦草字在很多情況下兩種模式都未識別成功),所以得出結論,大部分情況下用高精度印刷體文字識別模式即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM