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

拍照识别文字

介绍

本示例通过使用@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.byteBufferthis.result = await this.recognizeImage(buffer);})})// Session Initthis.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.UIAbilityContextrecognitionString = context.resourceManager.getStringSync($r('app.string.unrecognizable').id);} else {recognitionString = TextRecognitionResult.value;}})pixelMapInstance.release();imageResource.release();} else {let context = getContext(this) as common.UIAbilityContextrecognitionString = 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.rhkb.cn/news/393889.html

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

相关文章

搜狗爬虫(www.sogou.com)IP及UA,真实采集数据

一、数据来源&#xff1a; 1、这批搜狗爬虫&#xff08;www.sogou.com&#xff09;IP来源于尚贤达猎头网站采集数据&#xff1b; ​ 2、数据采集时间段&#xff1a;2023年10月-2024年7月&#xff1b; 3、判断标准&#xff1a;主要根据用户代理是否包含“www.sogou.com”和IP核实…

Gazebo之MyRobot建立

Gazebo之MyRobot建立 1. 源由2. 示例Step 1: 新建一个简单世界Step 2: 新建一个模型(model)Step 3: 机器人组成链接(Links)Step 3.1: 新增底盘(Links/Chassis)Step 3.1.1: 惯性属性(Inertial properties)Step 3.1.2: 视觉(Visual)Step 3.1.3: 碰撞(Collision) Step 3.2: 新增左…

C语言 操作符详解

目录 一、操作符的分类 二、二进制和进制转换 2.1 二进制转十进制 2.2 二进制转八进制 2.3 二进制转十六进制 三、原码、反码、补码 四、移位操作符 4.1 左移操作符 ​编辑 4.2 右移操作符 五、位操作符 按位与&#xff1a;& 按位或&#xff1a;| 按位异或&#x…

16个好用到爆的Python实用脚本!

以下是16个非常实用的Python脚本示例&#xff0c;每个脚本都有其特定的用途&#xff0c;并且我会附上相应的源码。这些脚本涵盖了数据处理、网络请求、文件操作等多个方面&#xff0c;非常适合初学者和进阶者学习和使用。 1. 批量重命名文件 import osdef batch_rename(fold…

【Python】数据类型之集合

集合是一个无序、可变、不允许元素重复的容器。 1、定义 v1{11,22,33} 1&#xff09;&#xff09;无序&#xff1a;集合无法通过索引取值。 2&#xff09;&#xff09;可变&#xff1a;可以添加和删除集合中的元素。 3&#xff09;&#xff09;集合不允许元素重复。 例如…

MySQL中常用工具

MySQL自带的系统数据库 常用工具 MySQL mysqladmin mysqlbinlog mysqldump mysqlimport/source mysqlimport只能导入文本文件&#xff0c;不能导入sql文件

C++分析红黑树

目录 红黑树介绍 红黑树的性质与平衡控制关系 红黑树节点的插入 情况1&#xff1a;不需要调整 情况2&#xff1a;uncle节点为红色 情况3&#xff1a;uncle节点为黑色 总结与代码实现 红黑树的删除&#xff08;待实现&#xff09; 红黑树的效率 红黑树介绍 红黑树是第二种平衡二…

提前批测开三面,已OC!

大家好&#xff0c;我是洋子 近期百度提前批已经开始有一段时间了&#xff0c;甚至已经有不少 25 届的同学 oc 了&#xff0c;这里分享一位已经顺利 oc 百度提前批测开岗位同学的三轮面试面经 整个三轮技术面试总体难度不高&#xff0c;但考察知识广度比较广&#xff0c;如果…

SQL注入:MySQL元数据库,外网实战手工SQL注入

MySQL元数据库 MySQL的元数据库是一组特殊的数据库&#xff0c;用于存储MySQL服务器的元数据信息&#xff0c;在sql注入中较为常用为以下两种元数据库&#xff1a; information_schema&#xff1a;这个数据库包含了MySQL服务器上所有其他数据库的元数据信息。例如数据库名、表…

AI人工智能为企业带来的优势及应用例子

自2022年知名大型语言模型及其他 AI 产品面世至今&#xff0c;无论商界、政府以至社会各界都逐渐关注人工智能的发展&#xff0c;并纷纷引入 AI 技术&#xff0c;全球正式踏入人工智能的新纪元。根据 Statista 一份有关全球人工智能软件的数据研究&#xff0c;至2025年预测各国…

