HarmonyOS NEXT AI基础视觉服务-人脸对比

案例描述

这是一个基于AI基础视觉服务实现的人脸对比案例,通过调用设备相册选择两张图片进行人脸特征比对,并展示相似度计算结果。

实现步骤:

1. 模块导入

// 导入功能模块
import { photoAccessHelper } from **********';
import { fileIo } from **********';
import { image } from **********';
import { faceComparator } from **********';
import { promptAction } from **********';
import { BusinessError } from **********';

2. 双图选择功能

// 创建通用图片选择方法
async chooseImage (): Promise<PixelMap> {
  const photoPicker = new photoAccessHelper.PhotoViewPicker();
  const photoResult = await photoPicker.select({
    MIMEType: photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE,
    maxSelectNumber: 1
  })
  // 获取选中图片文件句柄
  const fileSource = await fileIo.open(photoResult.photoUris[0], fileIo.OpenMode.READ_ONLY);
  // 生成像素图格式数据
  return await image.createImageSource(fileSource.fd).createPixelMap();
}

3. 图像处理流程

// 双图存储变量定义
@Local chooseImage1?: PixelMap
@Local chooseImage2?: PixelMap

// 图片点击处理逻辑
.onClick(async () => {
  const chooseImage = await this.chooseImage()
  this.chooseImage1 = chooseImage // 第一张图存储
})

.onClick(async () => {
  const chooseImage = await this.chooseImage()
  this.chooseImage2 = chooseImage // 第二张图存储
})

4. 人脸对比核心实现

// 配置双图对比参数
let visionInfo: faceComparator.VisionInfo = {
  pixelMap: this.chooseImage1,
};

let visionInfo1: faceComparator.VisionInfo = {
  pixelMap: this.chooseImage2,
};

// 执行人脸特征对比
faceComparator.compareFaces(visionInfo, visionInfo1)
  .then(result => {
    // 弹窗显示相似度结果
    promptAction.showDialog({ message: JSON.stringify(result) })
  })
  .catch((e: BusinessError) => {
    // 异常信息提示
    promptAction.showToast({ message: e.message })
  })

5. 检测结果展示

// 弹窗显示结构化对比结果
promptAction.showDialog({
  message: JSON.stringify({
    similarity: 0.92, // 相似度值示例
    isSamePerson: true // 是否为同一人
  })
})

落地代码:

1. UI组件定义

@Entry
@ComponentV2
struct FaceComparator {
  @Local chooseImage1?: PixelMap
  @Local chooseImage2?: PixelMap

2. 主功能方法

// 整合双图选择、特征对比完整逻辑
async chooseImage(): Promise<PixelMap> {
  // 完整选择逻辑...
}

3. 界面构建

build() {
  Column({ space: 20 }) {
    Image(this.chooseImage1)
      .onClick(/* 第一图选择 */)
    Image(this.chooseImage2)
      .onClick(/* 第二图选择 */)
    Button('人脸对比')
      .onClick(/* 触发对比逻辑 */)
  }
}

总结梳理:

核心点

  1. 需要申请相册访问权限
  2. 双图选择采用独立存储变量管理
  3. compareFaces接口返回相似度(0-1)及特征点数据
  4. 异常处理通过BusinessError捕获设备兼容性问题

完整代码

import { photoAccessHelper } from **********';
import { fileIo } from **********';
import { image } from **********';
import { faceComparator } from **********';
import { promptAction } from **********';
import { BusinessError } from **********';

@Entry
@ComponentV2
struct FaceComparator {
  @Local chooseImage1?: PixelMap
  @Local chooseImage2?: PixelMap

  async chooseImage (): Promise<PixelMap> {
    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();
    return chooseImage
  }

  build() {
    Column({ space: 20 }) {
      Image(this.chooseImage1)
        .alt($r('sys.media.save_button_picture'))
        .width(200)
        .aspectRatio(1)
        .onClick(async () => {
          const chooseImage = await this.chooseImage()
          this.chooseImage1 = chooseImage
        })
      Image(this.chooseImage2)
        .alt($r('sys.media.save_button_picture'))
        .width(200)
        .aspectRatio(1)
        .onClick(async () => {
          const chooseImage = await this.chooseImage()
          this.chooseImage2 = chooseImage
        })
      Button('人脸对比')
        .id('FaceComparatorButton')
        .onClick(async () => {
          if (this.chooseImage1 && this.chooseImage2) {
            let visionInfo: faceComparator.VisionInfo = {
              pixelMap: this.chooseImage1,
            };
            let visionInfo1: faceComparator.VisionInfo = {
              pixelMap: this.chooseImage2,
            };
            faceComparator.compareFaces(visionInfo, visionInfo1)
              .then(result => {
                promptAction.showDialog({ message: JSON.stringify(result) })
              })
              .catch((e: BusinessError) => {
                promptAction.showToast({ message: e.message })
              })
          }
        })
    }
    .padding(15)
    .height('100%')
    .width('100%')
  }
}

全部评论

相关推荐

04-02 21:47
真实工作体会⭐关于职场氛围:真的很爱滴滴🍊的氛围,大家都很亲近,组里人也会一起吃饭,而且经常被请客,嘻嘻。还有就是可能职场不是很大,整个二楼一半人我都认识了!我从最开始比较害羞到慢慢主动和别人搭话噜,感觉这次实习认识的小伙伴还是比较多的!&nbsp;⭐关于成长:mt和同事不管在日常工作上还是求职、职业规划上都给我提供了帮助,花时间辅导我面试、回答我幼稚的问题…这些都让我很感激!而且我也看到了他们的工作状态,对商分、数分有了一些理解。有时候和他们的交流给迷茫时期的我带来了一些慰藉。不过有时候组里忙起来可能就没人管我,所以我也狠狠摸鱼了&nbsp;⭐通勤不太方便是真的,上海职场离地铁站老远了,而且地理位置离上海哪个高校都远;晚上的饭菜也不是很好吃;茶水间只有开水……&nbsp;但是工位不挤,实习生独立工位这点还是蛮好嘟;而且楼下有健身房,有时间可以去跑个步哦~&nbsp;⭐很爱Mac&nbsp;book前置拍出来糊糊的感觉!宝子们可以试一下hhh,摸鱼不干别的就是自拍、养花、吃零食滴滴2025届春招正式启动【企业介绍】滴滴是全球卓越的移动出行科技平台,在亚太、拉美等市场提供网约车、出租车召车、代驾、顺风车等多元化出行服务,并运营车服、外卖、货运等业务。【招聘岗位】工程类、算法类、机器人类、数据类、产品类、安全技术类、效能管理类、运营类、职能类、供应链类、金融类【工作地点】北京、上海、杭州等【面向人群】25届应届毕业生,毕业时间在2024.9-2025.8内【招聘流程】简历投递:3月3日起笔试(仅部分岗位需要):3月9日起面试:3月上旬起offer发放:3月下旬起【内推链接】https://app.mokahr.com/campus-recruitment/didiglobal/96064?recommendCode=DScKP9qC#/jobs【内推码】DScKP9qC全流程跟进,投递的同学评论区留言,如LXC+后端,确保内推成功,方便后续跟进,春招加油! #实习#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#滴滴#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#内推#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#内推码#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务