社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
近期由于工作内容的需要,我要给项目集成一个图片文字识别功能,据说百度的不错,所以今天写一个关于百度OCR的集成总结,以便以后再次使用不用去看官方文档。
首先肯定是要在百度管理平台注册账号并登录,然后照常去添加应用,如下图
创建成功后查看应用详情,下载下方画框的license文件,备用
然后现在就是去下载SDK,解压完是这样子
这时候打开你的项目,将SDK中的libs里的ocr-sdk.jar
放到app目录下的libs里面,之后在app下的src里面的main包里面创建一个assets包和一个jniLibs包,将你之前下载的license放到assets中,再将之前下载的SDK里的libs文件夹里面的四个文件统一复制放入jniLibs包中,如下图
之后右键项目导入SDK中的UI模块
选中ocr_ui,并点击确定,之后会弹出来几个警告
也很简单,把其中的compile改成implementation就行了
如果还报错的话,你就把ocr_ui的SDK版本调整到app的SDK版本就行,接着要在app的gardle的dependencies中添加implementation project(":ocr_ui")
项目依赖
下面是我app的gradle的配置
apply plugin: 'com.android.application'
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.example.myapplication"
minSdkVersion 15
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation project(":ocr_ui")
}
然后添加权限
<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"/>
然后剩下的就是设置点击事件,跳转拍照,发送照片,收到数据进行回调,这里放MainActivity类和自定义OCRManager类以及和Ui模块的获取图片路径类和最后的页面布局。
public class MainActivity extends AppCompatActivity {
final static String TAG = "OCR";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
OCR.getInstance(this).initAccessToken(new OnResultListener<AccessToken>() {
@Override
public void onResult(AccessToken result) {
// 调用成功,返回AccessToken对象
String token = result.getAccessToken();
Log.e(TAG,result.toString());
}
@Override
public void onError(OCRError error) {
// 调用失败,返回OCRError子类SDKError对象
Log.e(TAG,error.toString());
}
}, getApplicationContext());
}
public void ocrClick(View view) {
// 生成intent对象
Intent intent = new Intent(MainActivity.this, CameraActivity.class);
// 设置临时存储
intent.putExtra(CameraActivity.KEY_OUTPUT_FILE_PATH, FileUtil.getSaveFile(getApplication()).getAbsolutePath());
// 调用除银行卡,身份证等识别的activity
intent.putExtra(CameraActivity.KEY_CONTENT_TYPE, CameraActivity.CONTENT_TYPE_GENERAL);
startActivityForResult(intent, 111);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 111 && resultCode == Activity.RESULT_OK) {
// 获取调用参数
String contentType = data.getStringExtra(CameraActivity.KEY_CONTENT_TYPE);
// 通过临时文件获取拍摄的图片
String filePath = FileUtil.getSaveFile(getApplicationContext()).getAbsolutePath();
OCRManager.recognizeAccurateBasic(this, filePath, new OCRManager.OCRCallBack<GeneralResult>() {
@Override
public void succeed(GeneralResult data) {
// 调用成功,返回GeneralResult对象
String content = OCRManager.getResult(data);
Log.e(TAG,content + "");
}
@Override
public void failed(OCRError error) {
// 调用失败,返回OCRError对象
Log.e(TAG,"错误信息:" + error.getMessage());
}
});
}
}
}
public class OCRManager {
/**
* 通用文字识别接口
* @param context 上下文
* @param filePath 图片文件路径
* @param ocrCallBack 请求回调
*/
public static void recognizeGeneralBasic(Context context,String filePath,final OCRCallBack<GeneralResult> ocrCallBack){
// 通用文字识别参数设置
GeneralBasicParams param = new GeneralBasicParams();
param.setDetectDirection(true);
param.setImageFile(new File(filePath));
// 调用通用文字识别服务
OCR.getInstance(context).recognizeGeneralBasic(param, new OnResultListener<GeneralResult>() {
@Override
public void onResult(GeneralResult result) {
ocrCallBack.succeed(result);
}
@Override
public void onError(OCRError ocrError) {
ocrCallBack.failed(ocrError);
}
});
}
/**
* 通用文字识别接口(高精度版)
* @param context 上下文
* @param filePath 图片文件路径
* @param ocrCallBack 请求回调
*/
public static void recognizeAccurateBasic(Context context,String filePath,final OCRCallBack<GeneralResult> ocrCallBack){
// 通用文字识别参数设置
GeneralBasicParams param = new GeneralBasicParams();
param.setDetectDirection(true);
param.setImageFile(new File(filePath));
// 调用通用文字识别服务
OCR.getInstance(context).recognizeAccurateBasic(param, new OnResultListener<GeneralResult>() {
@Override
public void onResult(GeneralResult result) {
ocrCallBack.succeed(result);
}
@Override
public void onError(OCRError ocrError) {
ocrCallBack.failed(ocrError);
}
});
}
/**
* 通用文字识别接口(含位置信息版)
* @param context 上下文
* @param filePath 图片文件路径
* @param ocrCallBack 请求回调
*/
public static void recognizeGeneral(Context context,String filePath,final OCRCallBack<GeneralResult> ocrCallBack){
// 通用文字识别参数设置
GeneralParams param = new GeneralParams();
param.setDetectDirection(true);
param.setImageFile(new File(filePath));
// 调用通用文字识别服务
OCR.getInstance(context).recognizeGeneral(param, new OnResultListener<GeneralResult>() {
@Override
public void onResult(GeneralResult result) {
ocrCallBack.succeed(result);
}
@Override
public void onError(OCRError ocrError) {
ocrCallBack.failed(ocrError);
}
});
}
/**
* 通用文字识别接口(高精度含位置信息版)
* @param context 上下文
* @param filePath 图片文件路径
* @param ocrCallBack 请求回调
*/
public static void recognizeAccurate(Context context,String filePath,final OCRCallBack<GeneralResult> ocrCallBack){
// 通用文字识别参数设置
GeneralParams param = new GeneralParams();
param.setDetectDirection(true);
param.setImageFile(new File(filePath));
// 调用通用文字识别服务
OCR.getInstance(context).recognizeAccurate(param, new OnResultListener<GeneralResult>() {
@Override
public void onResult(GeneralResult result) {
ocrCallBack.succeed(result);
}
@Override
public void onError(OCRError ocrError) {
ocrCallBack.failed(ocrError);
}
});
}
/**
* 通用文字识别接口(含生僻字版)
* @param context 上下文
* @param filePath 图片文件路径
* @param ocrCallBack 请求回调
*/
public static void recognizeGeneralEnhanced(Context context,String filePath,final OCRCallBack<GeneralResult> ocrCallBack){
// 通用文字识别参数设置
GeneralBasicParams param = new GeneralBasicParams();
param.setDetectDirection(true);
param.setImageFile(new File(filePath));
// 调用通用文字识别服务
OCR.getInstance(context).recognizeGeneralEnhanced(param, new OnResultListener<GeneralResult>() {
@Override
public void onResult(GeneralResult result) {
ocrCallBack.succeed(result);
}
@Override
public void onError(OCRError ocrError) {
ocrCallBack.failed(ocrError);
}
});
}
/**
* 网络图片文字识别
* @param context 上下文
* @param filePath 图片路径
* @param ocrCallBack 请求回调
*/
public static void recognizeWebimage(Context context,String filePath,final OCRCallBack<GeneralResult> ocrCallBack){
// 网络图片识别参数设置
GeneralBasicParams param = new GeneralBasicParams();
param.setDetectDirection(true);
param.setImageFile(new File(filePath));
// 调用网络图片识别服务
OCR.getInstance(context).recognizeWebimage(param, new OnResultListener<GeneralResult>() {
@Override
public void onResult(GeneralResult result) {
ocrCallBack.succeed(result);
}
@Override
public void onError(OCRError ocrError) {
ocrCallBack.failed(ocrError);
}
});
}
/**
*银行卡识别
* @param context 上下文
* @param filePath 图片文件路径
* @param ocrCallBack 请求回调
*/
public static void recognizeBankCard(Context context,String filePath,final OCRCallBack<BankCardResult> ocrCallBack){
// 银行卡识别参数设置
BankCardParams param = new BankCardParams();
param.setImageFile(new File(filePath));
// 调用银行卡识别服务
OCR.getInstance(context).recognizeBankCard(param, new OnResultListener<BankCardResult>() {
@Override
public void onResult(BankCardResult result) {
// 调用成功,返回BankCardResult对象
ocrCallBack.succeed(result);
}
@Override
public void onError(OCRError error) {
// 调用失败,返回OCRError对象
ocrCallBack.failed(error);
}
});
}
/**
* 身份证识别
* @param context 上下文
* @param filePath 图片文件路径
* @param ocrCallBack 请求回调
*/
public static void recognizeIDCard(Context context,String filePath,final OCRCallBack<IDCardResult> ocrCallBack){
// 身份证识别参数设置
IDCardParams param = new IDCardParams();
param.setImageFile(new File(filePath));
// 调用身份证识别服务
OCR.getInstance(context).recognizeIDCard(param, new OnResultListener<IDCardResult>() {
@Override
public void onResult(IDCardResult result) {
// 调用成功,返回BankCardResult对象
ocrCallBack.succeed(result);
}
@Override
public void onError(OCRError error) {
// 调用失败,返回OCRError对象
ocrCallBack.failed(error);
}
});
}
/**
* 行驶证识别
* @param context 上下文
* @param filePath 图片文件路径
* @param ocrCallBack 请求回调
*/
public static void recognizeVehicleLicense(Context context,String filePath,final OCRCallBack<OcrResponseResult> ocrCallBack){
// 行驶证识别参数设置
OcrRequestParams param = new OcrRequestParams();
// 设置image参数
param.setImageFile(new File(filePath));
// 设置其他参数
param.putParam("detect_direction", true);
// 调用行驶证识别服务
OCR.getInstance(context).recognizeVehicleLicense(param, new OnResultListener<OcrResponseResult>() {
@Override
public void onResult(OcrResponseResult result) {
// 调用成功,返回OcrResponseResult对象
ocrCallBack.succeed(result);
}
@Override
public void onError(OCRError error) {
// 调用失败,返回OCRError对象
ocrCallBack.failed(error);
}
});
}
/**
* 驾驶证识别
* @param context 上下文
* @param filePath 图片文件路径
* @param ocrCallBack 请求回调
*/
public static void recognizeDrivingLicense(Context context,String filePath,final OCRCallBack<OcrResponseResult> ocrCallBack){
// 驾驶证识别参数设置
OcrRequestParams param = new OcrRequestParams();
// 设置image参数
param.setImageFile(new File(filePath));
// 设置其他参数
param.putParam("detect_direction", true);
// 调用驾驶证识别服务
OCR.getInstance(context).recognizeDrivingLicense(param, new OnResultListener<OcrResponseResult>() {
@Override
public void onResult(OcrResponseResult result) {
// 调用成功,返回OcrResponseResult对象
ocrCallBack.succeed(result);
}
@Override
public void onError(OCRError error) {
// 调用失败,返回OCRError对象
ocrCallBack.failed(error);
}
});
}
/**
* 车牌识别
* @param context 上下文
* @param filePath 图片文件路径
* @param ocrCallBack 请求回调
*/
public static void recognizeLicensePlate(Context context,String filePath,final OCRCallBack<OcrResponseResult> ocrCallBack){
// 车牌识别参数设置
OcrRequestParams param = new OcrRequestParams();
// 设置image参数
param.setImageFile(new File(filePath));
// 设置其他参数
param.putParam("detect_direction", true);
// 调用车牌识别服务
OCR.getInstance(context).recognizeLicensePlate(param, new OnResultListener<OcrResponseResult>() {
@Override
public void onResult(OcrResponseResult result) {
// 调用成功,返回OcrResponseResult对象
ocrCallBack.succeed(result);
}
@Override
public void onError(OCRError error) {
// 调用失败,返回OCRError对象
ocrCallBack.failed(error);
}
});
}
/**
* 营业执照识别
* @param context 上下文
* @param filePath 图片文件路径
* @param ocrCallBack 请求回调
*/
public static void recognizeBusinessLicense(Context context,String filePath,final OCRCallBack<OcrResponseResult> ocrCallBack){
// 营业执照识别参数设置
OcrRequestParams param = new OcrRequestParams();
// 设置image参数
param.setImageFile(new File(filePath));
// 设置其他参数
param.putParam("detect_direction", true);
// 调用营业执照识别服务
OCR.getInstance(context).recognizeBusinessLicense(param, new OnResultListener<OcrResponseResult>() {
@Override
public void onResult(OcrResponseResult result) {
// 调用成功,返回OcrResponseResult对象
ocrCallBack.succeed(result);
}
@Override
public void onError(OCRError error) {
// 调用失败,返回OCRError对象
ocrCallBack.failed(error);
}
});
}
/**
* 通用票据识别
* @param context 上下文
* @param filePath 图片文件路径
* @param ocrCallBack 请求回调
*/
public static void recognizeReceipt(Context context,String filePath,final OCRCallBack<OcrResponseResult> ocrCallBack){
// 通用票据识别参数设置
OcrRequestParams param = new OcrRequestParams();
// 设置image参数
param.setImageFile(new File(filePath));
// 设置其他参数
param.putParam("detect_direction", true);
// 调用通用票据识别服务
OCR.getInstance(context).recognizeReceipt(param, new OnResultListener<OcrResponseResult>() {
@Override
public void onResult(OcrResponseResult result) {
// 调用成功,返回OcrResponseResult对象
ocrCallBack.succeed(result);
}
@Override
public void onError(OCRError error) {
// 调用失败,返回OCRError对象
ocrCallBack.failed(error);
}
});
}
/**
* 从返回内容中提取识别出的信息
* @param result
* @return
*/
public static String getResult(ResponseResult result){
String sb = result.getJsonRes();
return sb;
}
/**
* 图片识别统一回调接口
*/
public interface OCRCallBack<T>{
void succeed(T data);
void failed(OCRError error);
}
}
public class FileUtil {
public static File getSaveFile(Context context) {
File file = new File(context.getFilesDir(), "pic.jpg");
return file;
}
}
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
android:onClick="ocrClick"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
至此就完成了百度OCR的集成,其实也可以自己写页面,也可以根据需求修改了SDK中ui模块儿来完成。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!