OCR接入文档
文档状态
| 文件标识: | TuringOS-OCR-V1.0 |
|---|---|
| 系统版本: | SDK |
| 完成日期: | 2023年04月20日 |
文档修订记录
| 文档版本号 | 修订日期 | 修订原因 |
|---|---|---|
| V1.0 | 2023.04.20 | 创建文档 |
概述
传入一张图片,识别出图片中的文本。支持印刷体和手写体识别。
集成步骤
1. 添加依赖库
//必须依赖库
implementation 'com.google.code.gson:gson:2.6.2'
implementation 'com.squareup.okhttp3:okhttp:3.9.0'
implementation "org.java-websocket:Java-WebSocket:1.4.0"
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'com.aliyun.dpa:oss-android-sdk:2.9.11'//SDKV2.4.1.25 以后需加入
2. AndroidManifest配置
添加权限
<!--网络-->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<!--文件读写-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!--deviceID-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!--相机-->
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<!-- 读取手机状态,获取IMEI -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
<!-- android 10 在application节点添加以下适配高版本 -->
android:usesCleartextTraffic="true"
android:requestLegacyExternalStorage="true"
3. 代码混淆
代码混淆文件proguard-project.txt,添加如下内容
-keep class com.turing.**{ *;}
-dontwarn com.turing.**
-keep class com.tuling.**{ *;}
-dontwarn com.tuling.**
-keep class org.java_websocket.**{*;}
-dontwarn org.java_websocket.**
-keep class org.slf4j.**{*;}
-dontwarn org.slf4j.**
-keep class org.eclipse.** { *; }
-dontwarn org.eclipse.**
4. SDK 初始化
使用OCR功能前调用,请先调用SDK初始化代码。SDK初始化详情见《Android SDK接入指南说明文档》
TuringInitializer.getInstance().initV3XXX()
5. 开启功能集成
使用说明见下面【功能集成】描述。
实例化
val turingOcr: ITuringOcr = TuringOcr.getInstance(this)
功能集成
init=>start: 初始化init
ocrMode=>operation: 设置模式setOcrMode
pre=>operation: 拍照takePicture
ocr=>operation: 传入图片ocr
deal=>operation: 处理结果
release=>end: 释放资源release
init->ocrMode->pre->ocr->deal->release
1. 初始化
调用所有OCR接口前,需要先调用初始化方法。
方法
void init(CameraConfig config, ViewGroup layout, TuringListenerPro<Boolean> listener);
输入说明
| 参数 | 类型 | 说明 |
|---|---|---|
| config | CameraConfig | 摄像头配置 |
| layout | ViewGroup | 预览界面的布局,建议使用FrameLayout |
| listener | TuringListenerPro\ |
回调接口 |
注: 如果不使用SDK 内置相机取图,那么config、layout字段传入null。
- CameraConfig 说明
| 参数 | 类型 | 取值范围 | 说明 |
|---|---|---|---|
| cameraId | int | 0:后置,1:前置 | 摄像头Id 1前置 0后置 |
| mirror | boolean | - | 图片是否镜像处理 |
| preMirror | boolean | - | 预览是否镜像处理 |
| rotation | int | 90,180,270,360 | 旋转角度 |
| pictureSize | android.util.Size | 摄像头支持的ImageFormat.JPEG拍照分辨率 | 图片分辨率 |
| previewSize | android.util.Size | 摄像头支持的分辨率 | 预览分辨率 |
| preRotation | int | 90,180,270,360 | 预览角度 |
| debugImage | boolean | - | 是否写入本地debug图片 存储路径:GlobalParams#debugPath 字段值 |
| quality | int | 0-100 | 图片质量 |
- TuringListenerPro 说明
```java
public interface TuringListenerPro
/**
* 事件回调
*
* @param event
*/
void onEvent(MessageEvent event);
/**
* 成功回调
* @param result 根据泛型返回对应结果
* @param extObject 拓展参数
*/
void onSuccess(T result,Object extObject);
} ```
- MessageEvent 说明
```java /* * 相机状态 * 时机:调用了开启相机方法 / public final static int CAMERA_STATES_OPENING = 1;
/* * 相机状态 * 时机:CameraDevice.StateCallback#onOpened / public final static int CAMERA_STATES_OPENED = 2;
/* * 相机状态 * 时机:调用了关闭相机方法 / public final static int CAMERA_STATES_CLOSEING = 3;
/* * 相机状态 * 时机:CameraDevice.StateCallback#onDisconnected / public final static int CAMERA_STATES_DISCONNECTED = 4;
/* * 相机状态 * 时机:CameraDevice.StateCallback#onClosed / public final static int CAMERA_STATES_CLOSED = 5;
/* * 相机状态 * 时机:CameraDevice.StateCallback#onError / public final static int CAMERA_STATES_ERROR = 6; ```
输出说明
listener 回调onSuccess(),true-初始化成功,false-初始化失败。
2. 使用SDK内部相机
用于OCR的图片可以是本地文件或相机。SDK封装了相机开发的方法,可直接使用。
注:如果通过SDK内部相机获取图片,那么初始化方法中config、layout字段不能为null。
2.1 获取图片
方法
void takePicture(TakePicListener listener);
输入说明
TakePicListener 说明
public interface TakePicListener {
/**
* 图片回调
* @param image 图片数据,格式为JPEG
*/
void onPicture(byte[] image);
/**
* 错误回调
* @param errorCode
* @param msg
*/
void onError(int errorCode,String msg);
}
2.2 暂停预览/ 重新预览
方法
/**
* 暂停预览(SDK内置Camera)
*/
void pausePreview();
/**
* 重新开始预览(SDK内置Camera)
*/
void resumePreview();
3. 设置 OCR 模式
方法
void setOcrMode(@OcrMode.Mode int mode);
调用 TuringOCR#ocr() 前设置OCR模式。
输入说明
OcrMode.Mode 说明
| 字段 | 说明 |
|---|---|
| OcrMode.PRINT_MIXED | 印刷通用 |
| OcrMode.PRINT_CN | 印刷中文 |
| OcrMode.PRINT_CHAR | 印刷英文+拼音 |
| OcrMode.HAND_MIXED | 手写体通用 |
4. 开启图片识别文本
方法
void ocr(Bitmap srcBmp, OcrConfig ocrConfig, TuringListenerPro<OcrResult> listener);
输入说明
| 参数 | 类型 | 说明 |
|---|---|---|
| srcBmp | Bitmap | 数据源。 要求:正向非镜像图片。 |
| ocrConfig | OcrConfig | 配置参数 |
| listener | TuringListenerPro\ |
回调接口 |
OcrConfig
| 参数 | 类型 | 取值范围 | 说明 |
|---|---|---|---|
| isPad | boolean | -- | 是否为平板 |
| openCoord | boolean | -- | 是否输出文本行的坐标 |
输出说明
OcrResult 说明
| 参数 | 类型 | 说明 |
|---|---|---|
| ocrData | String | 识别完整结果 |
| ocrDataArr | String[] | 文本分行的识别结果 |
| ocrPos2Src | int[][] | 文本行在原图上的坐标 |
5. 资源释放
方法
void release();
请求示例
//**** 如下代码为伪代码,具体代码见Demo ****//
//1. 能力初始化
turingOcr = TuringOcr.getInstance(this)
val builder = CameraConfig.Builder()
builder.setCameraId(0)
.setQuality(90)
.setMirror(false)
.setPreviewSize(Size(640, 480))
.setPictureSize(Size(2560, 1920))
.setPreRotation(180)
.setPreMirror(false)
.setDebugImg(true)
turingOcr.init(builder.build(), binding.frameLayout, object : TuringListenerPro<Boolean> {
override fun onError(errorCode: Int, errMsg: String?) {
showMsg(errMsg!!)
}
override fun onEvent(event: MessageEvent?) {
Log.e(TAG, "init event.code:${event?.code} msg:${event?.msg}")
}
override fun onSuccess(result: Boolean?, extObject: Any?) {
isInit = result!!
}
})
// 2. 设置识别模式
turingOcr.setOcrMode(OcrMode.PRINT_MIXED)
// 3. 拍照
turingOcr.takePicture(object : TakePicListener {
override fun onPicture(image: ByteArray?) {
image?.let {
bitmap = BitmapFactory.decodeByteArray(image, 0, it.size)
}
}
override fun onError(errorCode: Int, msg: String?) {
showToast(msg)
}
})
// 4. 识别
turingOcr.ocr(bitmap, OcrConfig.Builder().setPad(true).build(), object : TuringListenerPro<OcrResult> {
override fun onError(errorCode: Int, errMsg: String?) {
showToast(errMsg)
}
override fun onEvent(event: MessageEvent?) {
Log.e(TAG, "event.code:${event?.code} msg:${event?.msg}")
}
override fun onSuccess(result: OcrResult?, extObject: Any?) {
result?.let {
val stringBuilder = StringBuilder()
if (it.getOcrDataArr()!=null&& it.getOcrDataArr().isNotEmpty()){
for (str in it.getOcrDataArr()){
stringBuilder.append(str+"\n")
}
showMsg(stringBuilder.toString())
SDKLogUtil.e(TAG,stringBuilder.toString())
}else{
showMsg("未识别到文本")
}
} ?: run { showMsg("未识别到文本") }
}
})
// 5. 资源释放
turingOcr.release()