鸿蒙AI功能开发【拍照识别文字】

news2024/11/24 4:21:02

拍照识别文字

介绍

本示例通过使用@ohos.multimedia.camera (相机管理)和textRecognition(文字识别)接口来实现识别提取照片内文字的功能。

效果预览

1

使用说明

1.点击界面下方圆形文字识别图标,弹出文字识别结果信息界面,显示当前照片的文字识别结果;

2.点击除了弹窗外的空白区域,弹窗关闭,返回主页。

具体实现

  • 本实例完成AI文字识别的功能模块主要封装在CameraModel,源码参考:[CameraModel.ets]。
/*
 * Copyright (c) 2023 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
import { BusinessError } from '@kit.BasicServicesKit';
import { camera } from '@kit.CameraKit';
import { common } from '@kit.AbilityKit';
import { image } from '@kit.ImageKit';
import { textRecognition } from '@kit.CoreVisionKit';
import Logger from './Logger';
import CommonConstants from '../constants/CommonConstants';

const TAG: string = '[CameraModel]';

export default class Camera {
  private cameraMgr: camera.CameraManager | undefined = undefined;
  private cameraDevice: camera.CameraDevice | undefined = undefined;
  private capability: camera.CameraOutputCapability | undefined = undefined;
  private cameraInput: camera.CameraInput | undefined = undefined;
  public previewOutput: camera.PreviewOutput | undefined = undefined;
  private receiver: image.ImageReceiver | undefined = undefined;
  private photoSurfaceId: string | undefined = undefined;
  private photoOutput: camera.PhotoOutput | undefined = undefined;
  public captureSession: camera.PhotoSession | undefined = undefined;
  public result: string = '';
  private imgReceive: Function | undefined = undefined;

  async initCamera(surfaceId: string): Promise<void> {
    this.cameraMgr = camera.getCameraManager(getContext(this) as common.UIAbilityContext);
    let cameraArray = this.getCameraDevices(this.cameraMgr);
    this.cameraDevice = cameraArray[CommonConstants.INPUT_DEVICE_INDEX];
    this.cameraInput = this.getCameraInput(this.cameraDevice, this.cameraMgr) as camera.CameraInput;
    await this.cameraInput.open();
    this.capability = this.cameraMgr.getSupportedOutputCapability(this.cameraDevice, camera.SceneMode.NORMAL_PHOTO);

    this.previewOutput = this.getPreviewOutput(this.cameraMgr, this.capability, surfaceId) as camera.PreviewOutput;
    this.photoOutput = this.getPhotoOutput(this.cameraMgr, this.capability) as camera.PhotoOutput;

    this.photoOutput.on('photoAvailable', (errCode: BusinessError, photo: camera.Photo): void => {
      let imageObj = photo.main;
      imageObj.getComponent(image.ComponentType.JPEG,async (errCode: BusinessError, component: image.Component)=> {
        if (errCode || component === undefined) {
          return;
        }
        let buffer: ArrayBuffer;
        buffer = component.byteBuffer
        this.result = await this.recognizeImage(buffer);
      })
    })

    // Session Init
    this.captureSession = this.getCaptureSession(this.cameraMgr) as camera.PhotoSession;
    this.beginConfig(this.captureSession);
    this.startSession(this.captureSession, this.cameraInput, this.previewOutput, this.photoOutput);
  }

  async takePicture() {
    this.result = '';
    this.photoOutput!.capture();
  }

  async recognizeImage(buffer: ArrayBuffer): Promise<string> {
    let imageResource = image.createImageSource(buffer);
    let pixelMapInstance = await imageResource.createPixelMap();
    let visionInfo: textRecognition.VisionInfo = {
      pixelMap: pixelMapInstance
    };
    let textConfiguration: textRecognition.TextRecognitionConfiguration = {
      isDirectionDetectionSupported: true
    };
    let recognitionString: string = '';
    if (canIUse("SystemCapability.AI.OCR.TextRecognition")) {
      await textRecognition.recognizeText(visionInfo, textConfiguration).then((TextRecognitionResult) => {
        if (TextRecognitionResult.value === '') {
          let context = getContext(this) as common.UIAbilityContext
          recognitionString = context.resourceManager.getStringSync($r('app.string.unrecognizable').id);
        } else {
          recognitionString = TextRecognitionResult.value;
        }
      })
      pixelMapInstance.release();
      imageResource.release();
    } else {
      let context = getContext(this) as common.UIAbilityContext
      recognitionString = context.resourceManager.getStringSync($r('app.string.Device_not_support').id);
      Logger.error(TAG, `device not support`);
    }
    return recognitionString;
  }

  async releaseCamera(): Promise<void> {
    if (this.cameraInput) {
      await this.cameraInput.close();
      Logger.info(TAG, 'cameraInput release');
    }
    if (this.previewOutput) {
      await this.previewOutput.release();
      Logger.info(TAG, 'previewOutput release');
    }
    if (this.receiver) {
      await this.receiver.release();
      Logger.info(TAG, 'receiver release');
    }
    if (this.photoOutput) {
      await this.photoOutput.release();
      Logger.info(TAG, 'photoOutput release');
    }
    if (this.captureSession) {
      await this.captureSession.release();
      Logger.info(TAG, 'captureSession release');
      this.captureSession = undefined;
    }
    this.imgReceive = undefined;
  }

  getCameraDevices(cameraManager: camera.CameraManager): Array<camera.CameraDevice> {
    let cameraArray: Array<camera.CameraDevice> = cameraManager.getSupportedCameras();
    if (cameraArray != undefined && cameraArray.length > 0) {
      return cameraArray;
    } else {
      Logger.error(TAG, `getSupportedCameras faild`);
      return [];
    }
  }

  getCameraInput(cameraDevice: camera.CameraDevice, cameraManager: camera.CameraManager): camera.CameraInput | undefined {
    let cameraInput: camera.CameraInput | undefined = undefined;
    cameraInput = cameraManager.createCameraInput(cameraDevice);
    return cameraInput;
  }

  getPreviewOutput(cameraManager: camera.CameraManager, cameraOutputCapability: camera.CameraOutputCapability,
                   surfaceId: string): camera.PreviewOutput | undefined {
    let previewProfilesArray: Array<camera.Profile> = cameraOutputCapability.previewProfiles;
    let previewOutput: camera.PreviewOutput | undefined = undefined;
    previewOutput = cameraManager.createPreviewOutput(previewProfilesArray[CommonConstants.OUTPUT_DEVICE_INDEX], surfaceId);
    return previewOutput;
  }

  async getImageReceiverSurfaceId(receiver: image.ImageReceiver): Promise<string | undefined> {
    let photoSurfaceId: string | undefined = undefined;
    if (receiver !== undefined) {
      photoSurfaceId = await receiver.getReceivingSurfaceId();
      Logger.info(TAG, `getReceivingSurfaceId success`);
    }
    return photoSurfaceId;
  }

  getPhotoOutput(cameraManager: camera.CameraManager, cameraOutputCapability: camera.CameraOutputCapability): camera.PhotoOutput | undefined {
    let photoProfilesArray: Array<camera.Profile> = cameraOutputCapability.photoProfiles;
    Logger.info(TAG, JSON.stringify(photoProfilesArray));
    if (!photoProfilesArray) {
      Logger.info(TAG, `createOutput photoProfilesArray == null || undefined`);
    }
    let photoOutput: camera.PhotoOutput | undefined = undefined;
    try {
      photoOutput = cameraManager.createPhotoOutput(photoProfilesArray[CommonConstants.OUTPUT_DEVICE_INDEX]);
    } catch (error) {
      Logger.error(TAG, `Failed to createPhotoOutput. error: ${JSON.stringify(error as BusinessError)}`);
    }
    return photoOutput;
  }

  getCaptureSession(cameraManager: camera.CameraManager): camera.PhotoSession | undefined {
    let captureSession: camera.PhotoSession | undefined = undefined;
    try {
      captureSession = cameraManager.createSession(1) as camera.PhotoSession;
    } catch (error) {
      Logger.error(TAG, `Failed to create the CaptureSession instance. error: ${JSON.stringify(error as BusinessError)}`);
    }
    return captureSession;
  }

  beginConfig(captureSession: camera.PhotoSession): void {
    try {
      captureSession.beginConfig();
      Logger.info(TAG, 'captureSession beginConfig')
    } catch (error) {
      Logger.error(TAG, `Failed to beginConfig. error: ${JSON.stringify(error as BusinessError)}`);
    }
  }

  async startSession(captureSession: camera.PhotoSession, cameraInput: camera.CameraInput, previewOutput:
    camera.PreviewOutput, photoOutput: camera.PhotoOutput): Promise<void> {
    captureSession.addInput(cameraInput);
    captureSession.addOutput(previewOutput);
    captureSession.addOutput(photoOutput);
    await captureSession.commitConfig().then(() => {
      Logger.info(TAG, 'Promise returned to captureSession the session start success.')
    }).catch((err: BusinessError) => {
      Logger.info(TAG, 'captureSession error')
      Logger.info(TAG, JSON.stringify(err))
    });
    await captureSession.start().then(() => {
      Logger.info(TAG, 'Promise returned to indicate the session start success.')
    }).catch((err: BusinessError) => {
      Logger.info(TAG, JSON.stringify(err))
    })
  }
}
  • 相机模块:在Camera中封装了相机初始化、相机释放。
  • 在Index页面通过点击事件触发相机拍摄,在获取到照片输出流后通过@hms.ai.ocr.textRecognition文字识别接口进行识别。

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

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

相关文章

学习大数据DAY32 HTML基础语法和Flask库的使用

目录 HTML 超文本标记语言 Hyper Text Markup Language 上机练习 9 Flask 显示层 UI 前后端结合动态加载列表数据 flask 在 html 中的语法 上机练习 10 HTML 超文本标记语言 Hyper Text Markup Language 1.<html></html>: 根标签 2.<head></head&…

贝塞尔曲线参数方程推导

1.贝塞尔曲线简介 1.1什么是贝塞尔曲线 贝塞尔曲线于 1962 年&#xff0c;由法国工程师皮埃尔贝济埃&#xff08;Pierre Bzier&#xff09;所广泛发表&#xff0c;他运用贝塞尔曲线来为汽车的主体进行设计。 贝塞尔曲线主要用于二维图形应用程序中的数学曲线&#xff0c;曲线…

opencascade TopoDS_Builder 源码学习

opencascade TopoDS_Builder 前言 构建器&#xff08;Builder&#xff09;用于创建拓扑数据结构。它是构建器类层次结构的根。 构建器中包含三组方法&#xff1a; Make 方法用于创建形状&#xff08;Shapes&#xff09;。Add 方法用于将一个形状包含到另一个形状中。Remove…

访问网站显示不安全怎么办?

访问网站时显示“不安全”&#xff0c;针对不同的原因有不同的解决方式&#xff0c;下面是常见的几种原因和对应的解决办法。 1.未启用HTTPS协议 如果网站仅使用HTTP协议&#xff0c;数据传输没加密&#xff0c;因此会被浏览器标记为“不安全”。解决办法是启用HTTPS协议,给…

可观察性与人工智能的结合:解锁数据收集、分析和预测的新领域

随着软件系统变得越来越复杂&#xff0c;可观察性&#xff08;根据系统外部输出了解系统内部状态的能力&#xff09;已成为开发人员和运营团队的一项关键实践。 传统的可观测性方法难以跟上现代应用的规模和复杂性。随着遥测数据量的增加&#xff0c;导航变得成本高昂且复杂。…

【计算机组成原理】各种周期与字长的概念辨析

前言 在计算机组成原理中&#xff0c;我们会在做题时遇到各种周期与字长的概念辨析题&#xff08;非常重要&#xff09;&#xff0c;因此我们再次统一做一个梳理&#xff0c;帮助大家在理解的基础上进行记忆&#xff0c;并附上几道好题辅助理解。 概念讲解 指令周期&#xff…

【轻松掌握】使用Spring-AI轻松访问大模型本地化部署并搭建UI界面访问指南

文章目录 读前必看什么是Spring-AI目前已支持的对接模型本文使用Spring-AI版本构建项目选择必要的依赖配置系统变量 聊天模型API配置文件方式1-使用默认配置方式2-自定义配置配置其他参数使用示例 图像模型API配置文件方式1-使用默认配置方式2-自定义配置配置其他参数使用示例 …

N5 - 使用Gensim库训练word2vec模型

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目录 环境步骤分词训练word2vec模型模型应用计算词汇间的相似度找出不匹配的词汇计算词汇的词频 总结与心得体会 环境 安装gensim和jieba库 pip install gen…

mysql实现MHA

一、什么是MHA 高可用模式下的故障切换&#xff0c;基于主从复制&#xff0c;单点故障和主从复制不能切换的问题&#xff0c;架构需要奇数台&#xff0c;至少需要3台&#xff0c;故障切换过程0-30秒&#xff0c;vip地址&#xff0c;根据vip地址所在的主机&#xff0c;确定主备…

全网最最实用--边缘智能的常见微调方式以及适用场景

文章目录 1. BitFit2. Adapter3. Prompt-Tuning4. Prefix-Tuning5. LoRA (Low-Rank Adaptation)6. QLoRA (Quantized Low-Rank Adaptation)7. LongLoRA总结 1. BitFit https://arxiv.org/abs/2106.10199 主要做法&#xff1a; BitFit&#xff08;Bias Term Fine-Tuning&#…

日撸Java三百行(day15:栈的应用之括号匹配)

目录 一、栈的括号匹配 二、代码实现 1.方法创建 2.数据测试 3.完整的程序代码 总结 一、栈的括号匹配 要完成今天的任务&#xff0c;需要先来了解一下什么是栈的括号匹配。首先&#xff0c;顾名思义&#xff0c;括号匹配就是指将一对括号匹配起来&#xff0c;我们给定一…

HashTable源码

引子 看到一个关于HashMap和HashTable对比的面试题&#xff0c;于是简单看了下HashTable的源码&#xff0c;简单记录下。 概述 与HashMap相似的哈希表结构&#xff0c;有很多不同点&#xff1a; 节点数组的初始化是在构造函数中完成的&#xff0c;初始容量11&#xff0c;负载因…

基于JSP、java、Tomcat三者的项目实战--校园交易网(3)主页--历史清单

技术支持&#xff1a;JAVA、JSP 服务器&#xff1a;TOMCAT 7.0.86 编程软件&#xff1a;IntelliJ IDEA 2021.1.3 x64 前文几个功能的实现的博客 基于JSP、java、Tomcat、mysql三层交互的项目实战--校园交易网&#xff08;1&#xff09;-项目搭建&#xff08;前期准备工作&a…

工具学习_CVE Binary Tool

1. 工具概述 CVE Binary Tool 是一个免费的开源工具&#xff0c;可帮助您使用国家漏洞数据库&#xff08;NVD&#xff09;常见漏洞和暴露&#xff08;CVE&#xff09;列表中的数据以及Redhat、开源漏洞数据库&#xff08;OSV&#xff09;、Gitlab咨询数据库&#xff08;GAD&am…

鸿蒙AI功能开发【人脸活体验证控件】 机器学习-场景化视觉服务

人脸活体验证控件 介绍 本示例展示了使用视觉类AI能力中的人脸活体验证能力。 本示例模拟了在应用里&#xff0c;跳转人脸活体验证控件&#xff0c;获取到验证结果并展示出来。 需要使用hiai引擎框架人脸活体验证接口kit.VisionKit.d.ts。 效果预览 使用说明&#xff1a; …

RK3568平台开发系列讲解(文件系统篇)文件描述符 fd(File Descriptor)是什么?

📢USB控制传输是USB通信中的一种基本传输类型,用于控制USB设备的配置和操作。它由 Setup 阶段和 Data 阶段组成,可用于发送命令、读取状态、配置设备等操作。 一、文件描述符 fd(File Descriptor)是什么? 文件描述符 fd 是一个非负整数,用来标识一个打开的文件,由内核…

用户态tcp协议栈四次挥手-服务端发送fin时,客户端不返回ac

问题&#xff1a; 四次挥手时&#xff0c;服务端发送fin后&#xff0c;客户端不发送ack&#xff0c;反而过了2min后发了个rst报文 62505是客户端&#xff0c;8889是服务端 解决&#xff1a; 服务端返回fin报文时带上ack标记

微波武器反无人机技术详解

微波武器反无人机技术中展现出了独特的优势和广阔的应用前景。以下是对微波武器在反无人机技术方面的详细解析&#xff1a; 一、微波武器概述 微波武器是指配备高功率微波&#xff08;High-Power Microwave, HPM&#xff09;载荷的作战武器&#xff0c;能够发射高能量的电磁脉…

在AI浪潮中保持核心竞争力:XIAOJUSURVEY的智能化探索

讲点实在的 在AI技术快速发展的今天&#xff0c;各行各业的工作方式正经历深刻变革。尤其是身处浪潮中甚至最有机会推动发展的我们&#xff0c;更需要置身事内。 ChatGPT、Copilot等的普及&#xff0c;使得编程效率显著提升&#xff0c;但也带来了新的挑战。为了在这种变革中…

C++输出为非科学计数法不同数据类型表示范围

目录 一、C数据类型 1、基本的内置类型 2、修饰符 &#xff08;1&#xff09;signed 和 unsigned &#xff08;2&#xff09;short 和 long &#xff08;3&#xff09;区别总结 默认情况 二、类型转换 1、静态转换&#xff08;Static Cast&#xff09; 2、动态转换&a…