鸿蒙(HarmonyOS)原生AI能力之文本识别

news/2025/3/10 5:21:49/文章来源:https://www.cnblogs.com/xpzll/p/18623401

鸿蒙(HarmonyOS)原生AI能力之文本识别

原生智能介绍

  • 在之前开发中,很多场景我们是通过调用云端的智能能力进行开发。例如文本识别、人脸识别等。

  • 原生即指将一些能力直接集成在本地鸿蒙系统中,通过不同层次的AI能力开放,满足开发者的不同场景下的诉求,降低应用开发门槛,帮助开发者快速实现应用智能化

有哪些原生智能能力

  • 基础视觉服务
  • 基础语音服务
  • 端侧模型部署
  • 端侧推理
  • 意图框架
  • .........

基础视觉服务 - Core Vision Kit

  • Core Vision Kit(基础视觉服务)是机器视觉相关的基础能力,接下来要导入的类,都在@kit.VisionKit中例如本篇要讲的文字识别即是如此。

文本识别介绍与使用

  • 概念:将图片中的文字给识别出来

  • 使用 textRecognition 实现文本识别

  • 限制:

    • 仅能识别5种语言类型
      • 简体中文、繁体中文、英文、日文、韩文
  • 使用步骤

    1. 导入textRecognition

      import { textRecognition } from '@kit.CoreVisionKit'
      
    2. 实例化visionInfo对象,用来准备待识别的图片(需PixelMap类型)

      let visionInfo: textRecognition.VisionInfo = {pixelMap: '待识别图片'
      };
      
    3. 实例化TextRecognitionConfiguration对象,设置识别配置(目前仅有是否开启朝向检测一项配置)

      let textConfiguration: textRecognition.TextRecognitionConfiguration = {// 是否开启朝向检测isDirectionDetectionSupported: false
      };
      
    4. 调用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-20241223092305711

    • 界面上从上往下放:
      • 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 = nullbuild() {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}}// 根据图片路径转PixelMapasync 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模拟器成功出效果。其他版本都不行。所以建议有条件还是上真机。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/857357.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

管理软件助力四六级:是学习规划师还是提分神器?

一、四六级单词学习的挑战 1.1 单词量庞大,记忆困难 四六级考试涉及的词汇量庞大,其中不仅包含常见的基础单词,还包括一些专业术语、固定搭配等。这些单词对于大部分学生来说,是需要长期积累和不断复习的。由于单词记忆的分散性和碎片化特点,考生很难一口气记住所有单词,…

Linux驱动开发笔记(七):操作系统MMU介绍,操作系统操作寄存器的原理和Demo

前言做过单片机的都知道,写驱动是直接代码设置和读取寄存器来控制外设实现基本的驱动功能,而linux操作系统上是由MMU(内存管理单元)来控制,MMU实现了虚拟地址与芯片物理地址的对应,设置和获取MMU地址就是设置和获取映射的物理地址,从而跟单片机一样实现与物理硬件的驱动…

视频智能分析AI智能分析网关小知识:如何评估和提升视频监控系统的图像质量?

在数字化时代,视频监控系统已成为我们生活中不可或缺的一部分,无论是在公共安全、交通管理还是商业监控等领域,高质量的图像对于监控系统的效能至关重要。随着技术的发展,我们有了更多的工具和方法来评估和提升视频监控系统的图像质量。 本文将探讨如何通过一系列综合措施,…

麒麟系统离线安装部署tomcat

麒麟系统离线安装部署tomcat离线安装部署tomcat下载tomcat 要使用java 11 所以下载tomcat 9 下载链接使用sftp上传到服务器/data/install解压下载的包tar -zxvf apache-tomcat-9.0.98.tar.gz移动文件夹到指定目录mv /data/install/apache-tomcat-9.0.98 /opt/app/tomcat赋予权限…

windows下代理加速 CMD

在使用代理软件之后, 默认代理HTTP请求, 浏览器可以直接使用, 因此我们在浏览器中可以直接打开Google访问. 但是这个代理对于终端来说是不生效的, 这意味着我们需要安装npm包, 或者下载github的源码, 使用docker构建镜像时, 都可能会出现资源下载失败的问题. 为此, 我们需要给终…

简单的Bootstrap Tabs选项卡

这是一款非常简单的Bootstrap Tabs选项卡美化特效。该特效在原生Bootstrap Tabs选项卡的基础上,通过css3来对它进行了一些美化效果。在线预览 下载使用方法 在页面中引入jquery和bootstrap相关文件。<link href="path/to/css/bootstrap.min.css" rel="sty…

超详细教程!用看板软件搭建用户画像系统

通过以上步骤,你可以用看板搭建一个用户画像系统,并将其应用到实际业务中。请注意,这只是一个基本的框架和流程,具体实现时可能需要根据你的实际情况进行调整和优化。用看板搭建用户画像系统是一个综合性的过程,它涉及到数据的收集、处理、分析以及可视化展示等多个环节。…

震撼!冬至物流高峰下,哪些办公软件可增强部门联动?

一、前言 冬至期间,物流行业迎来汹涌的业务高峰,运输规划的高效性成为物流企业成功应对挑战的关键因素。在这个特殊时期,合适的可视化团队协作办公软件能够显著优化运输流程,提升整体运营效率。本文将从 J 人物流公司的视角出发,详细盘点 6 款此类办公软件,其中板栗看板将…

双旦节遇上管理软件,解锁团队协作与效率的双重密码

一、电商双旦节促销的挑战与复杂性 1.1 多任务、多团队协调 双旦节促销活动的策划与执行通常涉及多个部门的合作,包括产品团队、营销团队、客服团队、物流团队等。每个团队负责不同的任务,如产品选品、优惠券设计、广告投放、订单处理、客户服务等。各个团队在不同阶段需要进…

JavaWeb和SSM

JavaWeb 简单的登录和注册项目(日程管理第二期) 1、dao中定义的接口,提供操作名的标准,只看接口定义了哪些方法,这样和服务层的service的耦合度低。2、mysql中如果返回的是count()的结果,则类型默认为longMVCSession和Cookie 1、cookie是session的ID2、设置了时效性的Coo…

Qt编写机器码秘钥控制/日期防篡改/离线使用/硬件标识/运行时间/数量控制/批量更新秘钥

一、前言说明 搞软件开发一直追求精益求精的目标,从第一版的秘钥生成器到今天这个版本,经历了十年的时间,最初的版本做的非常简陋,就是搞了个异或加密,控制运行时间,后面又增加设备数量的控制,然后就是到期时间的限制。这种有个巨大缺陷就是可复制性,如果将授权的秘钥文…

反馈处理慢如蜗牛?优化流程的方法看这里

在电商领域,客户反馈的及时处理直接影响着复购率和品牌声誉。然而,很多团队都面临着反馈跟进流程混乱的问题:反馈记录杂乱无章,处理状态不透明,甚至责任人不明确。这种混乱不仅拖慢了问题解决的速度,还严重影响了客户的信任感。 如何打破这一局面?答案就在于团队文档管理…