HarmonyOS学习路之开发篇—AI功能开发(二维码生成及文字识别)

本文涉及的产品
票据凭证识别,票据凭证识别 200次/月
票证核验,票证核验 50次/账号
通用文字识别,通用文字识别 200次/月
简介: 为应用提供丰富的AI(Artificial Intelligence)能力,支持开箱即用。开发者可以灵活、便捷地选择AI能力,让应用变得更加智能。

AI能力概述

为应用提供丰富的AI(Artificial Intelligence)能力,支持开箱即用。开发者可以灵活、便捷地选择AI能力,让应用变得更加智能。


已开放的AI能力如下表所示:


image.pngimage.pngimage.png

image.png

image.png

说明

目前,二维码生成能力支持智能穿戴设备和手机;其他AI能力仅支持手机设备。

码生成概述

码生成能够根据开发者给定的字符串信息和二维码图片尺寸,返回相应的二维码图片字节流。调用方可以通过二维码字节流生成二维码图片。


约束与限制

当前仅支持在中国区发售的华为终端设备。

当前仅支持生成QR二维码(Quick Response Code)。由于QR二维码算法的限制,Java语言开发时字符串信息的长度不能超过2953个字符;JS语言开发时字符串信息的长度不能超过256个字符。

Java语言开发时,生成的二维码图片的宽度不能超过1920像素,高度不能超过1680像素。由于QR二维码是通过正方形阵列承载信息的,建议二维码图片采用正方形,当二维码图片采用长方形时,会在QR二维码信息的周边区域留白。

JS语言开发时,生成的二维码图片的宽高最小值为200px;当宽高不一致时,以二者最小值作为二维码的边长,且最终生成的二维码居中显示。支持矩形、圆形两种二维码类型(默认是矩形)。

码生成开发

场景介绍

码生成能够根据给定的字符串信息,生成相应的二维码图片。常见应用场景举例:


社交或通讯类应用:根据输入的联系人信息,生成联系人二维码。

购物或支付类应用:根据输入的支付链接,生成收款或付款二维码。

接口说明

码生成提供了IBarcodeDetector()接口,常用方法的功能描述如下:


image.png


开发步骤

1. 在使用码生成SDK时,需要先将相关的类添加至工程

import ohos.ai.cv.common.ConnectionCallback;
import ohos.ai.cv.common.VisionManager;
import ohos.ai.cv.qrcode.IBarcodeDetector;

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


ConnectionCallback connectionCallback = new ConnectionCallback() {
    @Override
    public void onServiceConnect() {
        // Do something when service connects successfully
    }
    @Override
    public void onServiceDisconnect() {
        // Do something when service connects unsuccessfully
    }
};

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


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

4. 在收到onServiceConnect回调连接服务成功后,实例化IBarcodeDetector接口,将此工程的context作为入参


IBarcodeDetector barcodeDetector = VisionManager.getBarcodeDetector(context);

5. 定义码生成图像的尺寸,并根据图像大小分配字节流数组空间。


int result = barcodeDetector.detect("This is a TestCase of IBarcodeDetector", byteArray, SAMPLE_LENGTH, SAMPLE_LENGTH);

6. 调用IBarcodeDetector的detect()方法,根据输入的字符串信息生成相应的二维码图片字节流。


InputStream inputStream = new ByteArrayInputStream(byteArray);
ImageSource imageSource = ImageSource.create(inputStream, null);

7. 如果返回值为0,表明调用成功。后续可以利用API将解码流转换为图片源,简要示例如下:


InputStream inputStream = new ByteArrayInputStream(byteArray);

ImageSource imageSource = ImageSource.create(inputStream, null);

8. 当码生成能力使用完毕后,调用IBarcodeDetector的release()方法,释放资源


result = barcodeDetector.release();

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


VisionManager.destroy();

文字识别概述

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


约束与限制

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

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

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

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

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

文字识别开发

场景介绍

通用文字识别适用于如下场景:


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

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

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

接口说明

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


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

void setVisionConfiguration(TextConfiguration textConfiguration);

下表列出了TextConfiguration的常用设置:



image.png


进程模式定义:


VisionConfiguration.MODE_IN(同进程调用)

VisionConfiguration.MODE_OUT(跨进程调用)

默认值为VisionConfiguration.MODE_OUT。


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


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

其中:


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

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

如果visionCallback为有效的回调函数,则该函数为异步调用,函数返回时result中的值无效,实际识别结果由回调函数返回。回调函数的使用方法请参见开发步骤中的具体说明。

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

开发步骤

1. 在使用通用文字识别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;

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

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

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


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

4. 在收到onServiceConnect回调连接服务成功后,实例化ITextDetector接口,将此工程的context作为入参。

ITextDetector textDetector = VisionManager.getTextDetector(context);

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


VisionImage image = VisionImage.fromPixelMap(pixelMap);

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

Text text = new Text();

7. (可选) 定义VisionCallback<Text>回调。


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

说明


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

