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

拍照识别文字

介绍

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

效果预览

使用说明

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文字识别接口进行识别。

相关推荐
SoraLuna2 小时前
「Mac畅玩鸿蒙与硬件47」UI互动应用篇24 - 虚拟音乐控制台
开发语言·macos·ui·华为·harmonyos
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭4 小时前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员
落魄实习生6 小时前
AI应用-本地模型实现AI生成PPT(简易版)
python·ai·vue·ppt
AORO_BEIDOU6 小时前
单北斗+鸿蒙系统+国产芯片,遨游防爆手机自主可控“三保险”
华为·智能手机·harmonyos
博览鸿蒙7 小时前
鸿蒙操作系统(HarmonyOS)的应用开发入门
华为·harmonyos
ibrahim8 小时前
Llama 3.2 900亿参数视觉多模态大模型本地部署及案例展示
ai·大模型·llama·提示词
少年姜太公8 小时前
从零开始详解js中的this(下)
前端·javascript·程序员
凌虚8 小时前
Kubernetes APF(API 优先级和公平调度)简介
后端·程序员·kubernetes
探索云原生12 小时前
在 K8S 中创建 Pod 是如何使用到 GPU 的: nvidia device plugin 源码分析
ai·云原生·kubernetes·go·gpu
小华同学ai13 小时前
ShowDoc:Star12.3k,福利项目,个人小团队的在线文档“简单、易用、轻量化”还专门针对API文档、技术文档做了优化
前端·程序员·github