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

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

基本概念

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


文档检测:能够自动识别图片中的文档,返回文档在原图中的位置信息。这里的文档泛指外形方正的事物,比如书本、相片、画框等。

文档校正:能根据文档在原始图片中的位置信息校正文档的拍摄角度,自动将拍摄视角调整到正对文档的角度上。

运作机制

文档检测

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


图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 图片中的校正区域

4bb6d0bfeb8e1f388155613a265ca506.png



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


图3 校正完成的文档图片



b441b74446d6c9925dbf658475efca4c.png

约束与限制

支持处理的图片格式包括JPEG、JPG、PNG,最终输出的图片仅支持JPEG格式。

拍摄时尽量将文档放置在与文档背景色有一定色差的平面上,并尽量让文档充满画面,保持文档边界入镜,以获得最佳效果。

输入图片高和宽最小为100像素,最大为10000像素。

文档检测校正开发

场景介绍

将纸质信件等旧文档翻拍成电子版,帮助改善旧文档的翻拍效果。

记录书画展览中的精彩作品,帮助将作品拍摄得更加端正。

接口说明

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


setVisionConfiguration是IDocRefine接口的成员。通过传入的DocRefineConfiguration,选择需要调用的文档校正类型。

void setVisionConfiguration(DocRefineConfiguration docRefineConfiguration);

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

image.png



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

结果码定义如下表:

image.pngimage.png

调用IDocRefine的docRefine()方法:


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

或者

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

说明


同步模式调用完成时,该函数立即返回结果码。

异步模式调用请求发送成功时,该函数返回结果码700。如果返回其他的值,说明异步调用请求不成功,需要先处理错误,回调函数不会被调用。

如果异步模式调用请求发送成功,则校正完成后,相应的回调函数会被自动调用。

如果onResult()回调被调用,说明校正成功,相当于同步模式结果码为0的情况。

如果onError()方法被调用,说明校正发生了错误,具体的调用结果码将由onError()的参数接收。

结果码定义如下表:

image.pngimage.png



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


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

说明


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


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


VisionManager.destroy();
目录
打赏
0
0
1
0
2
分享
相关文章
【04】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-正确安装鸿蒙SDK-结构目录介绍-路由介绍-帧动画(ohos.animator)书写介绍-能够正常使用依赖库等-ArkUI基础组件介绍-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
【04】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-正确安装鸿蒙SDK-结构目录介绍-路由介绍-帧动画(ohos.animator)书写介绍-能够正常使用依赖库等-ArkUI基础组件介绍-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
48 5
【04】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-正确安装鸿蒙SDK-结构目录介绍-路由介绍-帧动画(ohos.animator)书写介绍-能够正常使用依赖库等-ArkUI基础组件介绍-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
AI新手村文档!小白教程,其实 AI 并不难
AI新手村文档!小白教程,其实 AI 并不难
使用通义灵码AI高效学习muduo网络库开发指南
Muduo 是一个基于 C++11 的高性能网络库,支持多线程和事件驱动,适用于构建高效的服务器和应用程序。它提供 TCP/IP 协议支持、异步非阻塞 I/O、定时器、异步日志等功能,并具备跨平台特性。通过 Git 克隆 muduo 仓库并切换至 C++17 分支可开始使用。借助 AI 工具如 Deepseak-v3,用户可以更便捷地学习和理解 Muduo 的核心模块及编写测试用例,提升开发效率。
HarmonyOS NEXT开发-ArkUI六
本文介绍了颜色渐变(线性渐变和径向渐变)与阴影效果的应用,通过具体代码示例展示了如何在组件中实现这些视觉效果,帮助开发者提升界面美观度。君志所向,一往无前,欢迎一起探索! 简介字数:239
13 0
HarmonyOS NEXT开发-ArkUI六
HarmonyOS NEXT开发-ArkUI八
本文介绍了Harmony OS开发中的线性布局技巧,包括交叉轴对齐、自适应缩放及综合实践案例,帮助开发者轻松掌握相关技能。每天学习一个知识点,一起加油!
14 0
HarmonyOS NEXT开发-ArkUI八
HarmonyOS NEXT开发-ArkUI十二
网格布局(Grid)适用于由多行列组成的复杂界面,支持固定行列、合并单元格及滚动效果。其应用场景广泛,如文件管理、购物列表等。通过设置`columnsTemplate`和`rowsTemplate`可定义行列比例,使用`GridItem`组件实现内容展示。此外,还能通过自定义滚动条优化用户体验。代码示例展示了如何创建固定行列、合并单元格以及实现滚动效果的网格布局。 关注程序员Feri,了解更多实用技术与搞钱技巧,一起在编程道路上不断前行!
18 0
HarmonyOS NEXT开发-ArkUI十二
Harmony os next~UI开发与ArkUI框架
鸿蒙OS的UI开发基于ArkUI框架,采用声明式编程,简化开发流程。五大核心组件(Text、Button、List、Grid、Flex)助力高效布局,支持数据绑定与动态更新。事件响应机制灵敏,适合构建交互丰富的应用。实战技巧包括规范命名、样式复用和调试方法。掌握这些,轻松开发鸿蒙应用。下期预告:分布式开发,记得带上烤冷面!
14 0
Harmony os next~HarmonyOS Ability与页面跳转开发详解
HarmonyOS采用分布式架构,其Ability体系包括Page、Service、Data和Form四大类型Ability。Page Ability支持多页面跳转与数据传递,Service Ability用于后台任务,Data Ability提供数据共享接口,Form Ability实现轻量化卡片服务。本文详细解析了各Ability的开发方法、生命周期管理、跨Ability通信及最佳实践,帮助开发者掌握HarmonyOS应用开发的核心技能。
22 0
探索HarmonyOS在智慧出行领域的AI类目标签应用
在科技飞速发展的今天,智慧出行成为交通领域的重要发展方向。HarmonyOS凭借强大的系统能力,为智慧出行注入新活力,特别是在AI类目标签技术的应用上。通过精准分类和标签化处理车辆、路况及出行者数据,AI类目标签技术提升了出行体验与交通管理效率。HarmonyOS的分布式软总线技术和隐私保护机制,确保了设备间的无缝连接与数据安全。实际应用中,该技术助力智能交通管理和个性化出行服务,为解决交通拥堵、优化资源配置提供了新思路。开发者也迎来了广阔的机遇与挑战,共同推动智慧出行的美好未来。
让教育更智能:HarmonyOS助力AI类目标签革新教育行业
在科技飞速发展的当下,教育行业正经历深刻变革,智能化转型成为提升教育质量与效率的关键。AI类目标签技术脱颖而出,通过分析学生多维度数据生成个性化学习标签,助力因材施教;智能管理教学资源,提高备课效率。HarmonyOS NEXT API 12及以上版本的分布式能力和强大的数据安全机制,为多设备协同学习和数据保护提供了有力支持。开发者可利用鸿蒙生态构建创新教育应用,推动教育智能化发展。

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等