Ocr 圖文識別技術——基於百度雲OCR技術學習與總結
1.百度智能雲 控制檯 https://console.bce.baidu.com/ai/?fromai=1#/ai/ocr/overview/index 創建應用,生成API Key,Secret Key
2.在應用詳情頁面下載對應應用的授權文件
3.百度智能雲 Android-SDK文檔鏈接:https://cloud.baidu.com/doc/OCR/s/fjwvxzeiy
4.SDK下載地址:http://ai.baidu.com/sdk/#ocr
下面我跟大家講一下開發步驟。
1.下載sdk
2.依賴sdk以及armeabi到lib目錄下
3.下載的sdk裏面有一個ocr-ui model,如果需要的話,可以作爲model到項目中
4.清單文件添加權限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
5.Proguard配置:app——proguard-rules.pro
-keep class com.baidu.ocr.sdk.**{*;}
-dontwarn com.baidu.ocr.**
6.代碼中:初始化OCR單例:
OCR.getInstance().initAccessTokenWithAkSk(new OnResultListener<AccessToken>() {
@Override
public void onResult(AccessToken result) {
// 調用成功,返回AccessToken對象
String token = result.getAccessToken();
}
@Override
public void onError(OCRError error) {
// 調用失敗,返回OCRError子類SDKError對象
}
}, getApplicationContext(), "您的應用AK", "您的應用SK");
7.功能調用以及回調事件:
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.tv_car://車牌識別
Intent intent = new Intent(MainActivity.this, CameraActivity.class);
intent.putExtra(CameraActivity.KEY_OUTPUT_FILE_PATH,
FileUtils.getSaveFile(getApplication()).getAbsolutePath());
intent.putExtra(CameraActivity.KEY_CONTENT_TYPE,
CameraActivity.CONTENT_TYPE_GENERAL);
startActivityForResult(intent, REQUEST_CODE_LICENSE_PLATE);
break;
case R.id.tv_company://營業執照識別
Intent intentCompany = new Intent(MainActivity.this, CameraActivity.class);
intentCompany.putExtra(CameraActivity.KEY_OUTPUT_FILE_PATH,
FileUtils.getSaveFile(getApplication()).getAbsolutePath());
intentCompany.putExtra(CameraActivity.KEY_CONTENT_TYPE,
CameraActivity.CONTENT_TYPE_GENERAL);
startActivityForResult(intentCompany, REQUEST_CODE_BUSINESS_LICENSE);
break;
case R.id.general_basic://通用文字識別
Intent intentGener = new Intent(MainActivity.this, CameraActivity.class);
intentGener.putExtra(CameraActivity.KEY_OUTPUT_FILE_PATH,
FileUtils.getSaveFile(getApplication()).getAbsolutePath());
intentGener.putExtra(CameraActivity.KEY_CONTENT_TYPE,
CameraActivity.CONTENT_TYPE_GENERAL);
startActivityForResult(intentGener, REQUEST_CODE_GENERAL_BASIC);
break;
case R.id.accurate_basic://通用文字識別(高精度版)
Intent intentAccur = new Intent(MainActivity.this, CameraActivity.class);
intentAccur.putExtra(CameraActivity.KEY_OUTPUT_FILE_PATH,
FileUtils.getSaveFile(getApplication()).getAbsolutePath());
intentAccur.putExtra(CameraActivity.KEY_CONTENT_TYPE,
CameraActivity.CONTENT_TYPE_GENERAL);
startActivityForResult(intentAccur, REQUEST_CODE_GENERAL_ENHANCED);
break;
case R.id.general_location://通用文字識別(含位置信息版)
Intent intentGenLoca = new Intent(MainActivity.this, CameraActivity.class);
intentGenLoca.putExtra(CameraActivity.KEY_OUTPUT_FILE_PATH,
FileUtils.getSaveFile(getApplication()).getAbsolutePath());
intentGenLoca.putExtra(CameraActivity.KEY_CONTENT_TYPE,
CameraActivity.CONTENT_TYPE_GENERAL);
startActivityForResult(intentGenLoca, REQUEST_CODE_GENERAL);
break;
case R.id.accurate_location://通用文字識別(高精度含位置信息版)
Intent intentAccuLoca = new Intent(MainActivity.this, CameraActivity.class);
intentAccuLoca.putExtra(CameraActivity.KEY_OUTPUT_FILE_PATH,
FileUtils.getSaveFile(getApplication()).getAbsolutePath());
intentAccuLoca.putExtra(CameraActivity.KEY_CONTENT_TYPE,
CameraActivity.CONTENT_TYPE_GENERAL);
startActivityForResult(intentAccuLoca, REQUEST_CODE_ACCURATE);
break;
case R.id.general_enhance://通用文字識別(含生僻字版)
Intent intentEnhance = new Intent(MainActivity.this, CameraActivity.class);
intentEnhance.putExtra(CameraActivity.KEY_OUTPUT_FILE_PATH,
FileUtils.getSaveFile(getApplication()).getAbsolutePath());
intentEnhance.putExtra(CameraActivity.KEY_CONTENT_TYPE,
CameraActivity.CONTENT_TYPE_GENERAL);
startActivityForResult(intentEnhance, REQUEST_CODE_GENERAL_ENHANCED);
break;
case R.id.general_webimage://網絡圖片文字識別
Intent intentWeb = new Intent(MainActivity.this, CameraActivity.class);
intentWeb.putExtra(CameraActivity.KEY_OUTPUT_FILE_PATH,
FileUtils.getSaveFile(getApplication()).getAbsolutePath());
intentWeb.putExtra(CameraActivity.KEY_CONTENT_TYPE,
CameraActivity.CONTENT_TYPE_GENERAL);
startActivityForResult(intentWeb, REQUEST_CODE_GENERAL_WEBIMAGE);
break;
case R.id.idcard://身份證識別
Intent intentIdCard = new Intent(MainActivity.this, IDCardActivity.class);
startActivity(intentIdCard);
break;
case R.id.bankcard://銀行卡識別
Intent intentBank = new Intent(MainActivity.this, CameraActivity.class);
intentBank.putExtra(CameraActivity.KEY_OUTPUT_FILE_PATH,
FileUtils.getSaveFile(getApplication()).getAbsolutePath());
intentBank.putExtra(CameraActivity.KEY_CONTENT_TYPE,
CameraActivity.CONTENT_TYPE_BANK_CARD);
startActivityForResult(intentBank, REQUEST_CODE_BANKCARD);
break;
case R.id.driving_license://駕駛證識別
Intent intentDirver = new Intent(MainActivity.this, CameraActivity.class);
intentDirver.putExtra(CameraActivity.KEY_OUTPUT_FILE_PATH,
FileUtils.getSaveFile(getApplication()).getAbsolutePath());
intentDirver.putExtra(CameraActivity.KEY_CONTENT_TYPE,
CameraActivity.CONTENT_TYPE_GENERAL);
startActivityForResult(intentDirver, REQUEST_CODE_VEHICLE_LICENSE);
break;
case R.id.vehicle_license://行駛證識別
Intent intentVehicle = new Intent(MainActivity.this, CameraActivity.class);
intentVehicle.putExtra(CameraActivity.KEY_OUTPUT_FILE_PATH,
FileUtils.getSaveFile(getApplication()).getAbsolutePath());
intentVehicle.putExtra(CameraActivity.KEY_CONTENT_TYPE,
CameraActivity.CONTENT_TYPE_GENERAL);
startActivityForResult(intentVehicle, REQUEST_CODE_DRIVING_LICENSE);
break;
case R.id.receipt://通用票據識別
Intent intentReceipt = new Intent(MainActivity.this, CameraActivity.class);
intentReceipt.putExtra(CameraActivity.KEY_OUTPUT_FILE_PATH,
FileUtils.getSaveFile(getApplication()).getAbsolutePath());
intentReceipt.putExtra(CameraActivity.KEY_CONTENT_TYPE,
CameraActivity.CONTENT_TYPE_GENERAL);
startActivityForResult(intentReceipt, REQUEST_CODE_RECEIPT);
break;
case R.id.passport://護照識別
Intent intentPassport = new Intent(MainActivity.this, CameraActivity.class);
intentPassport.putExtra(CameraActivity.KEY_OUTPUT_FILE_PATH,
FileUtils.getSaveFile(getApplication()).getAbsolutePath());
intentPassport.putExtra(CameraActivity.KEY_CONTENT_TYPE,
CameraActivity.CONTENT_TYPE_PASSPORT);
startActivityForResult(intentPassport, REQUEST_CODE_PASSPORT);
break;
case R.id.numbers://數字識別
Intent intentNum = new Intent(MainActivity.this, CameraActivity.class);
intentNum.putExtra(CameraActivity.KEY_OUTPUT_FILE_PATH,
FileUtils.getSaveFile(getApplication()).getAbsolutePath());
intentNum.putExtra(CameraActivity.KEY_CONTENT_TYPE,
CameraActivity.CONTENT_TYPE_GENERAL);
startActivityForResult(intentNum, REQUEST_CODE_NUMBERS);
break;
case R.id.qrcode://二維碼識別
Intent intentCode = new Intent(MainActivity.this, CameraActivity.class);
intentCode.putExtra(CameraActivity.KEY_OUTPUT_FILE_PATH,
FileUtils.getSaveFile(getApplication()).getAbsolutePath());
intentCode.putExtra(CameraActivity.KEY_CONTENT_TYPE,
CameraActivity.CONTENT_TYPE_GENERAL);
startActivityForResult(intentCode, REQUEST_CODE_QRCODE);
break;
case R.id.business_card://名片識別
Intent intentBusiness = new Intent(MainActivity.this, CameraActivity.class);
intentBusiness.putExtra(CameraActivity.KEY_OUTPUT_FILE_PATH,
FileUtils.getSaveFile(getApplication()).getAbsolutePath());
intentBusiness.putExtra(CameraActivity.KEY_CONTENT_TYPE,
CameraActivity.CONTENT_TYPE_GENERAL);
startActivityForResult(intentBusiness, REQUEST_CODE_BUSINESSCARD);
break;
case R.id.handwritting://手寫識別
Intent intentHandwrite = new Intent(MainActivity.this, CameraActivity.class);
intentHandwrite.putExtra(CameraActivity.KEY_OUTPUT_FILE_PATH,
FileUtils.getSaveFile(getApplication()).getAbsolutePath());
intentHandwrite.putExtra(CameraActivity.KEY_CONTENT_TYPE,
CameraActivity.CONTENT_TYPE_GENERAL);
startActivityForResult(intentHandwrite, REQUEST_CODE_HANDWRITING);
break;
case R.id.lottery://彩票識別
Intent intentLottery = new Intent(MainActivity.this, CameraActivity.class);
intentLottery.putExtra(CameraActivity.KEY_OUTPUT_FILE_PATH,
FileUtils.getSaveFile(getApplication()).getAbsolutePath());
intentLottery.putExtra(CameraActivity.KEY_CONTENT_TYPE,
CameraActivity.CONTENT_TYPE_GENERAL);
startActivityForResult(intentLottery, REQUEST_CODE_LOTTERY);
break;
case R.id.vat_invoice://增值稅發票識別
Intent intentVat = new Intent(MainActivity.this, CameraActivity.class);
intentVat.putExtra(CameraActivity.KEY_OUTPUT_FILE_PATH,
FileUtils.getSaveFile(getApplication()).getAbsolutePath());
intentVat.putExtra(CameraActivity.KEY_CONTENT_TYPE,
CameraActivity.CONTENT_TYPE_GENERAL);
startActivityForResult(intentVat, REQUEST_CODE_VATINVOICE);
break;
case R.id.custom://自定義模板識別
Intent intentCustom = new Intent(MainActivity.this, CameraActivity.class);
intentCustom.putExtra(CameraActivity.KEY_OUTPUT_FILE_PATH,
FileUtils.getSaveFile(getApplication()).getAbsolutePath());
intentCustom.putExtra(CameraActivity.KEY_CONTENT_TYPE,
CameraActivity.CONTENT_TYPE_GENERAL);
startActivityForResult(intentCustom, REQUEST_CODE_CUSTOM);
break;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// 識別成功回調,通用文字識別(含位置信息)
if (requestCode == REQUEST_CODE_GENERAL && resultCode == Activity.RESULT_OK) {
RecognizeService.recGeneral(this, FileUtils.getSaveFile(getApplicationContext()).getAbsolutePath(),
new RecognizeService.ServiceListener() {
@Override
public void onResult(String result) {
alertText(result);
}
});
}
// 識別成功回調,通用文字識別(含位置信息高精度版)
if (requestCode == REQUEST_CODE_ACCURATE && resultCode == Activity.RESULT_OK) {
RecognizeService.recAccurate(this, FileUtils.getSaveFile(getApplicationContext()).getAbsolutePath(),
new RecognizeService.ServiceListener() {
@Override
public void onResult(String result) {
alertText(result);
}
});
}
// 識別成功回調,通用文字識別
if (requestCode == REQUEST_CODE_GENERAL_BASIC && resultCode == Activity.RESULT_OK) {
RecognizeService.recGeneralBasic(this, FileUtils.getSaveFile(getApplicationContext()).getAbsolutePath(),
new RecognizeService.ServiceListener() {
@Override
public void onResult(String result) {
alertText(result);
}
});
}
// 識別成功回調,通用文字識別(高精度版)
if (requestCode == REQUEST_CODE_ACCURATE_BASIC && resultCode == Activity.RESULT_OK) {
RecognizeService.recAccurateBasic(this, FileUtils.getSaveFile(getApplicationContext()).getAbsolutePath(),
new RecognizeService.ServiceListener() {
@Override
public void onResult(String result) {
alertText(result);
}
});
}
// 識別成功回調,通用文字識別(含生僻字版)
if (requestCode == REQUEST_CODE_GENERAL_ENHANCED && resultCode == Activity.RESULT_OK) {
RecognizeService.recGeneralEnhanced(this, FileUtils.getSaveFile(getApplicationContext()).getAbsolutePath(),
new RecognizeService.ServiceListener() {
@Override
public void onResult(String result) {
alertText(result);
}
});
}
// 識別成功回調,網絡圖片文字識別
if (requestCode == REQUEST_CODE_GENERAL_WEBIMAGE && resultCode == Activity.RESULT_OK) {
RecognizeService.recWebimage(this, FileUtils.getSaveFile(getApplicationContext()).getAbsolutePath(),
new RecognizeService.ServiceListener() {
@Override
public void onResult(String result) {
alertText(result);
}
});
}
// 識別成功回調,銀行卡識別
if (requestCode == REQUEST_CODE_BANKCARD && resultCode == Activity.RESULT_OK) {
RecognizeService.recBankCard(this, FileUtils.getSaveFile(getApplicationContext()).getAbsolutePath(),
new RecognizeService.ServiceListener() {
@Override
public void onResult(String result) {
alertText(result);
}
});
}
// 識別成功回調,行駛證識別
if (requestCode == REQUEST_CODE_VEHICLE_LICENSE && resultCode == Activity.RESULT_OK) {
RecognizeService.recVehicleLicense(this, FileUtils.getSaveFile(getApplicationContext()).getAbsolutePath(),
new RecognizeService.ServiceListener() {
@Override
public void onResult(String result) {
alertText(result);
}
});
}
// 識別成功回調,駕駛證識別
if (requestCode == REQUEST_CODE_DRIVING_LICENSE && resultCode == Activity.RESULT_OK) {
RecognizeService.recDrivingLicense(this, FileUtils.getSaveFile(getApplicationContext()).getAbsolutePath(),
new RecognizeService.ServiceListener() {
@Override
public void onResult(String result) {
alertText(result);
}
});
}
// 識別成功回調,車牌識別
if (requestCode == REQUEST_CODE_LICENSE_PLATE && resultCode == Activity.RESULT_OK) {
RecognizeService.recLicensePlate(this, FileUtils.getSaveFile(getApplicationContext()).getAbsolutePath(),
new RecognizeService.ServiceListener() {
@Override
public void onResult(String result) {
alertText(result);
}
});
}
// 識別成功回調,營業執照識別
if (requestCode == REQUEST_CODE_BUSINESS_LICENSE && resultCode == Activity.RESULT_OK) {
RecognizeService.recBusinessLicense(this, FileUtils.getSaveFile(getApplicationContext()).getAbsolutePath(),
new RecognizeService.ServiceListener() {
@Override
public void onResult(String result) {
alertText(result);
}
});
}
// 識別成功回調,通用票據識別
if (requestCode == REQUEST_CODE_RECEIPT && resultCode == Activity.RESULT_OK) {
RecognizeService.recReceipt(this, FileUtils.getSaveFile(getApplicationContext()).getAbsolutePath(),
new RecognizeService.ServiceListener() {
@Override
public void onResult(String result) {
alertText(result);
}
});
}
// 識別成功回調,護照
if (requestCode == REQUEST_CODE_PASSPORT && resultCode == Activity.RESULT_OK) {
RecognizeService.recPassport(this, FileUtils.getSaveFile(getApplicationContext()).getAbsolutePath(),
new RecognizeService.ServiceListener() {
@Override
public void onResult(String result) {
alertText(result);
}
});
}
// 識別成功回調,二維碼
if (requestCode == REQUEST_CODE_QRCODE && resultCode == Activity.RESULT_OK) {
RecognizeService.recQrcode(this, FileUtils.getSaveFile(getApplicationContext()).getAbsolutePath(),
new RecognizeService.ServiceListener() {
@Override
public void onResult(String result) {
alertText(result);
}
});
}
// 識別成功回調,彩票
if (requestCode == REQUEST_CODE_LOTTERY && resultCode == Activity.RESULT_OK) {
RecognizeService.recLottery(this, FileUtils.getSaveFile(getApplicationContext()).getAbsolutePath(),
new RecognizeService.ServiceListener() {
@Override
public void onResult(String result) {
alertText(result);
}
});
}
// 識別成功回調,增值稅發票
if (requestCode == REQUEST_CODE_VATINVOICE && resultCode == Activity.RESULT_OK) {
RecognizeService.recVatInvoice(this, FileUtils.getSaveFile(getApplicationContext()).getAbsolutePath(),
new RecognizeService.ServiceListener() {
@Override
public void onResult(String result) {
alertText(result);
}
});
}
// 識別成功回調,數字
if (requestCode == REQUEST_CODE_NUMBERS && resultCode == Activity.RESULT_OK) {
RecognizeService.recNumbers(this, FileUtils.getSaveFile(getApplicationContext()).getAbsolutePath(),
new RecognizeService.ServiceListener() {
@Override
public void onResult(String result) {
alertText(result);
}
});
}
// 識別成功回調,手寫
if (requestCode == REQUEST_CODE_HANDWRITING && resultCode == Activity.RESULT_OK) {
RecognizeService.recHandwriting(this, FileUtils.getSaveFile(getApplicationContext()).getAbsolutePath(),
new RecognizeService.ServiceListener() {
@Override
public void onResult(String result) {
alertText(result);
}
});
}
// 識別成功回調,名片
if (requestCode == REQUEST_CODE_BUSINESSCARD && resultCode == Activity.RESULT_OK) {
RecognizeService.recBusinessCard(this, FileUtils.getSaveFile(getApplicationContext()).getAbsolutePath(),
new RecognizeService.ServiceListener() {
@Override
public void onResult(String result) {
alertText(result);
}
});
}
// 識別成功回調,自定義模板
if (requestCode == REQUEST_CODE_CUSTOM && resultCode == Activity.RESULT_OK) {
RecognizeService.recCustom(this, FileUtils.getSaveFile(getApplicationContext()).getAbsolutePath(),
new RecognizeService.ServiceListener() {
@Override
public void onResult(String result) {
alertText(result);
}
});
}
}
8.釋放內存資源
@Override
protected void onDestroy() {
super.onDestroy();
// 釋放內存資源
OCR.getInstance(this).release();
}
9.demo鏈接:https://download.csdn.net/download/qq_36692282/11709460
10百度雲這次不是全部免費的,只有200次一天的免費,之後要收費的,我 還以爲 良心了額,開源了,小失落啊