首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

鸿蒙HarmonyOS开发实战—AI功能开发(文档检测校正)

  • 25-02-22 03:41
  • 3590
  • 11251
blog.csdn.net
基本概念

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

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

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

  1. {
  2. "resultCode":0,
  3. "doc":
  4. "{
  5. \"bottom_left\":{\"x\":17,\"y\":440},
  6. \"bottom_right\":{\"x\":589,\"y\":760},
  7. \"top_left\":{\"x\":256,\"y\":13},
  8. \"top_right\":{\"x\":829,\"y\":332}
  9. }"
  10. }

复制

  • 该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 visionCallBack);

复制

其中:

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

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

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

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

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

复制

其中:

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

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

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

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

开发步骤

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

  1. import ohos.ai.cv.common.ConnectionCallback;
  2. import ohos.ai.cv.common.VisionCallback;
  3. import ohos.ai.cv.common.VisionImage;
  4. import ohos.ai.cv.common.VisionManager;
  5. import ohos.ai.cv.common.ImageResult;
  6. import ohos.ai.cv.docrefine.DocCoordinates;
  7. import ohos.ai.cv.docrefine.DocRefineConfiguration;
  8. import ohos.ai.cv.docrefine.IDocRefine;
  9. import ohos.app.Context;
  10. import ohos.media.image.PixelMap;

复制

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

  1. ConnectionCallback connectionCallback = new ConnectionCallback() {
  2. @Override
  3. public void onServiceConnect() {
  4. // 定义连接能力引擎成功后的操作。
  5. }
  6. @Override
  7. public void onServiceDisconnect() {
  8. // 定义连接能力引擎失败后的操作。
  9. }
  10. };

复制

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

  1. VisionCallback<DocCoordinates> callback= new VisionCallback<DocCoordinates>() {
  2. @Override
  3. public void onResult(DocCoordinates docCoordinates) {
  4. // 对正确获得的结果进行处理。
  5. }
  6. @Override
  7. public void onError(int i) {
  8. // 处理错误返回码。
  9. }
  10. @Override
  11. public void onProcessing(float v) {
  12. // 返回处理进度。
  13. }
  14. };

复制

说明 在异步模式下,该类的onResult()方法用于获得检测的结果docCoordinates(内含检测到的文档坐标);onError()方法用于处理错误返回码;onProcessing()方法用于返回处理进度,目前没有实现此接口的功能。 同步与异步模式区别在于docDetect()的最后一个参数visionCallback是否为空。若非空则为异步模式,此时会忽略自定义的DocCoordinates输入docCoordinates,接口调用结果一律从回调函数visionCallback获得。

实例化ImageResult对象imageResult。

ImageResult imageResult = new ImageResult();

复制

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

(可选)定义VisionCallback回调。

  1. VisionCallback<ImageResult> callback = new VisionCallback<ImageResult>() {
  2. @Override
  3. public void onResult(ImageResult imageResult) {
  4. // 对正确获得的结果进行处理。
  5. }
  6. @Override
  7. public void onError(int i) {
  8. // 处理错误返回码。
  9. }
  10. @Override
  11. public void onProcessing(float v) {
  12. // 返回处理进度。
  13. }
  14. };

复制

说明

  • 在异步模式下,该类的onResult()方法用于获得校正的结果imageResult(内含校正后的图片);onError()方法用于处理错误返回码;onProcessing()方法用于返回处理进度,目前没有实现此接口的功能。
  • 同步与异步模式区别在于docRefine()的最后一个参数visionCallback是否为空。若非空则为异步模式。此时会忽略自定义的ImageResult输入imageResult,接口调用结果一律从回调类visionCallback获得。

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

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

复制

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

result = docRefine.prepare();

复制

  1. 说明
  2. 如果返回的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()方法,释放图片内存。

  1. result = docRefine.release();
  2. if (pixelMap != null) {
  3. pixelMap.release();
  4. pixelMap = null;
  5. }

复制

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

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

VisionManager.destroy();

最后,为了能让大家更好的去学习提升鸿蒙 (Harmony OS) 开发技术,小编连夜整理了一份30个G纯血版学习资料(含视频、电子书、学习文档等)以及一份在Github上持续爆火霸榜的《纯血版华为鸿蒙 (Harmony OS)开发手册》(共计890页),希望对大家有所帮助。

纯血版鸿蒙 HarmonyOS 4.0 视频学习资料

 需要以上视频学习资料小伙伴

请点击→纯血版全套鸿蒙HarmonyOS学习资料


《纯血版华为鸿蒙 (Harmony OS)开发手册》

这份手册涵盖了当前鸿蒙 (Harmony OS) 开发技术必掌握的核心知识点

纯血版鸿蒙 (Harmony OS)开发手册部分精彩内容

HarmonyOS 概念:

  • 系统定义
  • 技术架构
  • 技术特性
  • 系统安全

如何快速入门?

  • 基本概念
  • 构建第一个ArkTS应用
  • 构建第一个JS应用
  • ……


开发基础知识: 

  • 应用基础知识
  • 配置文件
  • 应用数据管理
  • 应用安全管理
  • 应用隐私保护
  • 三方应用调用管控机制
  • 资源分类与访问
  • 学习ArkTS语言
  • ……

基于ArkTS 开发:

  • Ability开发
  • UI开发
  • 公共事件与通知
  • 窗口管理
  • 媒体
  • 安全
  • 网络与链接
  • 电话服务
  • 数据管理
  • 后台任务(Background Task)管理
  • 设备管理
  • 设备使用信息统计
  • DFX
  • 国际化开发
  • 折叠屏系列
  • .……

获取以上文中提到的这份纯血版鸿蒙 (Harmony OS) 开发资料的小伙伴 

请点击→纯血版全套鸿蒙HarmonyOS学习资料


?写在最后

  • 如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
  • 关注小编,同时可以期待后续文章ing?,不定期分享原创知识。
  • 想要获取更多完整鸿蒙最新VIP学习资料,请点击→纯血版全套鸿蒙HarmonyOS学习资料

文章知识点与官方知识档案匹配,可进一步学习相关知识
Python入门技能树首页概览452911 人正在系统学习中
最新鸿蒙Next全套学习资料请扫码
微信名片
注:本文转载自blog.csdn.net的蜀道山QAQ的文章"https://blog.csdn.net/shudaoshanQAQ/article/details/135796643"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top