案例描述

这是一个基于AI基础视觉服务实现的人脸识别案例,通过调用设备相册选择图片后检测图像中的人脸信息并展示结构化识别结果。

实现步骤:

1. 模块导入

// 导入功能模块
import { photoAccessHelper } from '@kit.MediaLibraryKit';
import { fileIo } from '@kit.CoreFileKit';
import { image } from '@kit.ImageKit';
import { faceDetector } from '@kit.CoreVisionKit';
import { promptAction } from '@kit.ArkUI';
import { JSON } from '@kit.ArkTS';

2. 相册选择功能

// 创建相册选择器实例
const photoPicker: photoAccessHelper.PhotoViewPicker = new photoAccessHelper.PhotoViewPicker();
// 设置选择参数
const photoResult = await photoPicker.select({
  MIMEType: photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE,
  maxSelectNumber: 1
})
// 获取选中图片URI
const photoUri = photoResult.photoUris[0]

3. 图像处理流程

// 打开图片文件句柄
const fileSource = await fileIo.open(photoUri, fileIo.OpenMode.READ_ONLY);
// 创建图像数据源
const imageSource = image.createImageSource(fileSource.fd);
// 生成像素图格式数据
const chooseImage = await imageSource.createPixelMap();

4. 人脸检测核心实现

// 初始化人脸检测器
faceDetector.init();
// 配置视觉识别参数
const visionInfo: faceDetector.VisionInfo = {
  pixelMap: chooseImage
};
// 执行人脸检测
const visionResult = await faceDetector.detect(visionInfo)
// 是否包含人脸
this.isFace = visionResult.length > 0

5. 检测结果展示

// 弹窗显示结构化检测结果
promptAction.showDialog({
  message: JSON.stringify(visionResult)
})

落地代码:

1. UI组件定义

@Entry
@ComponentV2
struct FaceDetector {
  @Local isFace: boolean = false

2. 主功能方法

async checkFace() {
  // 整合相册选择、图像处理、人脸检测完整逻辑
}

3. 界面构建

build() {
  Column() {
    Button('选择相册 人脸识别')
      .onClick(() => {
        this.checkFace()
      })
  }
  .height('100%')
  .width('100%')
}

总结梳理:

核心点

  1. 相册访问需要用户授权权限
  2. 图像处理需通过MediaLibraryKit和ImageKit协作完成
  3. 检测结果包含人脸位置、特征点等结构化数据

完整代码

import { photoAccessHelper } from '@kit.MediaLibraryKit';
import { fileIo } from '@kit.CoreFileKit';
import { image } from '@kit.ImageKit';
import { faceDetector } from '@kit.CoreVisionKit';
import { promptAction } from '@kit.ArkUI';
import { JSON } from '@kit.ArkTS';

@Entry
@ComponentV2
struct FaceDetector {
  @Local isFace: boolean = false

  async checkFace() {
    const photoPicker: photoAccessHelper.PhotoViewPicker = new photoAccessHelper.PhotoViewPicker();
    const photoResult = await photoPicker.select({
      MIMEType: photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE,
      maxSelectNumber: 1
    })
    const photoUri = photoResult.photoUris[0]
    
    const fileSource = await fileIo.open(photoUri, fileIo.OpenMode.READ_ONLY);
    const imageSource = image.createImageSource(fileSource.fd);
    const chooseImage = await imageSource.createPixelMap();

    faceDetector.init();
    const visionInfo: faceDetector.VisionInfo = {
      pixelMap: chooseImage
    };
    const visionResult = await faceDetector.detect(visionInfo)
    this.isFace = visionResult.length > 0
    
    promptAction.showDialog({
      message: JSON.stringify(visionResult)
    })
  }

  build() {
    Column() {
      Button('选择相册 人脸识别')
        .onClick(() => {
          this.checkFace()
        })
    }
    .height('100%')
    .width('100%')
  }
}

咆哮的萝卜_cYtbpB
1 声望0 粉丝