HarmonyOS之AI能力·文档检测校正

网友投稿 644 2022-05-29

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

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

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

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

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

文档检测结果如下,该 JSON 保存了原图中相片文档四个角相对原图左上顶点的坐标信息(单位:像素),其中 resultCode 为返回码:

{ "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} }" }

1

2

3

4

5

6

7

8

9

10

11

根据文档在原始图片中的位置信息校正文档的拍摄角度(可自定义校正的区域)。

图片中的校正区域:

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

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

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

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

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

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

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

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

void setVisionConfiguration(DocRefineConfiguration docRefineConfiguration);

1

DocRefineConfiguration 的常用设置:

调用 IDocRefine的docDetect() 方法,获取检测结果:

int docDetect(VisionImage image, DocCoordinates result, VisionCallback visionCallBack);

1

说明:

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

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

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

HarmonyOS之AI能力·文档检测校正

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

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

int docRefine(VisionImage image, DocCoordinates coordinates, ImageResult result, VisionCallback visionCallBack);

1

2

说明:

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;

1

2

3

4

5

6

7

8

9

10

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

ConnectionCallback connectionCallback = new ConnectionCallback() { @Override public void onServiceConnect() { // 定义连接能力引擎成功后的操作。 } @Override public void onServiceDisconnect() { // 定义连接能力引擎失败后的操作。 } };

1

2

3

4

5

6

7

8

9

10

11

调用 VisionManager.init() 方法,将此工程的 context 和已经定义的 connectionCallback 作为入参,建立与能力引擎的连接,context 应为 ohos.aafwk.ability.Ability 或 ohos.aafwk.ability.AbilitySlice 的实例或子类实例:

int result = VisionManager.init(context, connectionCallback);

1

实例化 IDocRefine 接口,将此工程的 context 作为入参,context 应为 ohos.aafwk.ability.Ability 或 ohos.aafwk.ability.AbilitySlice 的实例或子类实例:

IDocRefine docRefine = VisionManager.getDocRefine(context);

1

实例化 VisionImage 对象 image,并传入待校正图片 pixelMap:

VisionImage image = VisionImage.fromPixelMap(pixelMap);

1

实例化 DocCoordinates 对象 docCoordinates:

DocCoordinates docCoordinates = new DocCoordinates();

1

(可选)定义 VisionCallback 回调:

在异步模式下,该类的 onResult() 方法用于获得检测的结果 docCoordinates(内含检测到的文档坐标);onError() 方法用于处理错误返回码;onProcessing() 方法用于返回处理进度,目前没有实现此接口的功能。

同步与异步模式区别在于 docDetect() 的最后一个参数 visionCallback 是否为空。若非空则为异步模式,此时会忽略自定义的 DocCoordinates 输入 docCoordinates,接口调用结果一律从回调函数visionCallback 获得。

VisionCallback callback= new VisionCallback() { @Override public void onResult(DocCoordinates docCoordinates) { // 对正确获得的结果进行处理 } @Override public void onError(int i) { // 处理错误返回码 } @Override public void onProcessing(float v) { // 返回处理进度 } };

1

2

3

4

5

6

7

8

9

10

11

12

13

14

实例化 ImageResult 对象 imageResult:

ImageResult imageResult = new ImageResult();

1

(可选)定义 VisionCallback 回调:

在异步模式下,该类的 onResult() 方法用于获得校正的结果 imageResult(内含校正后的图片);onError() 方法用于处理错误返回码;onProcessing() 方法用于返回处理进度,目前没有实现此接口的功能。

同步与异步模式区别在于 docRefine() 的最后一个参数 visionCallback 是否为空。若非空则为异步模式。此时会忽略自定义的 ImageResult 输入 imageResult,接口调用结果一律从回调类 visionCallback 获得。

VisionCallback callback = new VisionCallback() { @Override public void onResult(ImageResult imageResult) { // 对正确获得的结果进行处理 } @Override public void onError(int i) { // 处理错误返回码 } @Override public void onProcessing(float v) { // 返回处理进度 } };

1

2

3

4

5

6

7

8

9

10

11

12

13

14

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

1

2

3

4

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

result = docRefine.prepare();

1

调用 IDocRefine 的 docDetect() 方法:

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

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

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

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

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

result = docRefine.docDetect(image, docCoordinates, null); // 同步 // 或者 result = docRefine.docDetect(image, null, callback); // 异步

1

2

3

调用 IDocRefine的docRefine() 方法:

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

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

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

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

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

result = docRefine.docRefine(image, docCoordinates, imageResult, null); // 同步 // 或者 result = docRefine.docRefine(image, docCoordinates, null, callback); // 异步

1

2

3

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

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

1

2

3

4

5

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

VisionManager.destroy();

1

结果码定义如下表:

AI 任务调度

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:接口文档生成详细教程
下一篇:MongoDB查询文档踩坑记!
相关文章