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

举报
Serendipity·y 发表于 2022/02/17 01:24:53 2022/02/17
【摘要】 一、通用文字识别技术 通用文字识别的核心技术是 OCR(Optical Character Recognition,光学字符识别)。OCR 是一种通过拍照、扫描等光学输入方式,把各种票据、卡证、表格、报...

一、通用文字识别技术

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

二、约束与限制

  • 支持处理的图片格式包括 JPEG、JPG、PNG。
  • 通用文字识别目前支持的语言有:中文、英文、日语、韩语、俄语、意大利语、西班牙语、葡萄牙语、德语,以及法语(将来会增加更多语种)。
  • 目前支持文档印刷体识别,不支持手写字体识别。
  • 为保证较理想的识别结果,调用通用文字识别功能时,应尽可能保证输入图像具有合适的成像质量(建议720p以上)和高宽比例(建议2:1以下,接近手机屏幕高宽比例为宜)。当输入图像为非建议图片尺寸时,文字识别的准确度可能会受到影响。
  • 为保证较理想的识别结果,建议文本与拍摄角度夹角在正负30度范围内。

三、应用场景

  • 可以进行文档翻拍、街景翻拍等图片来源的文字检测和识别,也可以集成于其他应用中,提供文字检测、识别的功能,并根据识别结果提供翻译、搜索等相关服务;
  • 可以处理来自相机、图库等多种来源的图像数据,提供了一个自动检测文本、识别图像中文本位置以及文本内容功能的开放接口;
  • 能在一定程度上支持文本倾斜、拍摄角度倾斜、复杂光照条件以及复杂文本背景等场景的文字识别。

四、API

  • 用文字识别提供了 setVisionConfiguration() 和 detect() 两个函数接口。
  • 调用 ITextDetector的setVisionConfiguration() 方法,通过传入的 TextConfiguration,选择需要调用的 OCR 类型。
	void setVisionConfiguration(TextConfiguration textConfiguration);

  
 
  • 1
  • TextConfiguration 的常用设置如下:
接口名称 参数名 类型 参数说明
setDetectType() detectType int OCR引擎类型定义:TextDetectType.TYPE_TEXT_DETECT_FOCUS_SHOOT(自然场景OCR)
setLanguage() language int 识别语种定义:
TextConfiguration.AUTO(不指定语种,会进行语种检测操作)
TextConfiguration.CHINESE(中文)
TextConfiguration.ENGLISH(英语)
TextConfiguration.SPANISH(西班牙语)
TextConfiguration.PORTUGUESE(葡萄牙语)
TextConfiguration.ITALIAN(意大利语)
TextConfiguration.GERMAN(德语)
TextConfiguration.FRENCH(法语)
TextConfiguration.RUSSIAN(俄语)
TextConfiguration.JAPANESE(日语)
TextConfiguration.KOREAN(韩语)
默认值为TextConfiguration.AUTO
setProcessMode() mode int 进程模式定义:
VisionConfiguration.MODE_IN(同进程调用)
VisionConfiguration.MODE_OUT(跨进程调用)
默认值为VisionConfiguration.MODE_OUT
  • 调用 ITextDetector 的 detect() 方法,获取识别结果:
	int detect(VisionImage image, Text result, VisionCallback<Text> 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<Text> callback= new VisionCallback<Text>() {
	    @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
  • 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() 的参数接收。
  • 结果码定义如下表:
结果码 说明
0 成功
-1 未知错误
-2 不支持的功能或接口
-3 内存分配失败或创建对象失败
-4 所需库加载失败
-10 引擎开关已经关闭
101 失败
102 超时
200 输入参数不合法(图片尺寸错误)
201 输入参数不合法(为空)
210 输入参数合法
500 服务绑定异常
521 服务绑定异常断开
522 服务已连接
600 模型文件异常
601 模型文件不存在
602 模型加载失败
700 异步调用请求发送成功
1001 神经网络处理单元错误
  • 调用 ITextDetector 的 release() 方法,释放资源。调用 pixelMap 的 release() 方法,释放图片内存,不再使用通用文字识别能力时,调用 release() 方法释放资源:
	textDetector.release();
	if (pixelMap != null) {
	    pixelMap.release();
	    pixelMap = null;
	}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 调用 VisionManager.destroy() 方法,断开与能力引擎的连接:
	VisionManager.destroy();

  
 
  • 1

文章来源: blog.csdn.net,作者:Serendipity·y,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/Forever_wj/article/details/118311429

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。