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回调,实现连接能力引擎成功与否后的操作。
- 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() {
- class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="2"> class="hljs-ln-code"> class="hljs-ln-line"> @Override
- 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() {
- class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="4"> class="hljs-ln-code"> class="hljs-ln-line">
- 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-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="6"> class="hljs-ln-code"> class="hljs-ln-line">
- class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="7"> class="hljs-ln-code"> class="hljs-ln-line"> @Override
- 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() {
- class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="9"> class="hljs-ln-code"> class="hljs-ln-line">
- class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="10"> class="hljs-ln-code"> class="hljs-ln-line"> }
- 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. 定义码生成图像的尺寸,并根据图像大小分配字节流数组空间。
- 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;
- 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将解码流转换为图片源,简要示例如下:
- 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);
- 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是一种通过拍照、扫描等光学输入方式,把各种票据、卡证、表格、报刊、书籍等印刷品文字转化为图像信息,再利用文字识别技术将图像信息转化为计算机等设备可以使用的字符信息的技术。
约束与限制
- 支持处理的图片格式包括JPEG、JPG、PNG。
- 通用文字识别目前支持的语言有:中文、英文、日语、韩语、俄语、意大利语、西班牙语、葡萄牙语、德语,以及法语(将来会增加更多语种)。
- 目前支持文档印刷体识别,不支持手写字体识别。
- 为保证较理想的识别结果,调用通用文字识别功能时,应尽可能保证输入图像具有合适的成像质量(建议720p以上)和高宽比例(建议2:1以下,接近手机屏幕高宽比例为宜)。当输入图像为非建议图片尺寸时,文字识别的准确度可能会受到影响。
- 为保证较理想的识别结果,建议文本与拍摄角度夹角在正负30度范围内。
文字识别开发
场景介绍
通用文字识别适用于如下场景:
- 可以对文档翻拍、街景翻拍等图片进行文字检测和识别,也可以集成于其他应用中,提供文字检测、识别的功能,并根据识别结果提供翻译、搜索等相关服务;
- 可以处理来自相机、图库等多种来源的图像数据,提供一个自动检测文本、识别图像中文本位置以及文本内容功能的开放接口;
- 能在一定程度上支持文本倾斜、拍摄角度倾斜、复杂光照条件以及复杂文本背景等场景的文字识别。
接口说明
通用文字识别提供了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(不指定语种,会进行语种检测操作)
- 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 visionCallBack);
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">
其中:
- image为待OCR检测识别的输入图片。
- 如果visionCallback为null,执行同步调用,结果码由方法返回,检测及识别结果由result返回。
- 如果visionCallback为有效的回调函数,则该函数为异步调用,函数返回时result中的值无效,实际识别结果由回调函数返回。回调函数的使用方法请参见开发步骤中的具体说明。
- 同步模式调用成功时,该函数返回结果码0。异步模式调用请求发送成功时,该函数返回结果码700。
开发步骤
1. 在使用通用文字识别SDK时,将实现文字识别的相关的类添加至工程。
- 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;
- 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;
- 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;
- 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;
- 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;
- 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;
- 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;
- 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;
- 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;
- 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;
- 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回调,实现连接能力引擎成功与否后的操作。
- 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() {
- class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="2"> class="hljs-ln-code"> class="hljs-ln-line"> @Override
- 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() {
- class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="4"> class="hljs-ln-code"> class="hljs-ln-line">
- 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-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="6"> class="hljs-ln-code"> class="hljs-ln-line">
- class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="7"> class="hljs-ln-code"> class="hljs-ln-line"> @Override
- 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() {
- class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="9"> class="hljs-ln-code"> class="hljs-ln-line">
- class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="10"> class="hljs-ln-code"> class="hljs-ln-line"> }
- 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回调。
- 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>() {
- class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="2"> class="hljs-ln-code"> class="hljs-ln-line"> @Override
- 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) {
- class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="4"> class="hljs-ln-code"> class="hljs-ln-line">
- 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-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="6"> class="hljs-ln-code"> class="hljs-ln-line">
- class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="7"> class="hljs-ln-code"> class="hljs-ln-line"> @Override
- 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) {
- class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="9"> class="hljs-ln-code"> class="hljs-ln-line">
- class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="10"> class="hljs-ln-code"> class="hljs-ln-line"> }
- 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-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="12"> class="hljs-ln-code"> class="hljs-ln-line"> @Override
- 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) {
- class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="14"> class="hljs-ln-code"> class="hljs-ln-line">
- class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="15"> class="hljs-ln-code"> class="hljs-ln-line"> }
- 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)">
复制
说明
- 在异步模式下,该类的onResult()方法用于获得文字识别结果Text;onError()方法用于处理错误返回码;onProcessing()方法用于返回处理进度,目前没有实现此接口的功能。
- 同步与异步模式区别在于detect()的最后一个参数VisionCallback是否为空。若非空则为异步模式。此时会忽略自定义的Text输入(效果与传入null相同),接口调用结果一律从VisionCallback获得,自定义的Text输入不做更新。
8. 通过TextConfiguration配置textDetector()方法的运行参数,可选择识别场景、语言类型、调用模式等。跨进程模式(MODE_OUT)下调用方与能力引擎处于不同进程;同进程模式(MODE_IN)下,能力引擎在调用方进程中实例化,调用方通过反射的方式调用引擎里的通用文字识别能力。以聚焦通用文字识别,同进程英文语种检测为例:
- 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();
- 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);
- 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);
- 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);
- 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();
- 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)">
说明
- 同步模式调用完成时,该函数立即返回结果码;
- 异步模式调用请求发送成功时,该函数返回结果码700。如果返回其他的结果码,说明异步调用请求不成功,需要先处理错误,此时回调函数不会被调用。
- 如果异步模式调用请求发送成功,则OCR完成后,相应的回调函数会被自动调用。
- 如果onResult()回调被调用,说明OCR检测识别成功,相当于同步模式结果码为0的情况。
- 如果onError()方法被调用,则说明OCR发生了错误,具体的调用结果码将由onError()的参数接收。
结果码定义如下表:
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()方法,释放图片内存。
- 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();
- 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) {
- 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();
- 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;
- 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应用
- 构建第一个JS应用
- ……

开发基础知识:
- 应用基础知识
- 配置文件
- 应用数据管理
- 应用安全管理
- 应用隐私保护
- 三方应用调用管控机制
- 资源分类与访问
- 学习ArkTS语言
- ……

基于ArkTS 开发:
- Ability开发
- UI开发
- 公共事件与通知
- 窗口管理
- 媒体
- 安全
- 网络与链接
- 电话服务
- 数据管理
- 后台任务(Background Task)管理
- 设备管理
- 设备使用信息统计
- DFX
- 国际化开发
- 折叠屏系列
- .……

获取以上文中提到的这份纯血版鸿蒙 (Harmony OS) 开发资料的小伙伴
请点击→纯血版全套鸿蒙HarmonyOS学习资料
🚀写在最后
- 如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
- 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
- 关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识。
- 想要获取更多完整鸿蒙最新VIP学习资料,请点击→纯血版全套鸿蒙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"}">>
评论记录:
回复评论: