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();
相关文章
|
4天前
|
机器学习/深度学习 人工智能 自然语言处理
突破AI大模型工业化开发,生成式AI迎来全链条服务商
突破AI大模型工业化开发,生成式AI迎来全链条服务商
突破AI大模型工业化开发,生成式AI迎来全链条服务商
|
4天前
|
人工智能 自然语言处理 Java
Spring AI,Spring团队开发的新组件,Java工程师快来一起体验吧
文章介绍了Spring AI,这是Spring团队开发的新组件,旨在为Java开发者提供易于集成的人工智能API,包括机器学习、自然语言处理和图像识别等功能,并通过实际代码示例展示了如何快速集成和使用这些AI技术。
Spring AI,Spring团队开发的新组件,Java工程师快来一起体验吧
|
5天前
|
机器学习/深度学习 人工智能 搜索推荐
AI低代码平台:创新开发新选择
Zoho Creator、Airtable、Appian、Creatio Atlas及织信等低代码平台,通过集成AI功能如预测分析、情感分析、自动化文案创作等,显著提升了开发效率与智能化水平。例如,Zoho Creator利用AI预测客户需求并分析情绪;Airtable借助OpenAI模型自动生成代码与文案;Appian通过AI技能自动处理文档与邮件;Creatio Atlas运用AI优化决策流程并提供个性化推荐;织信则集成ChatGPT与Stable Diffusion,实现智能开发与图像生成。这些平台不仅支持多种业务场景,还简化了应用程序开发流程。
20 5
|
7天前
|
机器学习/深度学习 人工智能 Linux
【机器学习】Dify:AI智能体开发平台版本升级
【机器学习】Dify:AI智能体开发平台版本升级
39 0
|
12月前
|
IDE JavaScript API
HarmonyOS开发第一步,熟知开发工具DevEco Studio
本文主要以常见的功能点作为概述希望可以帮助到学习HarmonyOS的开发者。
370 0
|
21天前
|
存储 开发框架 安全
鸿蒙 HarmonyOS NEXT星河版APP应用开发-阶段一
HarmonyOS NEXT星河版的应用开发标志着华为分布式操作系统的全新篇章,它聚焦于打造原生精致、易用、流畅、安全、智能和互联的极致体验。开发者可以利用其先进的API和工具集,如DevEco Studio,构建高性能、跨设备无缝协同的应用程序,从而充分利用HarmonyOS的分布式能力,为用户带来一致且丰富的多场景数字生活体验。随着“学习强国”、岚图汽车、中国电信等知名企业和应用的加入,鸿蒙生态正迅速扩展,引领着原生应用开发的新趋势。
39 3
鸿蒙 HarmonyOS NEXT星河版APP应用开发-阶段一
|
1月前
|
人工智能 搜索推荐 数据可视化
鸿蒙应用实践:利用扣子API开发起床文案生成器
本文将使用扣子(coze)智能体API开发一个起床文案生成器,用于自己的鸿蒙应用中生成”千人千面“的起床文案。
53 0
|
3月前
|
JavaScript API
鸿蒙开发接口UI界面:【@ohos.mediaquery (媒体查询)】
鸿蒙开发接口UI界面:【@ohos.mediaquery (媒体查询)】
48 1
|
12月前
|
开发框架
HarmonyOS学习路之方舟开发框架—学习ArkTS语言(状态管理 四)
被@Observed装饰的类,可以被观察到属性的变化;子组件中@ObjectLink装饰器装饰的状态变量用于接收@Observed装饰的类的实例,和父组件中对应的状态变量建立双向数据绑定。这个实例可以是数组中的被@Observed装饰的项,或者是class object中是属性,这个属性同样也需要被@Observed装饰。单独使用@Observed是没有任何作用的,需要搭配@ObjectLink或者@Prop使用。
|
人工智能 JSON API
HarmonyOS学习路之开发篇—AI功能开发(语音识别)
语音识别功能提供面向移动终端的语音识别能力。它基于华为智慧引擎(HUAWEI HiAI Engine)中的语音识别引擎,向开发者提供人工智能应用层API。该技术可以将语音文件、实时语音数据流转换为汉字序列,准确率达到90%以上(本地识别95%)。