鸿蒙(HarmonyOS)原生AI能力之文本识别
鸿蒙(HarmonyOS)原生AI能力之文本识别
原生智能介绍
在之前开发中,很多场景我们是通过调用云端的智能能力进行开发。例如文本识别、人脸识别等。
原生即指将一些能力直接集成在本地鸿蒙系统中,通过不同层次的AI能力开放,满足开发者的不同场景下的诉求,降低应用开发门槛,帮助开发者快速实现应用智能化
有哪些原生智能能力
- 基础视觉服务
- 基础语音服务
- 端侧模型部署
- 端侧推理
- 意图框架
- .........
基础视觉服务 - Core Vision Kit
- Core Vision Kit(基础视觉服务)是机器视觉相关的基础能力,接下来要导入的类,都在
@kit.VisionKit中例如本篇要讲的文字识别即是如此。
文本识别介绍与使用
概念:将图片中的文字给识别出来
使用
textRecognition实现文本识别限制:
- 仅能识别5种语言类型
- 简体中文、繁体中文、英文、日文、韩文
- 仅能识别5种语言类型
使用步骤
导入textRecognition
import { textRecognition } from '@kit.CoreVisionKit'
实例化
visionInfo对象,用来准备待识别的图片(需PixelMap类型)let visionInfo: textRecognition.VisionInfo = {
pixelMap: '待识别图片'
};
实例化
TextRecognitionConfiguration对象,设置识别配置(目前仅有是否开启朝向检测一项配置)let textConfiguration: textRecognition.TextRecognitionConfiguration = {
// 是否开启朝向检测
isDirectionDetectionSupported: false
};
调用textRecognition的
recognizeText接口传入以上两个对象,开启识别并对识别结果进行处理,得到的是TextRecognitionResult类型结果,这个对象的value属性即为识别结果textRecognition.recognizeText(visionInfo, textConfiguration)
这里解释一下这几步
你需要用textRecognition,所以需要先找到它,也即导入,这没什么好说的
你需要用它来帮你识别图片,那你是不是应该把需要识别的图片给它?所以第一个参数就是给他传递一个图片,只不过这个图片只能传PixelMap类型的(这就是为什么上篇我要写PixMap的原因),但是这个图片不能直接传,要包装成VisionInfo类型的对象(虽然目前为止,这个对象只有这一个属性,但保不齐未来会加)
然后就是设置一下它识别的相关参数,它目前也只有一个参数,叫
isDirectionDetectionSupported,设置是否开启朝向检测,因为有的图片可能是正的,有的图片可能是反的斜的。所以对于反的斜的图片如果这项开启为true,则会检测的更为准确。但是经过猫林老师肉测,其实开不开启扫描反的斜的图片,得到的结果都差不多了。所以可以看自己选择。顺便一提,这个参数可以不传,不传默认是true。然后猫林老师觉得:未来随着API发展,可能会多一些参数也说不准最后即为调用其进行识别的方法,也即recognizeText开始识别
根据上面所说的,其实上面说的四步,也可以极简改为两步,代码如下
import { textRecognition } from '@kit.CoreVisionKit' textRecognition.recognizeText({ pixelMap: '待识别图片' })
- 解释:这里就相当于没传第二个参数,它默认值即为true,也即开启朝向检测。
至于如何读取相册图片,以及把图片解码变成PixelMap,不是今天分享的主题,且之前猫林老师有两篇文章分别讲过不会的可以看之前文章,所以这里直接给代码(可看注释)
// 1. 使用PhotoViewPicker选择相册图片
let photoPicker = new photoAccessHelper.PhotoViewPicker();
// 2. 使用select方法开始选择图片
photoPicker.select({
// 设置只选择图片
MIMEType: photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE,
// 设置最大只能选择1张
maxSelectNumber: 1
})
.then((res: photoAccessHelper.PhotoSelectResult) => {
// res参数里的photoUris属性即为选择的图片结果数组(因为可以选择多张),每个元素得到的是临时路径
// 用fs打开这个路径
let fileSource = fileIo.openSync(res.photoUris[0], fileIo.OpenMode.READ_ONLY);
// 使用createImageSource方法将图片文件流常见成图片源码
let imageSource = image.createImageSource(fileSource.fd);
// 再使用createPixelMap方法,将图片源码制作成PixelMap类型
const pixelMap = imageSource.createPixelMapSync()
// 后续使用textRecognition的recognizeText那一套代码进行识别即可
})
文本识别展示案例
我们来实现如下图的效果

