华为HarmonyOS 快速构建各种文本识别应用 -- 通用文字识别

news2025/1/9 14:32:40

适用场景

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

  • 可以对文档翻拍、街景翻拍等图片进行文字检测和识别,也可以集成于其他应用中,提供文字检测、识别的功能,并根据识别结果提供翻译、搜索等相关服务。
  • 可以处理来自相机、图库等多种来源的图像数据,提供一个自动检测文本、识别图像中文本位置以及文本内容功能的开放能力。
  • 支持特定角度范围内的文本倾斜、拍摄角度倾斜、复杂光照条件以及复杂文本背景等场景的文字识别。

开发步骤

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

     
      
    1. import { textRecognition } from '@kit.CoreVisionKit';

  2. 简单配置页面的布局,并在Button组件添加点击事件,拉起图库,选择图片。

     
      
    1. Button('选择图片')
    2. .type(ButtonType.Capsule)
    3. .fontColor(Color.White)
    4. .alignSelf(ItemAlign.Center)
    5. .width('80%')
    6. .margin(10)
    7. .onClick(() => {
    8. // 拉起图库,获取图片资源
    9. this.selectImage();
    10. })

  3. 通过图库获取图片资源,将图片转换为PixelMap,并添加初始化和释放方法。

     
      
    1. async aboutToAppear(): Promise<void> {
    2. const initResult = await textRecognition.init();
    3. hilog.info(0x0000, 'OCRDemo', `OCR service initialization result:${initResult}`);
    4. }
    5. async aboutToDisappear(): Promise<void> {
    6. await textRecognition.release();
    7. hilog.info(0x0000, 'OCRDemo', 'OCR service released successfully');
    8. }
    9. private async selectImage() {
    10. let uri = await this.openPhoto();
    11. if (uri === undefined) {
    12. hilog.error(0x0000, 'OCRDemo', "Failed to get uri.");
    13. return;
    14. }
    15. this.loadImage(uri);
    16. }
    17. private openPhoto(): Promise<string> {
    18. return new Promise<string>((resolve) => {
    19. let photoPicker: photoAccessHelper.PhotoViewPicker = new photoAccessHelper.PhotoViewPicker();
    20. photoPicker.select({
    21. MIMEType: photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE,
    22. maxSelectNumber: 1
    23. }).then((res: photoAccessHelper.PhotoSelectResult) => {
    24. resolve(res.photoUris[0]);
    25. }).catch((err: BusinessError) => {
    26. hilog.error(0x0000, 'OCRDemo', `Failed to get photo image uri. code:${err.code},message:${err.message}`);
    27. resolve('');
    28. })
    29. })
    30. }
    31. private loadImage(name: string) {
    32. setTimeout(async () => {
    33. let imageSource: image.ImageSource | undefined = undefined;
    34. let fileSource = await fileIo.open(name, fileIo.OpenMode.READ_ONLY);
    35. imageSource = image.createImageSource(fileSource.fd);
    36. this.chooseImage = await imageSource.createPixelMap();
    37. }, 100)
    38. }

  4. 实例化VisionInfo对象,并传入待检测图片的PixelMap。

    VisionInfo为待OCR检测识别的入参项,目前仅支持PixelMap类型的视觉信息。
     
      
    1. let visionInfo: textRecognition.VisionInfo = {
    2. pixelMap: this.chooseImage
    3. };

  5. 配置通用文本识别的配置项TextRecognitionConfiguration,用于配置是否支持朝向检测。

     
      
    1. let textConfiguration: textRecognition.TextRecognitionConfiguration = {
    2. isDirectionDetectionSupported: false
    3. };

  6. 调用textRecognition的recognizeText接口,对识别到的结果进行处理。

    当调用成功时,获取文字识别的结果;调用失败时,将返回对应错误码。

    recognizeText接口提供了三种调用形式,当前以其中一种作为示例,其他方式可参考API文档。
     
      
    1. textRecognition.recognizeText(visionInfo, textConfiguration)
    2. .then((data: textRecognition.TextRecognitionResult) => {
    3. // 识别成功,获取对应的结果
    4. let recognitionString = JSON.stringify(data);
    5. hilog.info(0x0000, 'OCRDemo', `Succeeded in recognizing text:${recognitionString}`);
    6. // 将结果更新到Text中显示
    7. this.dataValues = data.value;
    8. })
    9. .catch((error: BusinessError) => {
    10. hilog.error(0x0000, 'OCRDemo', `Failed to recognize text. Code: ${error.code}, message: ${error.message}`);
    11. this.dataValues = `Error: ${error.message}`;
    12. });

开发实例

点击按钮,识别一张图片的文字内容,并通过日志打印。

 
  1. import { textRecognition } from '@kit.CoreVisionKit'
  2. import { image } from '@kit.ImageKit';
  3. import { hilog } from '@kit.PerformanceAnalysisKit';
  4. import { BusinessError } from '@kit.BasicServicesKit';
  5. import { fileIo } from '@kit.CoreFileKit';
  6. import { photoAccessHelper } from '@kit.MediaLibraryKit';
  7. @Entry
  8. @Component
  9. struct Index {
  10. private imageSource: image.ImageSource | undefined = undefined;
  11. @State chooseImage: PixelMap | undefined = undefined;
  12. @State dataValues: string = '';
  13. async aboutToAppear(): Promise<void> {
  14. const initResult = await textRecognition.init();
  15. hilog.info(0x0000, 'OCRDemo', `OCR service initialization result:${initResult}`);
  16. }
  17. async aboutToDisappear(): Promise<void> {
  18. await textRecognition.release();
  19. hilog.info(0x0000, 'OCRDemo', 'OCR service released successfully');
  20. }
  21. build() {
  22. Column() {
  23. Image(this.chooseImage)
  24. .objectFit(ImageFit.Fill)
  25. .height('60%')
  26. Text(this.dataValues)
  27. .copyOption(CopyOptions.LocalDevice)
  28. .height('15%')
  29. .margin(10)
  30. .width('60%')
  31. Button('选择图片')
  32. .type(ButtonType.Capsule)
  33. .fontColor(Color.White)
  34. .alignSelf(ItemAlign.Center)
  35. .width('80%')
  36. .margin(10)
  37. .onClick(() => {
  38. // 拉起图库,获取图片资源
  39. this.selectImage();
  40. })
  41. Button('开始识别')
  42. .type(ButtonType.Capsule)
  43. .fontColor(Color.White)
  44. .alignSelf(ItemAlign.Center)
  45. .width('80%')
  46. .margin(10)
  47. .onClick(async () => {
  48. this.textRecognitionTest();
  49. })
  50. }
  51. .width('100%')
  52. .height('100%')
  53. .justifyContent(FlexAlign.Center)
  54. }
  55. private textRecognitionTest() {
  56. if (!this.chooseImage) {
  57. return;
  58. }
  59. // 调用文本识别接口
  60. let visionInfo: textRecognition.VisionInfo = {
  61. pixelMap: this.chooseImage
  62. };
  63. let textConfiguration: textRecognition.TextRecognitionConfiguration = {
  64. isDirectionDetectionSupported: false
  65. };
  66. textRecognition.recognizeText(visionInfo, textConfiguration)
  67. .then((data: textRecognition.TextRecognitionResult) => {
  68. // 识别成功,获取对应的结果
  69. let recognitionString = JSON.stringify(data);
  70. hilog.info(0x0000, 'OCRDemo', `Succeeded in recognizing text:${recognitionString}`);
  71. // 将结果更新到Text中显示
  72. this.dataValues = data.value;
  73. })
  74. .catch((error: BusinessError) => {
  75. hilog.error(0x0000, 'OCRDemo', `Failed to recognize text. Code: ${error.code}, message: ${error.message}`);
  76. this.dataValues = `Error: ${error.message}`;
  77. });
  78. }
  79. private async selectImage() {
  80. let uri = await this.openPhoto();
  81. if (uri === undefined) {
  82. hilog.error(0x0000, 'OCRDemo', "Failed to get uri.");
  83. return;
  84. }
  85. this.loadImage(uri);
  86. }
  87. private openPhoto(): Promise<string> {
  88. return new Promise<string>((resolve) => {
  89. let photoPicker: photoAccessHelper.PhotoViewPicker = new photoAccessHelper.PhotoViewPicker();
  90. photoPicker.select({
  91. MIMEType: photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE,
  92. maxSelectNumber: 1
  93. }).then((res: photoAccessHelper.PhotoSelectResult) => {
  94. resolve(res.photoUris[0]);
  95. }).catch((err: BusinessError) => {
  96. hilog.error(0x0000, 'OCRDemo', `Failed to get photo image uri. Code:${err.code},message:${err.message}`);
  97. resolve('');
  98. })
  99. })
  100. }
  101. private loadImage(name: string) {
  102. setTimeout(async () => {
  103. let fileSource = await fileIo.open(name, fileIo.OpenMode.READ_ONLY);
  104. this.imageSource = image.createImageSource(fileSource.fd);
  105. this.chooseImage = await this.imageSource.createPixelMap();
  106. }, 100)
  107. }
  108. }

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【系统架构核心服务设计】使用 Redis ZSET 实现排行榜服务

目录 一、排行榜的应用场景 二、排行榜技术的特点 三、使用Redis ZSET实现排行榜 3.1 引入依赖 3.2 配置Redis连接 3.3 创建实体类&#xff08;可选&#xff09; 3.4 编写 Redis 操作服务层 3.5 编写控制器层 3.6 测试 3.6.1 测试 addMovieScore 接口 3.6.2 测试 g…

【Docker】如何在Docker中配置防火墙规则?

Docker本身并不直接管理防火墙规则&#xff1b;它依赖于主机系统的防火墙设置。不过&#xff0c;Docker在启动容器时会自动配置一些iptables规则来管理容器网络流量。如果你需要更细粒度地控制进出容器的流量&#xff0c;你需要在主机系统上配置防火墙规则。以下是如何在Linux主…

java+ssm+mysql美妆论坛

项目介绍&#xff1a; 使用javassmmysql开发的美妆论坛&#xff0c;系统包含超级管理员&#xff0c;系统管理员、用户角色&#xff0c;功能如下&#xff1a; 用户&#xff1a;主要是前台功能使用&#xff0c;包括注册、登录&#xff1b;查看论坛板块和板块下帖子&#xff1b;…

【MFC】vs2019中使用sqlite3完成学生管理系统

目录 效果图list Contral 控件的简单使用使用sqlite3 效果图 使用sqlite3完成简单的数据库操作。 list Contral 控件的简单使用 本章只介绍基本应用 添加表头&#xff1a;语法&#xff1a; int InsertColumn(int nCol, LPCTSTR lpszColumnHeading, int nFormat LVCFMT_LEFT…

Java设计模式 —— 【创建型模式】建造者模式详解

文章目录 一、建造者模式二、案例实现三、优缺点四、模式拓展五、对比1、工厂方法模式VS建造者模式2、抽象工厂模式VS建造者模式 一、建造者模式 建造者模式&#xff08;Builder Pattern&#xff09; 又叫生成器模式&#xff0c;是一种对象构建模式。它可以将复杂对象的建造过…

单链表(C语言版本)

前提 不探讨头结点空链表可以插入和查找&#xff0c;不可删除一般不选择phead移动&#xff0c;定义一个新结点把phead赋给他&#xff0c;移动新结点即可单链表不适合在前面和后面插入或删除&#xff0c;适合在后面插入删除 头插 void SLPushFront(SLTNode** pphead, SLTDataTy…

VMware虚拟机搭建和镜像配置

VMware虚拟机搭建和镜像配置 下载安装VMware 开始下载 更改安装路径&#xff0c;需要一个大空间的盘 更改后下一步 下一步后&#xff0c;选择不主动升级更新 一直下一步 直到安装完毕 输入许可密钥&#xff0c;我下载的版本是12&#xff0c;输入完成点击输入&#xff…

使用PPT科研绘图导出PDF边缘留白问题解决方案

使用PPT画图导出PDF格式后&#xff0c;边缘有空白&#xff0c;插入latex不美观&#xff0c;解决方案为自定义PPT幻灯片母版大小&#xff0c;如题步骤为&#xff1a; 1、查看已制作好的图片的大小&#xff0c;即长度和宽度 2、选择自定义幻灯片大小 3、自定义幻灯片大小为第1…

在Ubuntu上使用docker compose安装N卡GPU的Ollama服务

在现代计算环境中,利用 GPU 进行计算加速变得越来越重要。下面将讲解如何在Ubuntu上使用docker compose安装N卡GPU的Ollama服务。 1、安装 NVIDIA 容器工具 首先,需要确保你的系统已经安装了 NVIDIA 容器工具 nvidia-container-toolkit。这是让 Docker 容器访问 GPU 的关键…

如何借助前端表格控件实现金融投资分析平台?

