HarmonyOS学习路之开发篇—AI功能开发(文档检测校正)

news/2024/11/23 3:25:53/

基本概念

文档校正提供了文档翻拍过程的辅助增强功能,包含两个子功能:

  • 文档检测:能够自动识别图片中的文档,返回文档在原图中的位置信息。这里的文档泛指外形方正的事物,比如书本、相片、画框等。
  • 文档校正:能根据文档在原始图片中的位置信息校正文档的拍摄角度,自动将拍摄视角调整到正对文档的角度上。

运作机制

  • 文档检测

    调用文档检测接口,识别图片中的文档,返回文档在原图中的位置信息。

    图1 含有文档的图片

 如上图中的红点所示,文档检测接口返回了图中相片文档四个顶点相对图像左上角的坐标信息。文档检测结果如下:

{"resultCode":0,"doc":"{\"bottom_left\":{\"x\":17,\"y\":440},\"bottom_right\":{\"x\":589,\"y\":760},\"top_left\":{\"x\":256,\"y\":13},\"top_right\":{\"x\":829,\"y\":332}}"
}
  • 该JSON保存了原图中相片文档四个角相对原图左上顶点的坐标信息(单位:像素),其中resultCode为返回码。

  • 文档校正

    根据文档在原始图片中的位置信息校正文档的拍摄角度(可自定义校正的区域)。

    图2 图片中的校正区域

校正上图中深蓝色矩形(文档检测接口返回的文档区域)区域,校正后的效果如下图:

图3 校正完成的文档图片

约束与限制

  • 支持处理的图片格式包括JPEG、JPG、PNG,最终输出的图片仅支持JPEG格式。
  • 拍摄时尽量将文档放置在与文档背景色有一定色差的平面上,并尽量让文档充满画面,保持文档边界入镜,以获得最佳效果。
  • 输入图片高和宽最小为100像素,最大为10000像素。

文档检测校正开发

场景介绍

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

接口说明

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

  • setVisionConfiguration是IDocRefine接口的成员。通过传入的DocRefineConfiguration,选择需要调用的文档校正类型。
void setVisionConfiguration(DocRefineConfiguration docRefineConfiguration);
  • 下表列出了DocRefineConfiguration的常用设置:

    接口

    参数名

    类型

    参数说明

    setProcessMode()

    mode

    int

    进程模式定义:

    VisionConfiguration.MODE_IN(同进程调用)

    VisionConfiguration.MODE_OUT(跨进程调用)

    默认值为VisionConfiguration.MODE_OUT。

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

其中:

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

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

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

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

  • 调用IDocRefine的docRefine()方法,获取校正结果。
int docRefine(VisionImage image, DocCoordinates coordinates, ImageResult result,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() {@Overridepublic void onServiceConnect() {// 定义连接能力引擎成功后的操作。}@Overridepublic 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>回调。

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

说明

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

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

实例化ImageResult对象imageResult。

ImageResult imageResult = new ImageResult();

说明

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

(可选)定义VisionCallback<ImageResult>回调。

VisionCallback<ImageResult> callback = new VisionCallback<ImageResult>() {@Overridepublic void onResult(ImageResult imageResult) {// 对正确获得的结果进行处理。}@Overridepublic void onError(int i) {// 处理错误返回码。}@Overridepublic 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);

(可选)调用IDocRefine的prepare()方法。

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

调用IDocRefine的docDetect()方法:

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

或者

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

说明

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

结果码定义如下表:

结果码

说明

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()的参数接收。

结果码定义如下表:

结果码

说明

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();

http://www.ppmy.cn/news/563345.html

相关文章

如何在C语言中实现栈和队列数据结构?

首先&#xff0c;我们都知道栈&#xff08;Stack&#xff09;是一种后进先出&#xff08;LIFO&#xff09;的数据结构&#xff0c;就像是一叠放在一起的盘子。你会发现&#xff0c;刚才我说的这句话就像是栈的定义&#xff0c;后面的话要等前面的话都处理完才能说。所以&#x…

Facebook Insights分析工具解读,掌握关键数据指标

什么是Facebook Insights&#xff1f; Facebook Insights是Facebook平台上的一项内置分析工具&#xff0c;旨在帮助企业和品牌了解其在Facebook上的表现和受众互动情况。该工具提供了丰富的数据和指标&#xff0c;可以帮助用户洞察粉丝群体、了解发布内容的表现&#xff0c;并…

笔记本电脑键盘坏了,有密码应该如何打开?(生活小技巧)

有时候笔记本电脑的键盘突然坏了&#xff0c;在笔记本电脑有密码的情况下我们却又急需笔记本里的资料应该怎么办呢。&#xff08;方法很多&#xff0c;这里只说最简单的一种&#xff09; 1.首先打开笔记本&#xff0c;生成登录页面后&#xff0c;看左下角&#xff0c;点开它&a…

Vlan(Access、Trunk、Hybrid)与ARP(免费ARP)讲解

目录 Vlan讲解 Vlan标签 二层接口类型 ARP ARP的作用 ARP地址解析报文讲解 免费ARP报文讲解 ARP缓存表 Vlan讲解 Vlan&#xff08;Virtual Local Area Network&#xff09;虚拟局域网&#xff0c;将一个物理的LAN在逻辑上划分为多个广播域&#xff1b;可以理解为一个V…

计算机键盘时好时坏,为何键盘时好时坏有时就用不成了

其实这个问题我自己解决了&#xff0c;自问自答&#xff0c;把方法和大家共享&#xff1a; 方法就是&#xff1a;关键盘大法 1、 把G6先关闭&#xff0c;然后在IVT BLUESOLEIL的控制面板里&#xff0c;点搜索设备&#xff0c;同时&#xff0c;打开蓝牙键盘G6的开关&#xff0c;…

计算机密码无法输完整,笔记本电脑键盘失灵无法输入密码怎么解决

很多朋友平时在使用笔记本电脑的时候&#xff0c;为了保护个人的隐私安全&#xff0c;通常都会给电脑设置上开机密码&#xff0c;但是当我们的笔记本电脑键盘失灵无法输入字符时&#xff0c;笔记本从关机的状态启动进入输入锁屏密码界面的时候&#xff0c;又能怎样解决呢&#…

笔记本电脑键盘帽坏掉了

请人帮修好。还是有人帮修好。真快&#xff0c;又清松

以太网通信的回环测试

PHY 芯片通常带有回环&#xff08;Loopback&#xff09;功能&#xff0c;用于 PHY 通信链路的测试。本文主要讨论三种常用 PHY 芯片的回环功能&#xff0c;并使用 Broadcom 的 B50612D 芯片进行 PHY 回环测试。 1 常见PHY芯片的回环功能 1.1 KSZ9031 KSZ9031 芯片支持以下两种…