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

news2024/11/18 3:33:41

基本概念

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

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

运作机制

  • 文档检测

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

    图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() {
    @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>回调。

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>回调。

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

(可选)调用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.coloradmin.cn/o/682039.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java中如何实现字符串反转

java中如何实现字符串反转 方式1&#xff1a;通过创建StringBuilder或StringBuffer对象&#xff0c;并使用其reverse()方法实现字符串的反转 上代码&#xff1a; /*** 给定一个字符串&#xff0c;通过创建SpringBuilder对象的方式将字符串进行反转* return*/public static …

cadence从原理图到pcb

完成原理图设计后&#xff0c;需要进行如下步骤才能开始画PCB&#xff1a; 原理图规制检测(DRC)生成网表新建PCB文件&#xff0c;设置封装路径导入网表设置原点和栅格绘制PCB板框将器件导入PCB 原理图规制检测(DRC) 选中原理图文件&#xff0c;运行Tools->Design Rules C…

synchronized锁升级详细过程

目录 一、锁升级基础 1&#xff09;偏向锁 2&#xff09;轻量级锁&#xff08;自旋锁&#xff09; 3&#xff09;重量级锁 二、为什么要有锁升级过程&#xff1f; 1&#xff09;减少无竞争情况下的同步操作开销 2&#xff09;尽量避免线程切换的开销 3&#xff09;降低…

MySQL 数据库

文章目录 数据库的基本概念数据表数据库数据库管理系统数据库系统 数据库的发展史当今主流数据库介绍SQL Server &#xff08;微软公司产品&#xff09;Oracle &#xff08;甲骨文公司产品&#xff09;DB2 &#xff08;IBM公司产品&#xff09;MySQL &#xff08;甲骨文公司收购…

语法篇·Servlet基础

一、初识Servlet 1.1简介 Servlet是一种使用Java语言来开发动态网站的技术。Servlet是运行在Web服务器或应用服务器上的程序&#xff0c;它是作为来自Web浏览器或其他HTTP客户端的请求和HTTP服务器上的数据库或应用程序之间的中间层。Servlet可以收集来自网页表单的用户输入&a…

上位机与两台PLC之间无线以太网通信

本文以组态王和2台三菱FX5u PLC为例&#xff0c;介绍组态王与多台 PLC的无线以太网通信实现过程。在本方案中采用了三菱PLC无线通讯终端DTD419MB&#xff0c;作为实现无线通讯的硬件设备。 在这一无线以太网通讯系统的搭建中&#xff0c;用户无需更改网络参数和原有程序&#…

Java版本的工程项目管理系统源代码之工程项目管理系统面临的挑战 spring cloud +支持二开

管理方式 项目管理服务&#xff08;PM&#xff09; 是指工程项目管理企业按照合同约定&#xff0c;在工程项目决策阶段&#xff0c;为业主编制可行性研究报告&#xff0c;进行可行性分析和项目策划&#xff1b;在工程项目实施阶段&#xff0c;为业主提供招标代理、设计管理、采…

为什么个人项目我更推荐使用Caddy?

为什么个人项目我更推荐使用Caddy? 为什么个人项目我更推荐使用Caddy? 前言什么是Caddy?Caddy是够用且省心的简单的配置自动化 https结尾参考链接 前言 最近我把自己一些项目里面的 nginx 换成了 caddy&#xff0c;运转相当良好&#xff0c;比较开心&#xff0c;所以写了…

java 会员中心管理系统Myeclipse开发mysql数据库web结构jsp编程计算机网页项目

一、源码特点 JSP 会员中心管理系统 是一套完善的系统源码&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;以及相应配套的设计文档&#xff0c;系统主要采用B/S模式开发。 研究的基本内容是基于Web的会员中心管理系…

印刷企业使用MES生产管理系统后,会出现哪些弊端

MES生产管理系统是一种用于企业管理、控制和优化生产过程的管理软件。在印刷企业中&#xff0c;印刷MES管理系统可以帮助企业更好地管理生产过程&#xff0c;提高生产效率和质量。但是&#xff0c;在使用印刷MES管理系统时&#xff0c;也会存在一些弊端。本文将探讨这些弊端&am…

java版本Spring Cloud + Spring Boot +二次开发+企业电子招标采购系统源码

一、立项管理 1、招标立项申请 功能点&#xff1a;招标类项目立项申请入口&#xff0c;用户可以保存为草稿&#xff0c;提交。 2、非招标立项申请 功能点&#xff1a;非招标立项申请入口、用户可以保存为草稿、提交。 3、采购立项列表 功能点&#xff1a;对草稿进行编辑&#x…

基于轻量级yolov5s开发构建车道线实例分割检测识别系统

车道线实例分割检测是指利用计算机视觉技术对图像或视频中的车道线进行精确的识别和定位任务。该任务旨在区分和标记出每条独立的车道线&#xff0c;并提供它们的准确位置和形状信息。 实例分割是目标检测和语义分割的结合&#xff0c;不仅要找到目标的边界框&#xff0c;还需…

【AUTOSAR】AUTOSAR开发工具链(六)----MIL测试操作说明

1.1. 目的 - Objective 根据 ISO 26262 及本公司对基于模型开发时软件的测试要求&#xff0c; 为了使测试人员更加方便快捷地开始进行 MIL 测试&#xff0c;特编写并发布此规范。 2. MIL 测试流程概况 一、确保输入资料的齐全 二、制作测试案例&#xff0c; 并通过审查 三、制作…

最新导则下生态环评报告编制技术暨报告篇、制图篇、指数篇、综合应用篇教程

详情点击链接&#xff1a;最新导则下生态环评报告编制技术暨报告篇、制图篇、指数篇、综合应用篇 一&#xff0c;生态环评报告编制规范 结合生态环境影响评价最新导则&#xff0c;详述不同类型项目生态环评报告编制要求与规范 二&#xff0c;土地利用图 1、土地利用分类体系…

维也纳酒店资深投资人尹鹏伟:陪伴是最长情的告白!

今年以来&#xff0c;经济复苏不断加快&#xff0c;酒店行业迎来井喷式爆发。作为中国中端酒店“开山之作”&#xff0c;在中端酒店风起云涌&#xff0c;内卷加剧&#xff0c;竞争激烈的当下&#xff0c;维也纳酒店却能在全国287个大中小城市在营门店超1300家&#xff0c;在中端…

【AUTOSAR】AUTOSAR开发工具链(七)----HIL测试操作说明(1)

1. HIL 设备操作 本操作说明适用硬件 dSPACE 1006 &#xff0c;软件 dSPACE ControlDesk 3.7.4。 1.1. 硬件操作流程 打开电脑主机 插入 licence 打开 dSPACE 电源开关。 1.2. 软件操作流程 1.2.1. 模型导入与运行 点击 dSPACE ControlDesk 3.7.4 图标进入操作界面。 进入操作…

网页也能裸眼3D?只需一个电脑摄像头就能完成

和2D显示屏、手机屏幕相比&#xff0c;VR图像为什么看起来更加沉浸、立体呢&#xff1f;一方面是透镜将左右眼图像结合&#xff0c;形成3D视觉效果&#xff0c;而另一方面则归功于屏幕画面与头部追踪的同步作用。 简单来讲&#xff0c;就是VR会根据用户头部的位置和朝向来改变…

高工奖项|如何破解智能汽车「缺芯少魂」?破冰者已经出现

对于智能驾驶赛道来说&#xff0c;2023年将是至关重要的一年。芯片短缺影响正在逐步得到缓解&#xff0c;但车市不确定性正在加剧&#xff0c;同时&#xff0c;车企在智能化普及上的成本压力也在凸显。 高工智能汽车研究院监测数据显示&#xff0c;2022年度中国市场&#xff08…

JS--一

三目运算 &#xff1a;用于赋值 switch case return 遍历数组&#xff1a; 一般不用for...in 遍历数组&#xff0c;是因为 for...in 遍历的数组下标&#xff0c;是 字符串形 而是用for...in 遍历 对象 时间监听--addEventListener 时间类型 一定加引号&#xff01;&#xf…

[Web程序设计]实验: 请求与响应

一、实验目的 &#xff08;1&#xff09;掌握浏览器请求时数据的传递和获取。 &#xff08;2&#xff09;掌握服务端响应时数据的传递及获取。 二、实验内容 &#xff08;1&#xff09;编写一个类&#xff0c;该类能够实现在访问完Servlet后&#xff0c;还能在浏览器地址栏…