最新技术资源&#xff08;建议收藏&#xff09; https://www.grapecity.com.cn/resources/ 金融投资分析背景介绍 金融投资分析是金融领域的核心活动&#xff0c;它要求对资产、市场及经济数据进行深入研究&#xff0c;以识别并评估潜在的投资机会与风险。这一过程融合了宏观经…

01_Node.js入门 (黑马)

01_Node.js入门 知识点自测 从 index.js 出发&#xff0c;访问到 student/data.json 的相对路径如何写? A&#xff1a;../public/teacher/data.json B&#xff1a;./public/student/data.json C&#xff1a;../student/data.json <details><summary>答案</sum…

快速构建NLP理论知识体系

NLP理论知识体系 一句话解释NLPNLP模型及原理简述1、Rag 一句话解释NLP 如果我们要实现机器翻译、情感分析、问答系统、文本摘要、聊天机器人、构造智能化的辅助文件填写模板&#xff0c;NLP可以通过现成的模型对输入的语音、文字、图片进行处理&#xff08;分词、标词性、去停…

Python:import语句的详细解析(绝对路径导入和相对路径导入)

相关阅读 Pythonhttps://blog.csdn.net/weixin_45791458/category_12403403.html?spm1001.2014.3001.5482 import语句是Python中一个很重要的机制&#xff0c;允许在一个文件中访问另一个文件的函数、类、变量等&#xff0c;本文就将进行详细介绍。 在具体谈论import语句前&a…

CUDA 计时功能,记录GPU程序/函数耗时,cudaEventCreate,cudaEventRecord,cudaEventElapsedTime

为了测试GPU函数的耗时&#xff0c;可以使用 CUDA 提供的计时功能&#xff1a;cudaEventCreate, cudaEventRecord, 和 cudaEventElapsedTime。这些函数可以帮助你测量某个 CUDA 操作&#xff08;如设置设备&#xff09;所花费的时间。 一、记录耗时案例 以下是一个示例程序&a…

数字图像处理(15):图像平移

&#xff08;1&#xff09;图像平移的基本原理&#xff1a;计算每个像素点的移动向量&#xff0c;并将这些像素按照指定的方向和距离进行移动。 &#xff08;2&#xff09;平移向量包括水平和垂直分量&#xff0c;可以表示为&#xff08;dx&#xff0c;dy&#xff09;&#xff…

Hyper-V安装Win11虚拟机并设置vGPU显卡直通

一、为什么我使用Hyper-V虚拟机 我的宿主机是Win11,想装一个Win10或Win11虚拟机。但是我用VMware安装Win10或Win11后,随机地蓝屏,非常烦人,估计是和宿主机的某些设置有关,或者宿主机电脑硬件比较新(我电脑装Win10就会蓝屏,Win11就不会),某些特性不支持。 所以我就安…

Qt Xlsx安装教程

Qt Xlsx安装教程 安装perl 如果没有安装perl&#xff0c;请参考perl Window安装教程 下载QtXlsxWriter源码 下载地址 ming32-make编译32 lib库 C:\Qt\Qt5.12.12\5.12.12\mingw73_32>d: D:\>cd D:\Code\QtXlsxWriter-master\QtXlsxWriter-master D:\Code\QtXlsxWrit…

C# RSA加密和解密,RSA生成私钥和公钥

C# RSA加密和解密&#xff0c;RSA生成私钥和公钥&#xff08;使用XML格式秘钥&#xff09; 目录 前言生成xml格式的公钥和私钥 PrivateKeyPublicKey测试加密、解密 方案1&#xff1a;RSA公钥加密&#xff0c;RSA私钥解密方案2&#xff1a;RSA私钥加密&#xff0c;RSA私钥解密…

【Rive】Android与Rive交互

1 Android与Rive交互的常用接口 1.1 RiveAnimationView参数 <app.rive.runtime.kotlin.RiveAnimationViewandroid:id"id/rive_view"android:layout_width"match_parent"android:layout_height"match_parent"android:adjustViewBounds"…

捷米特 EtherNet/IP 总线协议网关的具体内容介绍

关于EtherNET/IP的基本介绍 EtherNet/IP 中的 “Ethernet” 指以太网&#xff0c;是一种常见的局域网技术&#xff0c;用于在有限区域内实现多台设备之间的数据传输&#xff1b;“IP” 在此处指工业协议&#xff08;Industrial Protocol&#xff09;&#xff0c;而不是通常所说…