Pytorch基础模型,数据加载,优化算法

目录 一.nn.Module 二.优化器类 三.损失函数 四.在GPU上运行代码 五.常见的优化算法 1.梯度下降算法 2.动量法&#xff1a; 3.AdaGrad 4.RMSProp 六.Pytorch中的数据加载 1.数据集类 2.迭代数据集 2.Pytorch自带的数据集 一.nn.Module nn.Modul是torch.nn提供的一个…

趋动科技荣登「AIGC赋能金融创新引领者TOP20」

2023年11月28日&#xff0c;“极新AIGC行业峰会”在北京召开&#xff0c;峰会以“AI落地”为指引&#xff0c;探究AI实践与产业化。 从制造业到金融服务业&#xff0c;从医疗保健到交通运输&#xff0c;从文化娱乐到消费零售&#xff0c;智能客服、数字人直播、智能巡检机器人&…

vue前端项目--路由vue-router

1. 路由介绍 我们可以总结一下从早期网站开发到现代单页应用(SPA)的发展过程及其关键概念&#xff1a; 早期的服务器端渲染 (SSR): 早期的网站开发中&#xff0c;服务器负责生成完整的 HTML 页面&#xff0c;并将其发送给客户端展示。 每个 URL 对应一个特定的控制器(Control…

基于CUDA12.1+CUDNN8.9+PYTORCH2.3.1,实现自定义数据集训练

目录 0 结果预览 1 核心点 2 参考链接 0 结果预览 1 核心点 yolo命令行CL需要将虚拟环境的yolo程序加入系统路径。 遇到conda install 失效问题&#xff0c;重建新的虚拟环境&#xff0c;再进行安装。 whl可以下载好后再安装。 pip install F:\tool\ai\torch-2.3.1cu…

leetcode日记(64)最小覆盖子串

很复杂的题目&#xff0c;无论是思路还是实践都很难… 思路还是看了答案&#xff08;&#xff1f;&#xff09;设定两个指针“框”出一串字符串&#xff0c;初始两个指针都指在s的零位&#xff0c;先移动下指针&#xff0c;直到使框出的字符串中包含t中所有字符串&#xff0c;…

JDK17安装与配置

为了学习spring boot3.x&#xff0c;首先确保本地安装了17以上的jdk版本。 安装版本&#xff1a;jdk-17.0.10_windows-x64_bin.exe 傻瓜式安装&#xff0c;步骤省略&#xff0c;这里设置的安装位置&#xff1a;D:\Programs\Java\jdk-17 JAVA_HOME环境变量配置&#xff1a; #…

容器七层负载均衡解决方案——IngressNGINX

一、概述 当我们使用 K8S 对容器进行编排时&#xff0c;基于负载均衡和高可用方面考虑&#xff0c;且设计上 Pod 易失态&#xff0c;不能直接使用 PodIP 作为外部访问的方式。因此&#xff0c;K8S 官方提供了一些负载均衡的解决方案。这其中有四层和七层两种&#xff0c;本文主…

养猫必看!热销猫罐头有哪些?2024年推荐这4款口碑很好的主食罐

开猫咖3年啦&#xff0c;店里有加菲&#xff0c;美短&#xff0c;布偶&#xff0c;暹罗&#xff0c;都是我一手带大的。店铺开在高校附近&#xff0c;顾客以学生为主&#xff0c;也有很多养猫人士会到店里来&#xff0c;和我交流选粮经验。很多养猫人都在喂主食罐头&#xff0c…

FreeRTOS基础入门——FreeRTOS的任务基础知识(四)

个人名片&#xff1a; &#x1f393;作者简介&#xff1a;嵌入式领域优质创作者&#x1f310;个人主页&#xff1a;妄北y &#x1f4de;个人QQ&#xff1a;2061314755 &#x1f48c;个人邮箱&#xff1a;[mailto:2061314755qq.com] &#x1f4f1;个人微信&#xff1a;Vir2025WB…

Leetcode每日刷题之字符串相加(C++)

在学习的同时也不要忘记适当练习&#xff0c;本题字符串相加主要在于字符串类型与整数类型的转化&#xff0c;要将字符串类型转化为整数类型计算后转化为字符串类型输出即可。 思路解析 根据题中给出的信息&#xff0c;我们不可以使用库函数计算大整数&#xff0c;也不能直接将…