同步与异步模式区别在于detect()的最后一个参数VisionCallback<Text>是否为空。若非空则为异步模式。此时会忽略自定义的Text输入(效果与传入null相同),接口调用结果一律从VisionCallback<Text>获得,自定义的Text输入不做更新。

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

9. (可选)调用ITextDetector的prepare()方法。


result = textDetector.prepare();

说明


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


10. 调用ITextDetector的detect()方法。

result = textDetector.detect(image, text, null); // 同步

或者

result = textDetector.detect(image, null, visionCallback); // 异步

说明


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

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

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

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

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

结果码定义如下表:



image.png

image.png

11. 调用ITextDetector的release()方法,释放资源。调用pixelMap的release()方法,释放图片内存。

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

说明


不再使用通用文字识别能力时,调用release()方法释放资源。


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


VisionManager.destroy();
相关文章
|
10天前
|
人工智能 安全 测试技术
探索AI在软件开发中的应用:提升开发效率与质量
【10月更文挑战第31天】在快速发展的科技时代,人工智能(AI)已成为软件开发领域的重要组成部分。本文探讨了AI在代码生成、缺陷预测、自动化测试、性能优化和CI/CD中的应用,以及这些应用如何提升开发效率和产品质量。同时,文章也讨论了数据隐私、模型可解释性和技术更新等挑战。
|
10天前
|
人工智能 自然语言处理 搜索推荐
AI辅助教育:个性化学习的新纪元
【10月更文挑战第31天】随着人工智能(AI)技术的发展,教育领域迎来了一场前所未有的变革。AI辅助教育通过智能推荐、语音助手、评估系统和虚拟助教等应用,实现了个性化学习,提升了教学效率。本文探讨了AI如何重塑教育模式,以及个性化学习在新时代教育中的重要性。
|
12天前
|
机器学习/深度学习 人工智能 自然语言处理
探索AI驱动的个性化学习平台构建###
【10月更文挑战第29天】 本文将深入探讨如何利用人工智能技术,特别是机器学习与大数据分析,构建一个能够提供高度个性化学习体验的在线平台。我们将分析当前在线教育的挑战,提出通过智能算法实现内容定制、学习路径优化及实时反馈机制的技术方案,以期为不同背景和需求的学习者创造更加高效、互动的学习环境。 ###
34 3
|
15天前
|
人工智能 小程序
【一步步开发AI运动小程序】五、帧图像人体识别
随着AI技术的发展,阿里体育等公司推出的AI运动APP,如“乐动力”和“天天跳绳”,使云上运动会、线上健身等概念广受欢迎。本文将引导您从零开始开发一个AI运动小程序,使用“云智AI运动识别小程序插件”。文章分为四部分:初始化人体识别功能、调用人体识别功能、人体识别结果处理以及识别结果旋转矫正。下篇将继续介绍人体骨骼图绘制。
|
15天前
|
缓存 前端开发 API
鸿蒙应用开发:下载功能
鸿蒙应用开发:下载功能
40 1
|
16天前
|
人工智能 小程序 vr&ar
AI运动小程序开发常见问题集锦二
截至当前,我们的AI运动识别小程序插件已迭代至第23个版本,广泛应用于健身、体育、体测、AR互动等场景。本文针对近期用户咨询,汇总了常见问题,帮助用户减少开发成本,提高效率。主要涵盖计时与计数模式的区别、综合排行榜生成方法、全屏模式适配及无开发能力用户的解决方案。
|
3天前
|
Android开发
鸿蒙开发:自定义一个简单的标题栏
本身就是一个很简单的标题栏组件,没有什么过多的技术含量,有一点需要注意,当使用沉浸式的时候,注意标题栏的位置,需要避让状态栏。
鸿蒙开发:自定义一个简单的标题栏
|
3天前
|
API
鸿蒙开发:切换至基于rcp的网络请求
本文的内容主要是把之前基于http封装的库,修改为当前的Remote Communication Kit(远场通信服务),无非就是通信的方式变了,其他都大差不差。
鸿蒙开发:切换至基于rcp的网络请求
|
8天前
|
UED
鸿蒙next版开发:相机开发-适配不同折叠状态的摄像头变更(ArkTS)
在HarmonyOS 5.0中,ArkTS提供了强大的相机开发能力,特别是针对折叠屏设备的摄像头适配。本文详细介绍了如何在ArkTS中检测和适配不同折叠状态下的摄像头变更,确保相机应用在不同设备状态下的稳定性和用户体验。通过代码示例展示了具体的实现步骤。
34 8
|
8天前
|
API 内存技术
鸿蒙next版开发:相机开发-拍照(ArkTS)
在HarmonyOS 5.0中,ArkTS提供了一套完整的API来管理相机功能,特别是拍照功能。本文详细介绍如何在ArkTS中实现拍照功能,包括导入接口、创建会话、配置会话、触发拍照及监听拍照输出流状态,并提供代码示例进行详细解读。通过本文,你将掌握如何在HarmonyOS 5.0中使用ArkTS实现高效的拍照功能。
27 7

热门文章

最新文章