鸿蒙应用开发之基础视觉服务文字识别基础

仿佛云烟
发布于 2025-6-28 17:04
浏览
0收藏

一、工具


鸿蒙应用开发之基础视觉服务文字识别基础-鸿蒙开发者社区

DevEco Studio


二、项目介绍


开发步骤
在使用通用文字识别时,将实现文字识别的相关的类添加至工程。
import { textRecognition } from '@kit.CoreVisionKit';
简单配置页面的布局,并在Button组件添加点击事件,拉起图库,选择图片。
Button('选择图片')
  .type(ButtonType.Capsule)
  .fontColor(Color.White)
  .alignSelf(ItemAlign.Center)
  .width('80%')
  .margin(10)
  .onClick(() => {
    // 拉起图库,获取图片资源
    this.selectImage();
  })
通过图库获取图片资源,将图片转换为PixelMap,并添加初始化和释放方法。
async aboutToAppear(): Promise {
  const initResult = await textRecognition.init();
  ​​​hilog.info​​​(0x0000, 'OCRDemo', ​​OCR service initialization result:${initResult}​​​);
}


async aboutToDisappear(): Promise {
  await textRecognition.release();
  ​​​hilog.info​​​(0x0000, 'OCRDemo', 'OCR service released successfully');
}


private async selectImage() {
  let uri = await this.openPhoto();
  if (uri === undefined) {
    hilog.error(0x0000, 'OCRDemo', "Failed to get uri.");
    return;
  }
  this.loadImage(uri);
}


private openPhoto(): Promise {
  return new Promise((resolve) => {
    let photoPicker: photoAccessHelper.PhotoViewPicker = new photoAccessHelper.PhotoViewPicker();
    photoPicker.select({
      MIMEType: photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE,
      maxSelectNumber: 1
    }).then((res: photoAccessHelper.PhotoSelectResult) => {
      resolve(res.photoUris[0]);
    }).catch((err: BusinessError) => {
      hilog.error(0x0000, 'OCRDemo', ​​​Failed to get photo image uri. code:${err.code},message:${err.message}​​​);
      resolve('');
    })
  })
}


private loadImage(name: string) {
  setTimeout(async () => {
    let imageSource: image.ImageSource | undefined = undefined;
    let fileSource = await fileIo.open(name, fileIo.OpenMode.READ_ONLY);
    imageSource = image.createImageSource(fileSource.fd);
    this.chooseImage = await imageSource.createPixelMap();
  }, 100)
}
实例化VisionInfo对象,并传入待检测图片的PixelMap。
VisionInfo为待OCR检测识别的入参项,目前仅支持PixelMap类型的视觉信息。
let visionInfo: textRecognition.VisionInfo = {
  pixelMap: this.chooseImage
};
配置通用文本识别的配置项TextRecognitionConfiguration,用于配置是否支持朝向检测。
let textConfiguration: textRecognition.TextRecognitionConfiguration = {
  isDirectionDetectionSupported: false
};
调用textRecognition的recognizeText接口,对识别到的结果进行处理。
当调用成功时,获取文字识别的结果;调用失败时,将返回对应错误码。


recognizeText接口提供了三种调用形式,当前以其中一种作为示例,其他方式可参考API文档。
textRecognition.recognizeText(visionInfo, textConfiguration)
  .then((data: textRecognition.TextRecognitionResult) => {
    // 识别成功,获取对应的结果
    let recognitionString = JSON.stringify(data);
    ​​​hilog.info​​​(0x0000, 'OCRDemo', ​​Succeeded in recognizing text:${recognitionString}​​​);
    // 将结果更新到Text中显示
    this.dataValues = data.value;
  })
  .catch((error: BusinessError) => {
    hilog.error(0x0000, 'OCRDemo', ​​​Failed to recognize text. Code: ${error.code}, message: ${error.message}​​​);
    this.dataValues = ​​​Error: ${error.message}​​​;
  });
开发实例
点击按钮,识别一张图片的文字内容,并通过日志打印。
import { textRecognition } from '@kit.CoreVisionKit'
import { image } from '@kit.ImageKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { fileIo } from '@kit.CoreFileKit';
import { photoAccessHelper } from '@kit.MediaLibraryKit';


@Entry
@Component
struct Index {
  private imageSource: image.ImageSource | undefined = undefined;
  @State chooseImage: PixelMap | undefined = undefined;
  @State dataValues: string = '';


{
    const initResult = await textRecognition.init();
    ​​​hilog.info​​​(0x0000, 'OCRDemo', ​​OCR service initialization result:${initResult}​​​);
  }


{
    await textRecognition.release();
    ​​​hilog.info​​​(0x0000, 'OCRDemo', 'OCR service released successfully');
  }


  build() {
    Column() {
      Image(this.chooseImage)
        .objectFit(ImageFit.Fill)
        .height('60%')


      Text(this.dataValues)
        .copyOption(CopyOptions.LocalDevice)
        .height('15%')
        .margin(10)
        .width('60%')


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


      Button('开始识别')
        .type(ButtonType.Capsule)
        .fontColor(Color.White)
        .alignSelf(ItemAlign.Center)
        .width('80%')
        .margin(10)
        .onClick(async () => {
          this.textRecognitionTest();
        })
    }
    .width('100%')
    .height('100%')
    .justifyContent(FlexAlign.Center)
  }


  private textRecognitionTest() {
    if (!this.chooseImage) {
      return;
    }
    // 调用文本识别接口
    let visionInfo: textRecognition.VisionInfo = {
      pixelMap: this.chooseImage
    };
    let textConfiguration: textRecognition.TextRecognitionConfiguration = {
      isDirectionDetectionSupported: false
    };
    textRecognition.recognizeText(visionInfo, textConfiguration)
      .then((data: textRecognition.TextRecognitionResult) => {
        // 识别成功,获取对应的结果
        let recognitionString = JSON.stringify(data);
        ​​​hilog.info​​​(0x0000, 'OCRDemo', ​​Succeeded in recognizing text:${recognitionString}​​​);
        // 将结果更新到Text中显示
        this.dataValues = data.value;
      })
      .catch((error: BusinessError) => {
        hilog.error(0x0000, 'OCRDemo', ​​​Failed to recognize text. Code: ${error.code}, message: ${error.message}​​​);
        this.dataValues = ​​​Error: ${error.message}​​​;
      });
  }


  private async selectImage() {
    let uri = await this.openPhoto();
    if (uri === undefined) {
      hilog.error(0x0000, 'OCRDemo', "Failed to get uri.");
      return;
    }
    this.loadImage(uri);
  }


{
    return new Promise((resolve) => {
      let photoPicker: photoAccessHelper.PhotoViewPicker = new photoAccessHelper.PhotoViewPicker();
      photoPicker.select({
        MIMEType: photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE,
        maxSelectNumber: 1
      }).then((res: photoAccessHelper.PhotoSelectResult) => {
        resolve(res.photoUris[0]);
      }).catch((err: BusinessError) => {
        hilog.error(0x0000, 'OCRDemo', ​​​Failed to get photo image uri. Code:${err.code},message:${err.message}​​​);
        resolve('');
      })
    })
  }


  private loadImage(name: string) {
    setTimeout(async () => {
      let fileSource = await fileIo.open(name, fileIo.OpenMode.READ_ONLY);
      this.imageSource = image.createImageSource(fileSource.fd);
      this.chooseImage = await this.imageSource.createPixelMap();
    }, 100)
  }
}

收藏
回复
举报
回复
    相关推荐