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

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

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

{
“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 visionCallBack);

复制

其中:

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

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

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

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

  • 调用IDocRefine的docRefine()方法,获取校正结果。

int docRefine(VisionImage image, DocCoordinates coordinates, ImageResult result,
VisionCallback 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回调。

VisionCallback callback= new VisionCallback() {
@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回调。

VisionCallback callback = new VisionCallback() {
@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未知错误

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!


img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化的资料的朋友,可以戳这里获取

易碰到天花板技术停滞不前!**


[外链图片转存中…(img-0CEsaGxH-1715212623975)]
[外链图片转存中…(img-FS8KcIi6-1715212623975)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化的资料的朋友,可以戳这里获取

  • 14
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值