• class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="2"> class="hljs-ln-code"> class="hljs-ln-line">import ohos.ai.cv.common.VisionManager;
  • class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="3"> class="hljs-ln-code"> class="hljs-ln-line">import ohos.ai.cv.qrcode.IBarcodeDetector;
  • class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">

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

    1. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="1"> class="hljs-ln-code"> class="hljs-ln-line">ConnectionCallback connectionCallback = new ConnectionCallback() {
    2. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="2"> class="hljs-ln-code"> class="hljs-ln-line"> @Override
    3. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="3"> class="hljs-ln-code"> class="hljs-ln-line"> public void onServiceConnect() {
    4. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="4"> class="hljs-ln-code"> class="hljs-ln-line"> // Do something when service connects successfully
    5. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="5"> class="hljs-ln-code"> class="hljs-ln-line"> }
    6. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="6"> class="hljs-ln-code"> class="hljs-ln-line">
    7. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="7"> class="hljs-ln-code"> class="hljs-ln-line"> @Override
    8. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="8"> class="hljs-ln-code"> class="hljs-ln-line"> public void onServiceDisconnect() {
    9. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="9"> class="hljs-ln-code"> class="hljs-ln-line"> // Do something when service connects unsuccessfully
    10. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="10"> class="hljs-ln-code"> class="hljs-ln-line"> }
    11. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="11"> class="hljs-ln-code"> class="hljs-ln-line">};
    class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">

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

    int result = VisionManager.init(context, connectionCallback); class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">

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

    IBarcodeDetector barcodeDetector = VisionManager.getBarcodeDetector(context); class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">

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

    1. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="1"> class="hljs-ln-code"> class="hljs-ln-line">final int SAMPLE_LENGTH = 152;
    2. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="2"> class="hljs-ln-code"> class="hljs-ln-line">byte[] byteArray = new byte[SAMPLE_LENGTH * SAMPLE_LENGTH * 4];
    class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">

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

    int result = barcodeDetector.detect("This is a TestCase of IBarcodeDetector", byteArray, SAMPLE_LENGTH, SAMPLE_LENGTH); class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">

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

    1. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="1"> class="hljs-ln-code"> class="hljs-ln-line">InputStream inputStream = new ByteArrayInputStream(byteArray);
    2. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="2"> class="hljs-ln-code"> class="hljs-ln-line">ImageSource imageSource = ImageSource.create(inputStream, null);
    class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">

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

    result = barcodeDetector.release(); class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">

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

    VisionManager.destroy(); class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">

    文字识别概述

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

    约束与限制

    文字识别开发

    场景介绍

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

    接口说明

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

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

    void setVisionConfiguration(TextConfiguration textConfiguration); class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">

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

    class="table-box">

    接口名称

    参数名

    类型

    参数说明

    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。

    默认值为TextConfiguration.AUTO。 setProcessMode() mode int 进程模式定义:

    默认值为VisionConfiguration.MODE_OUT。

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

    int detect(VisionImage image, Text result, VisionCallback visionCallBack); class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">

    其中:

    开发步骤

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

    1. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="1"> class="hljs-ln-code"> class="hljs-ln-line">import ohos.ai.cv.common.ConnectionCallback;
    2. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="2"> class="hljs-ln-code"> class="hljs-ln-line">import ohos.ai.cv.common.VisionCallback;
    3. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="3"> class="hljs-ln-code"> class="hljs-ln-line">import ohos.ai.cv.common.VisionConfiguration;
    4. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="4"> class="hljs-ln-code"> class="hljs-ln-line">import ohos.ai.cv.common.VisionImage;
    5. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="5"> class="hljs-ln-code"> class="hljs-ln-line">import ohos.ai.cv.common.VisionManager;
    6. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="6"> class="hljs-ln-code"> class="hljs-ln-line">import ohos.ai.cv.text.ITextDetector;
    7. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="7"> class="hljs-ln-code"> class="hljs-ln-line">import ohos.ai.cv.text.Text;
    8. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="8"> class="hljs-ln-code"> class="hljs-ln-line">import ohos.ai.cv.text.TextConfiguration;
    9. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="9"> class="hljs-ln-code"> class="hljs-ln-line">import ohos.ai.cv.text.TextDetectType;
    10. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="10"> class="hljs-ln-code"> class="hljs-ln-line">import ohos.app.Context;
    11. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="11"> class="hljs-ln-code"> class="hljs-ln-line">import ohos.media.image.PixelMap;
    class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">

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

    1. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="1"> class="hljs-ln-code"> class="hljs-ln-line">ConnectionCallback connectionCallback = new ConnectionCallback() {
    2. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="2"> class="hljs-ln-code"> class="hljs-ln-line"> @Override
    3. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="3"> class="hljs-ln-code"> class="hljs-ln-line"> public void onServiceConnect() {
    4. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="4"> class="hljs-ln-code"> class="hljs-ln-line"> // 定义连接能力引擎成功后的操作。
    5. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="5"> class="hljs-ln-code"> class="hljs-ln-line"> }
    6. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="6"> class="hljs-ln-code"> class="hljs-ln-line">
    7. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="7"> class="hljs-ln-code"> class="hljs-ln-line"> @Override
    8. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="8"> class="hljs-ln-code"> class="hljs-ln-line"> public void onServiceDisconnect() {
    9. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="9"> class="hljs-ln-code"> class="hljs-ln-line"> // 定义连接能力引擎失败后的操作。
    10. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="10"> class="hljs-ln-code"> class="hljs-ln-line"> }
    11. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="11"> class="hljs-ln-code"> class="hljs-ln-line">};
    class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">

    复制

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

    int result = VisionManager.init(context, connectionCallback); class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">

    复制

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

    ITextDetector textDetector = VisionManager.getTextDetector(context); class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">

    复制

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

    VisionImage image = VisionImage.fromPixelMap(pixelMap); class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">

    复制

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

    Text text = new Text(); class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">

    复制

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

    1. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="1"> class="hljs-ln-code"> class="hljs-ln-line">VisionCallback<Text> callback= new VisionCallback<Text>() {
    2. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="2"> class="hljs-ln-code"> class="hljs-ln-line"> @Override
    3. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="3"> class="hljs-ln-code"> class="hljs-ln-line"> public void onResult(Text text) {
    4. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="4"> class="hljs-ln-code"> class="hljs-ln-line"> // 对正确获得文字识别结果进行处理。
    5. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="5"> class="hljs-ln-code"> class="hljs-ln-line"> }
    6. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="6"> class="hljs-ln-code"> class="hljs-ln-line">
    7. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="7"> class="hljs-ln-code"> class="hljs-ln-line"> @Override
    8. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="8"> class="hljs-ln-code"> class="hljs-ln-line"> public void onError(int i) {
    9. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="9"> class="hljs-ln-code"> class="hljs-ln-line"> // 处理错误返回码。
    10. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="10"> class="hljs-ln-code"> class="hljs-ln-line"> }
    11. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="11"> class="hljs-ln-code"> class="hljs-ln-line">
    12. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="12"> class="hljs-ln-code"> class="hljs-ln-line"> @Override
    13. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="13"> class="hljs-ln-code"> class="hljs-ln-line"> public void onProcessing(float v) {
    14. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="14"> class="hljs-ln-code"> class="hljs-ln-line"> // 返回处理进度。
    15. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="15"> class="hljs-ln-code"> class="hljs-ln-line"> }
    16. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="16"> class="hljs-ln-code"> class="hljs-ln-line">};
    class="hide-preCode-box"> class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">

    复制

    说明

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

    1. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="1"> class="hljs-ln-code"> class="hljs-ln-line">TextConfiguration.Builder builder = new TextConfiguration.Builder();
    2. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="2"> class="hljs-ln-code"> class="hljs-ln-line">builder.setProcessMode(VisionConfiguration.MODE_IN);
    3. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="3"> class="hljs-ln-code"> class="hljs-ln-line">builder.setDetectType(TextDetectType.TYPE_TEXT_DETECT_FOCUS_SHOOT);
    4. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="4"> class="hljs-ln-code"> class="hljs-ln-line">builder.setLanguage(TextConfiguration.ENGLISH);
    5. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="5"> class="hljs-ln-code"> class="hljs-ln-line">TextConfiguration config = builder.build();
    6. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="6"> class="hljs-ln-code"> class="hljs-ln-line">textDetector.setVisionConfiguration(config);
    class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">

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

    result = textDetector.prepare(); class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">

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

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

    result = textDetector.detect(image, text, null); // 同步 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">

    或者

    result = textDetector.detect(image, null, visionCallback); // 异步 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">

    说明

    结果码定义如下表:

    class="table-box">

    结果码

    说明

    0

    成功

    -1

    未知错误

    -2

    不支持的功能或接口

    -3

    内存分配失败或创建对象失败

    -4

    所需库加载失败

    -10

    引擎开关已经关闭

    101

    失败

    102

    超时

    200

    输入参数不合法(图片尺寸错误)

    201

    输入参数不合法(为空)

    210

    输入参数合法

    500

    服务绑定异常

    521

    服务绑定异常断开

    522

    服务已连接

    600

    模型文件异常

    601

    模型文件不存在

    602

    模型加载失败

    700

    异步调用请求发送成功

    1001

    神经网络处理单元错误

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

    1. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="1"> class="hljs-ln-code"> class="hljs-ln-line">textDetector.release();
    2. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="2"> class="hljs-ln-code"> class="hljs-ln-line">if (pixelMap != null) {
    3. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="3"> class="hljs-ln-code"> class="hljs-ln-line"> pixelMap.release();
    4. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="4"> class="hljs-ln-code"> class="hljs-ln-line"> pixelMap = null;
    5. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="5"> class="hljs-ln-code"> class="hljs-ln-line">}
    class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">

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

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

    VisionManager.destroy(); class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">

    最后,为了能让大家更好的去学习提升鸿蒙 (Harmony OS) 开发技术,小编连夜整理了一份30个G纯血版学习资料(含视频电子书学习文档等)以及一份在Github上持续爆火霸榜的《纯血版华为鸿蒙 (Harmony OS)开发手册》(共计890页),希望对大家有所帮助。

    纯血版鸿蒙 HarmonyOS 4.0 视频学习资料

     需要以上视频学习资料小伙伴

    请点击→纯血版全套鸿蒙HarmonyOS学习资料


    《纯血版华为鸿蒙 (Harmony OS)开发手册》

    这份手册涵盖了当前鸿蒙 (Harmony OS) 开发技术必掌握的核心知识点

    纯血版鸿蒙 (Harmony OS)开发手册部分精彩内容

    HarmonyOS 概念:

    如何快速入门?


    开发基础知识: 

    基于ArkTS 开发:

    获取以上文中提到的这份纯血版鸿蒙 (Harmony OS) 开发资料的小伙伴 

    请点击→纯血版全套鸿蒙HarmonyOS学习资料


    🚀写在最后

    data-report-view="{"mod":"1585297308_001","spm":"1001.2101.3001.6548","dest":"https://blog.csdn.net/shudaoshanQAQ/article/details/135723237","extend1":"pc","ab":"new"}">>
    注:本文转载自blog.csdn.net的蜀道山QAQ的文章"https://blog.csdn.net/shudaoshanQAQ/article/details/135723237"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
    复制链接

    评论记录:

    未查询到任何数据!