目录

AI识图

场景介绍

AI识图是通过聚合OCR(Optical Character Recognition)、主体分割、实体识别、多目标识别等AI能力,提供场景化的文本识别、主体分割、识图搜索功能。AI识图功能主开关入口在基础控件API列表中,如果您接受AI识图默认的交互和功能,仅需使用基础控件提供的相关使能接口打开功能开关即可。该文档配套的API配合基础控件使用,主要满足您的定制诉求,帮助您完成AI识图功能交互上的细粒度控制,获取文本识别、图像分割等分析结果以便您进行扩展业务的开发,目前支持的基础控件范围包括Image、Video、XComponent。其中,配合Image控件可完成静态图片上的识图功能,配合Video控件可完成视频播放暂停帧的识图功能,配合XComponent可完成自定义渲染等场景下的图像的识图功能。

识图功能提供如下能力:

识图功能提供如下建议:

图1 AI识图示意图

约束与限制

开发步骤

  1. 将AI识图控件相关的类添加。

    import { visionImageAnalyzer } from '@kit.VisionKit';
    import { BusinessError } from '@kit.BasicServicesKit';
  2. 初始化VisionImageAnalyzerController对象。

    private visionImageAnalyzerController: visionImageAnalyzer.VisionImageAnalyzerController = new visionImageAnalyzer.VisionImageAnalyzerController();
    private isSupportImageAnalyzer: boolean = false;
  3. 判断设备是否支持AI识图相关功能,若支持,添加订阅事件和取消事件监听方法。

    aboutToAppear(): void {
      let supportTypes = this.visionImageAnalyzerController.getImageAnalyzerSupportTypes();
      if (supportTypes.length > 0) {
        this.isSupportImageAnalyzer = true;
        this.registerListener();
      }
    }
    
    registerListener(){
      this.visionImageAnalyzerController.on('imageAnalyzerVisibilityChange', (visibility: visionImageAnalyzer.ImageAnalyzerVisibility) => {
        console.info('DEMO_TAG', `imageAnalyzerVisibilityChange result: ${JSON.stringify(visibility)}`)
      });
      this.visionImageAnalyzerController.on('textAnalysis', (text: string) => {
        console.info('DEMO_TAG', `textAnalysis result: ${JSON.stringify(text)}`);
      });
      this.visionImageAnalyzerController.on('selectedTextChange', (selectedText: string) => {
        console.info('DEMO_TAG', `selectedTextChange result: ${JSON.stringify(selectedText)}`);
      });
      this.visionImageAnalyzerController.on('subjectAnalysis', (subjects: visionImageAnalyzer.Subject[]) => {
        console.info('DEMO_TAG', `subjectAnalysis result: ${JSON.stringify(subjects)}`);
      });
      this.visionImageAnalyzerController.on('selectedSubjectsChange', (subjects: visionImageAnalyzer.Subject[]) => {
        console.info('DEMO_TAG', `selectedSubjectsChange result: ${JSON.stringify(subjects)}`);
      });
      this.visionImageAnalyzerController.on('analyzerFailed', (error: BusinessError) => {
        console.error('DEMO_TAG', `analyzerFailed result: ${JSON.stringify(error)}`);
      });
    }
    
    aboutToDisappear(): void {
      this.visionImageAnalyzerController.off('imageAnalyzerVisibilityChange');
      this.visionImageAnalyzerController.off('textAnalysis');
      this.visionImageAnalyzerController.off('selectedTextChange');
      this.visionImageAnalyzerController.off('subjectAnalysis');
      this.visionImageAnalyzerController.off('selectedSubjectsChange');
      this.visionImageAnalyzerController.off('analyzerFailed');
    }
  4. 绑定VisionImageAnalyzerController对象,可以控制识图相关的交互。

    build() {
      Stack() {
        // 需要替换您自己的资源图片,存放在resources/base/media目录下,设置的types参数必须是上一步supportTypes里包含的。
        Image($r('app.media.img'), {
          types: [ImageAnalyzerType.TEXT, ImageAnalyzerType.SUBJECT, ImageAnalyzerType.OBJECT_LOOKUP],
          aiController: this.visionImageAnalyzerController
        })
          .width('100%')
          .height('100%')
          .enableAnalyzer(this.isSupportImageAnalyzer ? true: false)
          .objectFit(ImageFit.Contain)
      }.width('100%').height('100%')
    }

开发实例

[h2]Index.ets

import { visionImageAnalyzer } from '@kit.VisionKit';
import { BusinessError } from '@kit.BasicServicesKit';
@Entry
@Component
struct ImageDemo {
  private visionImageAnalyzerController: visionImageAnalyzer.VisionImageAnalyzerController = new visionImageAnalyzer.VisionImageAnalyzerController();
  private isSupportImageAnalyzer: boolean = false;
  aboutToAppear(): void {
    let supportTypes = this.visionImageAnalyzerController.getImageAnalyzerSupportTypes();
    if (supportTypes.length > 0) {
      this.isSupportImageAnalyzer = true;
      this.registerListener();
    }
  }

  registerListener(){
    this.visionImageAnalyzerController.on('imageAnalyzerVisibilityChange', (visibility: visionImageAnalyzer.ImageAnalyzerVisibility) => {
      console.info('DEMO_TAG', `imageAnalyzerVisibilityChange result: ${JSON.stringify(visibility)}`)
    });
    this.visionImageAnalyzerController.on('textAnalysis', (text: string) => {
      console.info('DEMO_TAG', `textAnalysis result: ${JSON.stringify(text)}`);
    });
    this.visionImageAnalyzerController.on('selectedTextChange', (selectedText: string) => {
      console.info('DEMO_TAG', `selectedTextChange result: ${JSON.stringify(selectedText)}`);
    });
    this.visionImageAnalyzerController.on('subjectAnalysis', (subjects: visionImageAnalyzer.Subject[]) => {
      console.info('DEMO_TAG', `subjectAnalysis result: ${JSON.stringify(subjects)}`);
    });
    this.visionImageAnalyzerController.on('selectedSubjectsChange', (subjects: visionImageAnalyzer.Subject[]) => {
      console.info('DEMO_TAG', `selectedSubjectsChange result: ${JSON.stringify(subjects)}`);
    });
    this.visionImageAnalyzerController.on('analyzerFailed', (error: BusinessError) => {
      console.error('DEMO_TAG', `analyzerFailed result: ${JSON.stringify(error)}`);
    });
  }

  aboutToDisappear(): void {
    this.visionImageAnalyzerController.off('imageAnalyzerVisibilityChange');
    this.visionImageAnalyzerController.off('textAnalysis');
    this.visionImageAnalyzerController.off('selectedTextChange');
    this.visionImageAnalyzerController.off('subjectAnalysis');
    this.visionImageAnalyzerController.off('selectedSubjectsChange');
    this.visionImageAnalyzerController.off('analyzerFailed');
  }

  build() {
    Stack() {
      Image($r('app.media.img'), {
        types: [ImageAnalyzerType.TEXT, ImageAnalyzerType.SUBJECT, ImageAnalyzerType.OBJECT_LOOKUP],
        aiController: this.visionImageAnalyzerController
      })
        .width('100%')
        .height('100%')
        .enableAnalyzer(this.isSupportImageAnalyzer ? true : false)
        .objectFit(ImageFit.Contain)
    }.width('100%').height('100%')
  }
}