Android对接华为AI - 文本识别
準(zhǔn)備工作
在開(kāi)發(fā)應(yīng)用前:
1、需要在AppGallery Connect中配置相關(guān)信息,包括:注冊(cè)成為開(kāi)發(fā)者和創(chuàng)建應(yīng)用。
2、使用ML Kit云側(cè)服務(wù)(端側(cè)服務(wù)可不開(kāi)通)需要開(kāi)發(fā)者在AppGallery Connect上打開(kāi)ML Kit服務(wù)開(kāi)關(guān)。
集成HMS Core SDK
工程根目錄build.gradle文件
buildscript {
repositories {
google()
mavenCentral()
maven { url 'https://jitpack.io' }
// 配置HMS Core SDK的Maven倉(cāng)地址。
maven {url 'https://developer.huawei.com/repo/'}
}
dependencies {
classpath 'com.android.tools.build:gradle:7.0.4'
classpath 'com.huawei.agconnect:agcp:1.6.2.300'
}
}
allprojects {
repositories {
google()
mavenCentral()
maven { url 'https://jitpack.io' }
// 配置HMS Core SDK的Maven倉(cāng)地址。
maven {url 'https://developer.huawei.com/repo/'}
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
app module下的build.gradle依賴(lài)華為基礎(chǔ)SDK包與語(yǔ)言識(shí)別模型包:
// 引入基礎(chǔ)SDK
implementation 'com.huawei.hms:ml-computer-vision-ocr:3.11.0.301'
// 引入拉丁語(yǔ)文字識(shí)別模型包
implementation 'com.huawei.hms:ml-computer-vision-ocr-latin-model:3.11.0.301'
// 引入日韓語(yǔ)文字識(shí)別模型包
implementation 'com.huawei.hms:ml-computer-vision-ocr-jk-model:3.11.0.301'
// 引入中英文文字識(shí)別模型包
implementation 'com.huawei.hms:ml-computer-vision-ocr-cn-model:3.11.0.301'
配置混淆腳本
-dontwarn com.huawei.**
-keep class com.huawei.** {*;}
-dontwarn org.slf4j.**
-keep class org.slf4j.** {*;}
-dontwarn org.springframework.**
-keep class org.springframework.** {*;}
-dontwarn com.fasterxml.jackson.**
-keep class com.fasterxml.jackson.** {*;}
-keep class com.huawei.noah.bolttranslator.**{*;}
-dontwarn com.huawei.hisi.**
-keep class com.huawei.hisi.** {*;}
添加權(quán)限
<!--相機(jī)權(quán)限-->
<uses-permission android:name="android.permission.CAMERA" />
<!--使用網(wǎng)絡(luò)權(quán)限-->
<uses-permission android:name="android.permission.INTERNET" />
<!--寫(xiě)權(quán)限-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!--讀權(quán)限-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!--錄音權(quán)限-->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!--獲取網(wǎng)絡(luò)狀態(tài)權(quán)限-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!--獲取wifi狀態(tài)權(quán)限-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
端側(cè)識(shí)別
/**
* 端側(cè)文本識(shí)別
*/
private void textAnalyzer() {
long startTime = (new Date()).getTime();
Log.d("textAnalyzer", "start: " + startTime);
MLLocalTextSetting setting = new MLLocalTextSetting.Factory()
.setOCRMode(MLLocalTextSetting.OCR_DETECT_MODE)
// 設(shè)置識(shí)別語(yǔ)種。
.setLanguage("zh")
.create();
MLTextAnalyzer analyzer = MLAnalyzerFactory.getInstance().getLocalTextAnalyzer(setting);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.test2);
// 通過(guò)bitmap創(chuàng)建MLFrame,bitmap為輸入的Bitmap格式圖片數(shù)據(jù)。
MLFrame frame = MLFrame.fromBitmap(bitmap);
Task<MLText> task = analyzer.asyncAnalyseFrame(frame);
task.addOnSuccessListener(new OnSuccessListener<MLText>() {
@Override
public void onSuccess(MLText text) {
List<MLText.Block> blocks = text.getBlocks();
StringBuilder sb = new StringBuilder();
for (MLText.Block block : blocks) {
sb.append(block.getStringValue());
}
// 識(shí)別成功處理。
tv.setText("識(shí)別成功: " + sb.toString());
Log.d("textAnalyzer", "識(shí)別成功:\n " + sb.toString());
long endTime = (new Date()).getTime();
Log.d("textAnalyzer", "end: " + endTime);
Log.d("textAnalyzer", "耗時(shí): " + (endTime-startTime));
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
// 識(shí)別失敗處理。
tv.setText("識(shí)別失敗");
}
});
}
端側(cè)識(shí)別測(cè)試
原圖:test2.png
識(shí)別結(jié)果:
云側(cè)文本識(shí)別
注意:此功能收費(fèi),但是精確度更高。
配置應(yīng)用的鑒權(quán)信息
先申請(qǐng)apikey:
https://developer.huawei.com/consumer/cn/console/api/credentials/dev388421841221889538
然后配置apikey
云側(cè)文本識(shí)別實(shí)現(xiàn)
MLApplicationInit.init();
/**
* 云側(cè)文本識(shí)別
*/
private void textAnalyzerNet() {
long startTime = (new Date()).getTime();
Log.d("textAnalyzerNet", "start: " + startTime);
// 方式一:使用自定義參數(shù)配置。
// 創(chuàng)建語(yǔ)言集合。
List<String> languageList = new ArrayList();
languageList.add("zh");
languageList.add("en");
// 設(shè)置參數(shù)。
MLRemoteTextSetting setting = new MLRemoteTextSetting.Factory()
// 設(shè)置云側(cè)文本字體模式:
// 若選擇手寫(xiě)體格式,文本檢測(cè)模式僅支持稀疏文本,語(yǔ)言列表僅支持中文(zh),邊界框格式僅支持NGON四頂點(diǎn)坐標(biāo)。
// setTextDensityScene、setLnaguageList、setBorderType等方法設(shè)置均不生效。
// 若選擇印刷體格式,則需要手動(dòng)設(shè)置語(yǔ)言列表,檢測(cè)模式和邊框樣式,或采取默認(rèn)配置。
// MLRemoteTextSetting.OCR_HANDWRITTENFONT_SCENE:手寫(xiě)體。
// MLRemoteTextSetting.OCR_PRINTFONT_SCENE:印刷體。
.setTextFontScene(MLRemoteTextSetting.OCR_HANDWRITTENFONT_SCENE)
// 設(shè)置云側(cè)文本檢測(cè)模式:
// MLRemoteTextSetting.OCR_COMPACT_SCENE:文本密集場(chǎng)景的文本識(shí)別。
// MLRemoteTextSetting.OCR_LOOSE_SCENE:文本稀疏場(chǎng)景的文本識(shí)別。
.setTextDensityScene(MLRemoteTextSetting.OCR_LOOSE_SCENE)
// 設(shè)置識(shí)別語(yǔ)言列表,使用ISO 639-1標(biāo)準(zhǔn)。
.setLanguageList(languageList)
// 設(shè)置文本邊界框返回格式。
// MLRemoteTextSetting.NGON:返回四邊形的四個(gè)頂點(diǎn)坐標(biāo)。
// MLRemoteTextSetting.ARC:返回文本排列為弧形的多邊形邊界的頂點(diǎn),最多可返回多達(dá)72個(gè)頂點(diǎn)的坐標(biāo)。
.setBorderType(MLRemoteTextSetting.ARC)
.create();
MLTextAnalyzer analyzer = MLAnalyzerFactory.getInstance().getRemoteTextAnalyzer(setting);
// 方式二:使用默認(rèn)參數(shù)配置,自動(dòng)檢測(cè)語(yǔ)種進(jìn)行識(shí)別,適用于文本稀疏場(chǎng)景,文本框返回格式為:MLRemoteTextSetting.NGON。
//MLTextAnalyzer analyzer = MLAnalyzerFactory.getInstance().getRemoteTextAnalyzer();
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.test2);
// 通過(guò)bitmap創(chuàng)建MLFrame,bitmap為輸入的Bitmap格式圖片數(shù)據(jù)。
MLFrame frame = MLFrame.fromBitmap(bitmap);
Task<MLText> task = analyzer.asyncAnalyseFrame(frame);
task.addOnSuccessListener(new OnSuccessListener<MLText>() {
@Override
public void onSuccess(MLText text) {
// 識(shí)別成功。
List<MLText.Block> blocks = text.getBlocks();
StringBuilder sb = new StringBuilder();
for (MLText.Block block : blocks) {
sb.append(block.getStringValue());
sb.append("\n");
}
// 識(shí)別成功處理。
tv.setText("識(shí)別成功: " + sb.toString());
Log.d("textAnalyzerNet", "識(shí)別成功:\n " + sb.toString());
long endTime = (new Date()).getTime();
Log.d("textAnalyzerNet", "end: " +endTime);
Log.d("textAnalyzerNet", "耗時(shí): " + (endTime-startTime));
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
// 識(shí)別失敗,獲取相關(guān)異常信息。
try {
MLException mlException = (MLException) e;
// 獲取錯(cuò)誤碼,開(kāi)發(fā)者可以對(duì)錯(cuò)誤碼進(jìn)行處理,根據(jù)錯(cuò)誤碼進(jìn)行差異化的頁(yè)面提示。
int errorCode = mlException.getErrCode();
// 獲取報(bào)錯(cuò)信息,開(kāi)發(fā)者可以結(jié)合錯(cuò)誤碼,快速定位問(wèn)題。
String errorMessage = mlException.getMessage();
} catch (Exception error) {
// 轉(zhuǎn)換錯(cuò)誤處理。
}
}
});
}
云側(cè)文本識(shí)別測(cè)試
原圖:test2.png
識(shí)別結(jié)果:
官網(wǎng)參考
更多內(nèi)容,請(qǐng)參考官網(wǎng):
https://developer.huawei.com/consumer/cn/doc/hiai-Guides/text-recognition-0000001050040053
總結(jié)
以上是生活随笔為你收集整理的Android对接华为AI - 文本识别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: STM32CubeMX教程7 TIM 通
- 下一篇: android sina oauth2.