- 界面上从上往下放:
- Image:显示选择的待识别图片
- Button:选择相册里的图片
- Button:开始识别按钮
- TextArea:显示识别后的结果,使用TextArea的原因是它对比Text会多一个滚动效果(防止内容过多显示不全)
- 界面上从上往下放:
结合上面说的使用方法,最终文本识别代码如下
import { photoAccessHelper } from '@kit.MediaLibraryKit'
import { fileIo } from '@kit.CoreFileKit'
import { image } from '@kit.ImageKit'
import { textRecognition } from '@kit.CoreVisionKit' @Entry
@Component
struct Index {
@State text: string = '识别结果'
@State imgPixelMap: PixelMap | null = null build() {
Column({ space: 20 }) {
Button('打开图片')
.width('85%')
.onClick(async () => {
const uri = await this.selectPhoto()
if (uri) {
const pixelMap = await this.getPixMap(uri)
this.imgPixelMap = pixelMap
}
}) Button('开始识别')
.width('85%')
.onClick(() => {
this.recognize()
}) Image(this.imgPixelMap)
.objectFit(ImageFit.Contain)
.height('45%') Text(this.text)
.width('85%')
.layoutWeight(1)
.border({ style: BorderStyle.Dotted, width: 5, color: Color.Red })
}
.width('100%')
.height('100%')
} async selectPhoto() {
try {
// 实例化照片选择器
const picker = new photoAccessHelper.PhotoViewPicker()
// 选择图片
const uris = await picker.select({
MIMEType: photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE,
maxSelectNumber: 1
})
return uris.photoUris[0] } catch {
console.log('err')
return null
}
} // 根据图片路径转PixelMap
async getPixMap(uri: string) {
try {
const imgSrc = await fileIo.open(uri, fileIo.OpenMode.READ_ONLY)
let source = image.createImageSource(imgSrc.fd)
return source.createPixelMapSync()
} catch {
console.log('error' + uri)
return null
}
} // 文字识别
async recognize() {
const info: textRecognition.VisionInfo = {
pixelMap: this.imgPixelMap!
}
const res = await textRecognition.recognizeText(info, {
isDirectionDetectionSupported: false
})
this.text = res.value
}
}
总结
- 今天猫林老师给大家分享了鸿蒙提供的原生AI能力。其实听起来名字很高大上,用起来非常简单。这是因为鸿蒙帮我们做了高度封装,我们无须再关注OCR的相关知识,只需要使用鸿蒙提供的接口即可。所以,华为为了推广鸿蒙,发展鸿蒙生态,真的为开发者想了好多。这样的华为,你爱了吗?
- 友情提醒:本篇内容只适合用真机测试,模拟器无法出效果。
- P.S:根据猫林老师肉测,在API12版本中的Mac模拟器成功出效果。其他版本都不行。所以建议有条件还是上真机。
鸿蒙(HarmonyOS)原生AI能力之文本识别的更多相关文章
- 最全华为鸿蒙 HarmonyOS 开发资料汇总
开发 本示例基于 OpenHarmony 下的 JavaScript UI 框架,进行项目目录解读,JS FA.常用和自定义组件.用户交互.JS 动画的实现,通过本示例可以基本了解和学习到 JavaS ...
- 个人永久性免费-Excel催化剂功能第86波-人工智能之图像OCR文本识别全覆盖
在上一年中,Excel催化剂已经送上一波人工智能系列功能,鉴于部分高端用户的需求,再次给予实现了复杂的图像OCR识别,包含几乎所有日常场景,让公司个人手头的图像非结构化数据瞬间变为可进行结构化处理分析 ...
- 课程报名 | 基于模型训练平台快速打造 AI 能力
我们常说的 AI 通用能力往往不针对具体的行业应用,而是主要解决日常或者泛化的问题,很多技术企业给出的方案是通用式的,比如通用文字识别,无论识别身份证.驾驶证.行驶证等,任何一张图片训练后的模型都会尽 ...
- AI时代的OCR识别技术浅析
人工智能这个词可谓是耳熟能详,近几年人工智能热潮再次席卷而来,引起轰动的要数google的AlphaGo,相继打败了围棋界的韩国选手李世石以及世界冠军柯洁,见证了人工智能发展的里程碑式的变革,人工智能 ...
- 解锁云原生 AI 技能 - 开发你的机器学习工作流
按照上篇文章<解锁云原生 AI 技能 | 在 Kubernetes 上构建机器学习系统>搭建了一套 Kubeflow Pipelines 之后,我们一起小试牛刀,用一个真实的案例,学习如何 ...
- 鸿蒙应用程序Ability(能力)看这一篇就够
本节概述 什么是Ability Ability分类 Ability生命周期 Ability之间跳转 什么是Ability Ability意为能力,是HarmonyOS应用程序提供的抽象功能.在Andr ...
- 公有云上构建云原生 AI 平台的探索与实践 - GOTC 技术论坛分享回顾
7 月 9 日,GOTC 2021 全球开源技术峰会上海站与 WAIC 世界人工智能大会共同举办,峰会聚焦 AI 与云原生两大以开源驱动的前沿技术领域,邀请国家级研究机构与顶级互联网公司的一线技术专家 ...
- pytesser图片文本识别
python图片文本识别使用的工具是PIL和pytesser.因为他们使用到很多的python库文件,为了避免一个个工具的安装,建议使用pythonxy,这个工具的介绍可参考baidu. pytess ...
- 超简单集成华为HMS ML Kit文本识别SDK,一键实现账单号自动录入
前言 在之前的文章<超简单集成华为HMS Core MLKit通用卡证识别SDK,一键实现各种卡绑定>中我们给大家介绍了华为HMS ML Kit通用卡证识别技术是如何通过拍照自动识别卡 ...
- 手把手带你体验鸿蒙 harmonyOS
wNlRGd.png 前言 本文已经收录到我的 Github 个人博客,欢迎大佬们光临寒舍: 我的 GIthub 博客 学习导图 image.png 一.为什么要尝鲜 harmonyos? wNlfx ...
随机推荐
- 深入理解Linux进程调度(下)
一.SMP管理 在继续讲解之前,我们先来说一下多CPU管理(这里的CPU是指逻辑CPU,在很多语境中CPU都是默认指的逻辑CPU,物理CPU要特别强调是物理CPU).最开始的时候计算机都是单CPU的, ...
- Android Systrace 基础知识 -- 分析 Systrace 预备知识
1. 正文 1.1 线程状态查看 Systrace 会用不同的颜色来标识不同的线程状态, 在每个方法上面都会有对应的线程状态来标识目前线程所处的状态,通过查看线程状态我们可以知道目前的瓶颈是什么, 是 ...
- mmap映射类型
文件映射和匿名映射都是操作系统中对于内存映射的两种类型,主要应用于进程间的通信或者大量数据的处理. 文件映射,也就是内存映射文件,是把一个文件或者文件的一部分映射到进程的地址空间,它允许对文件进行随机 ...
- iOS中使用UITextView设置不同文本部分点击事件小结
最近在项目开发中遇到了设置多行文本,点击蓝色邮箱部分跳转到发邮件页面功能.当然比较简单的方式是多标签单独设置,那样稍显麻烦.我们能不能用一个控件,给某一部分添加点击事件,结果是可以的,UITextVi ...
- Failed to mount component: template or render function not defined 使用 require 引入组件的时候报错
为什么有的时候使用require引入组件不会报错,有的时候就会报错,需要加上default就不会报错 ? webpack 支持 CommonJS和 ES6模块打包,当我们引用组件的时候,在 scri ...
- KubeSphere 社区双周报 | 功能亮点抢“鲜”看 | 2022-09-16
KubeSphere 从诞生的第一天起便秉持着开源.开放的理念,并且以社区的方式成长,如今 KubeSphere 已经成为全球最受欢迎的开源容器平台之一.这些都离不开社区小伙伴的共同努力,你们为 Ku ...
- 一文读懂 Prometheus 长期存储主流方案
嘉宾 | 霍秉杰 整理 | 西京刀客 出品 | CSDN 云原生 Prometheus 作为云原生时代崛起的标志性项目,已经成为可观测领域的事实标准.Prometheus 是单实例不可扩展的,那么如果 ...
- Java高并发关于synchronized的8锁讲解
先了解一个概念:synchronized 锁的是这个方法所在的资源类,就是这个对象,也就是同一时间段不可能有两个线程同时进到这个资源类,同一时间段,只允许有一个线程访问资源类里面的其中一个synchr ...
- 一文彻底弄懂MySQL的优化
在企业级 Web 开发中,MySQL 优化是至关重要的,它直接影响系统的响应速度.可扩展性和整体性能.下面从不同角度,列出详细的 MySQL 优化技巧,涵盖查询优化.索引设计.表结构设计.配置调整等方 ...
- 题解:洛谷P1119 灾后重建
题解:洛谷P1119 灾后重建 题目传送门 前言:没有掌握floyed求最短路的精髓是每次增加选一个中转点,导致写了2h才勉强卡过 法1:最暴力的想法就是开个三维数组把前i个点的dis状态全部存下来, ...