HarmonyOS-鸿蒙app开发 —基于javaAI文档检测校正开发指导

HarmonyOS-鸿蒙app开发 —基于javaAI文档检测校正开发指导

场景介绍

  • 将纸质信件等旧文档翻拍成电子版,帮助改善旧文档的翻拍效果。
  • 记录书画展览中的精彩作品,帮助将作品拍摄得更加端正。

接口说明

文档校正提供了setVisionConfiguration()、docDetect()和docRefine()三个函数接口。

  • setVisionConfiguration是IDocRefine接口的成员。通过传入的DocRefineConfiguration,选择需要调用的文档校正类型。
    1. void setVisionConfiguration(DocRefineConfiguration docRefineConfiguration);

    下表列出了DocRefineConfiguration的常用设置:

    接口

    参数名

    类型

    参数说明

    setProcessMode()

    mode

    int

    进程模式定义:

    VisionConfiguration.MODE_IN(同进程调用)

    VisionConfiguration.MODE_OUT(跨进程调用)

    默认值为VisionConfiguration.MODE_OUT。

  • 调用IDocRefine的docDetect()方法,获取检测结果。
    1. int docDetect(VisionImage image, DocCoordinates result, VisionCallback<DocCoordinates> visionCallBack);

    其中:

    image为待文档检测的输入图片。

    如果visionCallback为null,执行同步调用,结果码由方法返回,检测结果由result返回。

    如果visionCallback为有效的回调函数,则该函数为异步调用,函数返回时result中的值无效,实际识别结果由回调函数返回。

    同步模式调用成功时,该函数返回结果码0。异步模式调用请求发送成功时,该函数返回结果码700。

  • 调用IDocRefine的docRefine()方法,获取校正结果。
    1. int docRefine(VisionImage image, DocCoordinates coordinates, ImageResult result,
    2. VisionCallback<ImageResult> visionCallBack);

    其中:

    image为待文档校正的输入图片。

    如果visionCallback为null,执行同步调用,结果码由方法返回,校正结果由result中返回。

    如果visionCallback为有效的回调函数,则该函数为异步调用,函数返回时result中的值无效,实际识别结果由回调函数返回。

    同步模式调用成功时,该函数返回结果码0。异步模式调用请求发送成功时,该函数返回结果码700。

开发步骤

在使用文档校正时,先将相关的类添加至工程。

import ohos.ai.cv.common.ConnectionCallback;
import ohos.ai.cv.common.VisionCallback;
import ohos.ai.cv.common.VisionImage;
import ohos.ai.cv.common.VisionManager;
import ohos.ai.cv.common.ImageResult;
import ohos.ai.cv.docrefine.DocCoordinates;
import ohos.ai.cv.docrefine.DocRefineConfiguration;
import ohos.ai.cv.docrefine.IDocRefine;
import ohos.app.Context;
import ohos.media.image.PixelMap;

定义ConnectionCallback回调,实现连接能力引擎成功与否后的操作。

ConnectionCallback connectionCallback = new ConnectionCallback() {
@Override
public void onServiceConnect() {
// 定义连接能力引擎成功后的操作。
}

@Override
public void onServiceDisconnect() {
// 定义连接能力引擎失败后的操作。
}
};

调用VisionManager.init()方法,将此工程的context和已经定义的connectionCallback 作为入参,建立与能力引擎的连接,context应为ohos.aafwk.ability.Ability或ohos.aafwk.ability.AbilitySlice的实例或子类实例。

int result = VisionManager.init(context, connectionCallback);

在收到onServiceConnect回调连接服务成功后,实例化IDocRefine接口,将此工程的context作为入参,context应为ohos.aafwk.ability.Ability或ohos.aafwk.ability.AbilitySlice的实例或子类实例。

IDocRefine docRefine = VisionManager.getDocRefine(context);

实例化VisionImage对象image,并传入待校正图片pixelMap。

VisionImage image = VisionImage.fromPixelMap(pixelMap);

实例化DocCoordinates对象docCoordinates。

DocCoordinates docCoordinates = new DocCoordinates();

说明

该类在同步模式下用于存放检测接口docDetect()传出的文档位置结果。

VisionCallback<DocCoordinates> callback= new VisionCallback<DocCoordinates>() {
@Override
public void onResult(DocCoordinates docCoordinates) {
// 对正确获得的结果进行处理。
}
@Override
public void onError(int i) {
// 处理错误返回码。
}
@Override
public void onProcessing(float v) {
// 返回处理进度。
}
};
说明

在异步模式下,该类的onResult()方法用于获得检测的结果docCoordinates(内含检测到的文档坐标);onError()方法用于处理错误返回码;onProcessing()方法用于返回处理进度,目前没有实现此接口的功能。

同步与异步模式区别在于docDetect()的最后一个参数visionCallback是否为空。若非空则为异步模式,此时会忽略自定义的DocCoordinates输入docCoordinates,接口调用结果一律从回调函数visionCallback获得。

实例化ImageResult对象imageResult。

ImageResult imageResult = new ImageResult();
说明

该类在同步模式下用于存放校正docRefine()方法传出的图片结果。

