newbiea 簡(jiǎn)書作者 2019-02-28 16:46打開App 簡(jiǎn)述 最近開發(fā)一個(gè)項(xiàng)目需要用到Ocr文字識(shí)別技術(shù)來識(shí)別手寫文字,,在評(píng)估過程中體驗(yàn)了百度的文字識(shí)別和騰訊的文字識(shí)別。查找官方開發(fā)文檔,,發(fā)現(xiàn)它們都有印刷體和手寫體兩種符合項(xiàng)目需求的識(shí)別模式,,但是騰訊的手寫體模式并沒找到sdk,只能直接根據(jù)文檔手動(dòng)post請(qǐng)求并返回結(jié)果,,但網(wǎng)上卻找不到具體的例子,,導(dǎo)致進(jìn)行過程中出現(xiàn)了一些小困難,。這篇文章主要記錄一下在Android Studio中百度Ocr的用法(主要參考官方文檔)。下篇文章記錄騰訊Ocr的用法,。 通用識(shí)別模式(高精度版) 1.首先需要下載百度文字識(shí)別的sdk,。SDK下載頁(yè)面 2.解壓縮下載的包,然后進(jìn)入libs目錄,,找到ocr-sdk.jar,復(fù)制到工程的libs目錄下,,然后點(diǎn)擊Android Studio的Build->Edit Libralies and Dependencies...,點(diǎn)擊+號(hào),,再點(diǎn)擊jar dependency,找到ocr-sdk.jar并添加即可,。 3.查看下載的包的libs目錄下,,發(fā)現(xiàn)有armeabi,arm64-v8a,,armeabi-v7a,,x86這幾個(gè)文件夾,選擇自己設(shè)備對(duì)應(yīng)的文件夾,,復(fù)制到android studio工程src/main/jniLibs目錄中,,如果不知道設(shè)備的arm架構(gòu),可以用Android Studio連接設(shè)備,,然后在Android Studio的控制臺(tái)中輸入: adb shell getprop ro.product.cpu.abi 即可查看當(dāng)前設(shè)備的arm架構(gòu),。 4.添加必要的權(quán)限: <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以上需要申請(qǐng)動(dòng)態(tài)權(quán)限。 5.如果在自己的工程中集成SDK,,為了防止release發(fā)布時(shí)打包報(bào)錯(cuò),,需要在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; //用來判斷是否成功獲取授權(quán) ocrNormal(); //開始文字識(shí)別(為了簡(jiǎn)單起見,,直接在這里進(jìn)行文字識(shí)別,,實(shí)際上使用看項(xiàng)目需要進(jìn)行判斷token) } @Override public void onError(OCRError error) { error.printStackTrace(); } }, mContext.getApplicationContext(), "替換成你的Api Key", "替換成你的Secret Key"); } Api Key和Secret Key需要去百度開放平臺(tái)注冊(cè)獲取(百度ai開放平臺(tái))。還有一種安全模式授權(quán)這里不詳說了,。 7.開始文字識(shí)別: private void ocrNormal() { // 通用文字識(shí)別參數(shù)設(shè)置 GeneralBasicParams param = new GeneralBasicParams(); param.setDetectDirection(true); //這里調(diào)用的是本地文件,,使用時(shí)替換成你的本地文件 File file=getBitmapFile(mBitmap); param.setImageFile(file); // 調(diào)用通用文字識(shí)別服務(wù) OCR.getInstance(mContext).recognizeAccurateBasic(param, new OnResultListener<GeneralResult>() { @Override public void onResult(GeneralResult result) { StringBuilder sb = new StringBuilder(); // 調(diào)用成功,返回GeneralResult對(duì)象 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) { // 調(diào)用失敗,,返回OCRError對(duì)象 } }); } 手寫體文字識(shí)別 手寫體文字識(shí)別只需要把上述調(diào)用的方法ocrNormal()修改為ocrHandwrite(),,然后第7步修改為以下即可: private void orcHandwrite() { // 通用文字識(shí)別參數(shù)設(shè)置 OcrRequestParams param = new OcrRequestParams(); File file=getBitmapFile(mBitmap); param.setImageFile(file); // 調(diào)用通用文字識(shí)別服務(wù) 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格式的字符串,,需要自己去轉(zhuǎn)換成jsonObject然后讀取需要的數(shù)據(jù),。 兩種模式比較 為了比較他們的準(zhǔn)確度,我測(cè)試了印刷體和手寫體兩種文字的多個(gè)樣例,,發(fā)現(xiàn)一般情況下,,都是高精度的普通印刷體模式識(shí)別準(zhǔn)確率比較高,,但是在比較潦草的情況下,手寫體識(shí)別率比較高(這只是相對(duì)而言,,實(shí)際上潦草字在很多情況下兩種模式都未識(shí)別成功),,所以得出結(jié)論,大部分情況下用高精度印刷體文字識(shí)別模式即可,。 |
|