跳转至

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 errorCode * @param errMsg / void onError(int errorCode, String errMsg);

  /**
   * 事件回调
   *
   * @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()