VisionCallback<ImageResult> callback = new VisionCallback<ImageResult>() {
@Override
public void onResult(ImageResult imageResult) {
// 对正确获得的结果进行处理。
}
@Override
public void onError(int i) {
// 处理错误返回码。
}
@Override
public void onProcessing(float v) {
// 返回处理进度。
}
};
说明
  • 在异步模式下,该类的onResult()方法用于获得校正的结果imageResult(内含校正后的图片);onError()方法用于处理错误返回码;onProcessing()方法用于返回处理进度,目前没有实现此接口的功能。
  • 同步与异步模式区别在于docRefine()的最后一个参数visionCallback是否为空。若非空则为异步模式。此时会忽略自定义的ImageResult输入imageResult,接口调用结果一律从回调类visionCallback获得。

通过DocRefineConfiguration配置校正参数,可选择进程调用模式等(推荐使用MODE_IN同进程模式),跨进程模式(MODE_OUT)下调用方与能力引擎处于不同进程;同进程模式(MODE_IN)下,能力引擎在调用方进程中实例化,调用方通过反射的方式调用引擎里的文档校正能力。以同进程调用为例:

DocRefineConfiguration.Builder builder = new DocRefineConfiguration.Builder();
builder.setProcessMode(VisionConfiguration.MODE_IN);
DocRefineConfiguration configuration = builder.build();
docRefine.setVisionConfiguration(configuration);

  1. (可选)调用IDocRefine的prepare()方法。
    1. result = docRefine.prepare();
    说明

    如果返回的result不为0,说明当前文档校正能力准备失败,需要处理错误,不再执行以后的动作。在docDetect()和docRefine()方法中会首先调用prepare()启动引擎,如果引擎已经启动则不会再次启动。

  2. 调用IDocRefine的docDetect()方法:
    1. result = docRefine.docDetect(image, docCoordinates, null); // 同步

    或者:

    1. result = docRefine.docDetect(image, null, callback); // 异步
    说明
    • 同步模式调用完成时,该函数立即返回结果码。
    • 异步模式调用请求发送成功时,该函数返回结果码700。如果返回其他的值,说明异步调用请求不成功,需要先处理错误,回调函数不会被调用。
    • 如果异步模式调用请求发送成功,则检测完成后,相应的回调函数会被自动调用。
      • 如果onResult()回调被调用,说明检测成功,相当于同步模式结果码为0的情况。
      • 如果onError()方法被调用,说明检测发生了错误,具体的调用结果码将由onError()的参数接收。
    1. 结果码定义如下表:

      结果码

      说明

      0

      成功

      -1

      未知错误

      -2

      不支持的功能或接口

      -3

      内存分配失败或创建对象失败

      -4

      所需库加载失败

      -10

      引擎开关已经关闭

      101

      失败

      102

      超时

      200

      输入参数不合法(图片尺寸错误)

      201

      输入参数不合法(为空)

      210

      输入参数合法

      500

      服务绑定异常

      521

      服务绑定异常断开

      522

      服务已连接

      600

      模型文件异常

      601

      模型文件不存在

      602

      模型加载失败

      700

      异步调用请求发送成功

      1001

      神经网络处理单元错误

      调用IDocRefine的docRefine()方法:

    result = docRefine.docRefine(image, docCoordinates, imageResult, null); // 同步

    或者:

    result = docRefine.docRefine(image, docCoordinates, null, callback); // 异步

    说明
    • 同步模式调用完成时,该函数立即返回结果码。
    • 异步模式调用请求发送成功时,该函数返回结果码700。如果返回其他的值,说明异步调用请求不成功,需要先处理错误,回调函数不会被调用。
    • 如果异步模式调用请求发送成功,则校正完成后,相应的回调函数会被自动调用。
      • 如果onResult()回调被调用,说明校正成功,相当于同步模式结果码为0的情况。
      • 如果onError()方法被调用,说明校正发生了错误,具体的调用结果码将由onError()的参数接收。

    结果码定义如下表:

    1. 结果码

      说明

      0

      成功

      -1

      未知错误

      -2

      不支持的功能或接口

      -3

      内存分配失败或创建对象失败

      -4

      所需库加载失败

      -10

      引擎开关已经关闭

      101

      失败

      102

      超时

      200

      输入参数不合法(图片尺寸错误)

      201

      输入参数不合法(为空)

      210

      输入参数合法

      500

      服务绑定异常

      521

      服务绑定异常断开

      522

      服务已连接

      600

      模型文件异常

      601

      模型文件不存在

      602

      模型加载失败

      700

      异步调用请求发送成功

      1001

      神经网络处理单元错误

      调用IDocRefine的release()方法,释放资源。调用pixelMap的release()方法,释放图片内存。

    result = docRefine.release();
    if (pixelMap != null) {
    pixelMap.release();
    pixelMap = null;
    }

    说明

    不再使用文档校正能力时,调用release()方法释放资源。

    调用VisionManager.destroy()方法,断开与能力引擎的连接。

    VisionManager.destroy();
🚀 如未找到文章请搜索栏搜素 | Ctrl+D收藏本站 | 联系邮箱:15810050733@qq.com