HarmonyOS之AI能力·通用文字识别技术

网友投稿 762 2022-05-30

通用文字识别的核心技术是 OCR(Optical Character Recognition,光学字符识别)。

OCR 是一种通过拍照、扫描等光学输入方式,把各种票据、卡证、表格、报刊、书籍等印刷品文字转化为图像信息,再利用文字识别技术将图像信息转化为计算机等设备可以使用的字符信息的技术。

支持处理的图片格式包括 JPEG、JPG、PNG。

通用文字识别目前支持的语言有:中文、英文、日语、韩语、俄语、意大利语、西班牙语、葡萄牙语、德语,以及法语(将来会增加更多语种)。

目前支持文档印刷体识别,不支持手写字体识别。

为保证较理想的识别结果,调用通用文字识别功能时,应尽可能保证输入图像具有合适的成像质量(建议720p以上)和高宽比例(建议2:1以下,接近手机屏幕高宽比例为宜)。当输入图像为非建议图片尺寸时,文字识别的准确度可能会受到影响。

为保证较理想的识别结果,建议文本与拍摄角度夹角在正负30度范围内。

可以进行文档翻拍、街景翻拍等图片来源的文字检测和识别,也可以集成于其他应用中,提供文字检测、识别的功能,并根据识别结果提供翻译、搜索等相关服务;

可以处理来自相机、图库等多种来源的图像数据,提供了一个自动检测文本、识别图像中文本位置以及文本内容功能的开放接口;

能在一定程度上支持文本倾斜、拍摄角度倾斜、复杂光照条件以及复杂文本背景等场景的文字识别。

用文字识别提供了 setVisionConfiguration() 和 detect() 两个函数接口。

调用 ITextDetector的setVisionConfiguration() 方法,通过传入的 TextConfiguration,选择需要调用的 OCR 类型。

void setVisionConfiguration(TextConfiguration textConfiguration);

1

TextConfiguration 的常用设置如下:

调用 ITextDetector 的 detect() 方法,获取识别结果:

int detect(VisionImage image, Text result, VisionCallback visionCallBack);

1

其中:

image 为待 OCR 检测识别的输入图片。

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

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

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

在使用通用文字识别 SDK 时,将实现文字识别的相关的类添加至工程:

import ohos.ai.cv.common.ConnectionCallback; import ohos.ai.cv.common.VisionCallback; import ohos.ai.cv.common.VisionConfiguration; import ohos.ai.cv.common.VisionImage; import ohos.ai.cv.common.VisionManager; import ohos.ai.cv.text.ITextDetector; import ohos.ai.cv.text.Text; import ohos.ai.cv.text.TextConfiguration; import ohos.ai.cv.text.TextDetectType; import ohos.app.Context; import ohos.media.image.PixelMap;

1

2

3

4

5

6

7

8

9

10

11

定义 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

实例化 ITextDetector 接口,将此工程的 context 作为入参:

ITextDetector textDetector = VisionManager.getTextDetector(context);

1

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

VisionImage image = VisionImage.fromPixelMap(pixelMap);

1

实例化 Text 对象 text,该对象在同步模式下用于存放调用 textDetector.detect()方法的结果返回码及文字识别结果:

Text text = new Text();

1

(可选) 定义 VisionCallback

回调:

VisionCallback callback= new VisionCallback() { @Override public void onResult(Text text) { // 对正确获得文字识别结果进行处理。 } @Override public void onError(int i) { // 处理错误返回码。 } @Override public void onProcessing(float v) { // 返回处理进度。 } };

1

2

3

4

5

6

7

8

9

HarmonyOS之AI能力·通用文字识别技术

10

11

12

13

14

15

16

注意:

在异步模式下,该类的 onResult() 方法用于获得文字识别结果 Text;onError() 方法用于处理错误返回码;onProcessing() 方法用于返回处理进度,目前没有实现此接口的功能。

同步与异步模式区别在于 detect() 的最后一个参数 VisionCallback

是否为空。若非空则为异步模式。此时会忽略自定义的 Text 输入(效果与传入 null 相同),接口调用结果一律从 VisionCallback

获得,自定义的 Text 输入不做更新。

通过 TextConfiguration 配置 textDetector() 方法的运行参数,可选择识别场景,语言类型,调用模式等。跨进程模式(MODE_OUT)下调用方与能力引擎处于不同进程;同进程模式(MODE_IN)下,能力引擎在调用方进程中实例化,调用方通过反射的方式调用引擎里的通用文字识别能力。以聚焦通用文字识别,同进程英文语种检测为例:

TextConfiguration.Builder builder = new TextConfiguration.Builder(); builder.setProcessMode(VisionConfiguration.MODE_IN); builder.setDetectType(TextDetectType.TYPE_TEXT_DETECT_FOCUS_SHOOT); builder.setLanguage(TextConfiguration.ENGLISH); TextConfiguration config = builder.build(); textDetector.setVisionConfiguration(config);

1

2

3

4

5

6

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

result = textDetector.prepare();

1

说明:如果返回的 result 不为0,说明当前 OCR 能力准备失败,需要处理错误,不再执行之后的动作。在 detect() 方法中会首先调用 prepare() 启动引擎,如果引擎已经启动则不会再次启动。

调用 ITextDetector 的 detect() 方法:

result = textDetector.detect(image, text, null); // 同步 // 或者 result = textDetector.detect(image, null, visionCallback); // 异步

1

2

3

4

说明:

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

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

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

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

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

结果码定义如下表:

调用 ITextDetector 的 release() 方法,释放资源。调用 pixelMap 的 release() 方法,释放图片内存,不再使用通用文字识别能力时,调用 release() 方法释放资源:

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

1

2

3

4

5

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

VisionManager.destroy();

1

AI OCR 图像处理

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

上一篇:TensorRT使用INT8 原理总结
下一篇:Go 语言入门很简单:net/url 包
相关文章